
There is a lot of confusion around the Internet on how to properly configure action hooks in Contact Form 7. A few days ago I spent a few hours developing a plugin to customize and enable some intelligent detection of the forms data and I got it to work. From what I’ve seen around the Internet, there is no official documentation and most of the forum questions and threads are not answered so in this developers’ tutorial I’ll try to answer all these questions here.
This post is not dedicated to solve errors like “Emails not getting sent”, “How to increase textbox size” and so on, that’s a server missconfiguration or some CSS code, here we’ll just go through the Contact Form 7 action hook provided and how to code your own WordPress plugin to improve WPCF7. I’ll start with the basics so everyone can follow this and then move to more complex features:
Creating a WordPress plugin
You need to know PHP code and have access to the files in your server. Then, create a .php file and copy-paste this:
/*
Plugin Name: Contact Form 7 special functionalities
Plugin URI: http://xaviesteve.com/
Description:
Author: Xavi Esteve
Version: 0.1b
Author URI: http://xaviesteve.com/
*/
function wpcf7_do_something (&$WPCF7_ContactForm) {
// Our code will go here
}
add_action("wpcf7_before_send_mail", "wpcf7_do_something");
Change the plugin name and author and we now have a simple plugin that creates an action hook into CF7. Upload this file to your /wp-content/plugins/ folder and enable it in the WordPress Dashboard.
Note: the & symbol in the function parameter references the object so that any change done inside the hook will also be reflected later in CF7.
Understanding the CF7 object
One of the main issues with users having problems with Contact Form 7s’ hook is that they don’t understand how the object works, here’s a full example of the object for your reference. If you look at it closely you’ll see how it starts being a PHP object but then those objects are arrays so you always need to call the CF7 object like object->object['array']. Also, returning the object at the end of the function is not required but a good practice.
WPCF7_ContactForm Object
(
[initial] =>
[id] => 577
[title] => Home page form
[unit_tag] =>
[responses_count] => 0
[scanned_form_tags] => Array
(
[0] => Array
(
[type] => text*
[name] => name
[options] => Array
(
[0] => id:firstfield
)
[raw_values] => Array
(
)
[values] => Array
(
)
[pipes] => WPCF7_Pipes Object
(
[pipes] => Array
(
)
)
[labels] => Array
(
)
[attr] =>
[content] =>
)
[1] => Array
(
[type] => email
[name] => email
[options] => Array
(
)
[raw_values] => Array
(
)
[values] => Array
(
)
[pipes] => WPCF7_Pipes Object
(
[pipes] => Array
(
)
)
[labels] => Array
(
)
[attr] =>
[content] =>
)
[2] => Array
(
[type] => text*
[name] => phone
[options] => Array
(
)
[raw_values] => Array
(
)
[values] => Array
(
)
[pipes] => WPCF7_Pipes Object
(
[pipes] => Array
(
)
)
[labels] => Array
(
)
[attr] =>
[content] =>
)
[3] => Array
(
[type] => textarea
[name] => message
[options] => Array
(
)
[raw_values] => Array
(
)
[values] => Array
(
)
[pipes] => WPCF7_Pipes Object
(
[pipes] => Array
(
)
)
[labels] => Array
(
)
[attr] =>
[content] =>
)
[4] => Array
(
[type] => submit
[name] =>
[options] => Array
(
[0] => class:button
)
[raw_values] => Array
(
[0] => Send
)
[values] => Array
(
[0] => Send
)
[pipes] => WPCF7_Pipes Object
(
[pipes] => Array
(
[0] => WPCF7_Pipe Object
(
[before] => Send
[after] => Send
)
)
)
[labels] => Array
(
[0] => Send
)
[attr] =>
[content] =>
)
)
[posted_data] => Array
(
[_wpcf7] => 577
[_wpcf7_version] => 3.2.1
[_wpcf7_unit_tag] => wpcf7-f577-p2-o1
[_wpnonce] => 8dabc14d71
[name] => John Moore
[email] => johnmoore@gmail.com
[phone] => 07912345678
[message] => I am interested to know more about your company
[_wpcf7_is_ajax_call] => 1
)
[uploaded_files] => Array
(
)
[skip_mail] =>
[form] =>
Name
[text* name]
Email
[email email]
Phone
[text* phone]
Enquiry
[textarea message]
[submit class:button "Send"]
[mail] => Array
(
[subject] => MyWebsite - New form submission
[sender] => MyWebsite <noreply@xaviesteve.com>
[body] =>
[recipient] => Xavi <xavi@gmail.com>
[additional_headers] =>
[attachments] =>
[use_html] => 1
)
[mail_2] => Array
(
[active] =>
[subject] =>
[sender] =>
[body] =>
[recipient] =>
[additional_headers] =>
[attachments] =>
[use_html] =>
)
[messages] => Array
(
[mail_sent_ok] => Your message was sent successfully. We will call you soon.
[mail_sent_ng] => Failed to send your message. Please try later or contact administrator by other way.
[akismet_says_spam] => Failed to send your message. Please try later or contact administrator by other way.
[validation_error] => Please fill in the required fields and submit the form again.
[accept_terms] => Please accept the terms to proceed.
[invalid_email] => Email address seems invalid.
[invalid_required] => Please fill the required field.
[captcha_not_match] => Your entered code is incorrect.
[upload_failed] => Failed to upload file.
[upload_file_type_invalid] => This file type is not allowed.
[upload_file_too_large] => This file is too large.
[upload_failed_php_error] => Failed to upload file. Error occurred.
[quiz_answer_not_correct] => Your answer is not correct.
)
[additional_settings] =>
[submit_time] => 1348136521.36
[ip] => 82.18.147.15
)
Contact Form 7 action hook examples
So that’s pretty much it, creating a WordPress action hook to the wpcf7_before_send_mail and understanding how to traverse the object should allow any midweight PHP developer to do pretty much anything with it. Let’s see some examples, to use them get the piece of code at the top of the article and put it inside.
Reading a posted value in the form with PHP
$firstname = $WPCF7_ContactForm->posted_data['firstname'];
Having multiple email recipients
No need to code any PHP for this, just go to edit the form through the WordPress Dashboard and add different emails separated by commas:
John <john@gmail.com>,Mark <mark@gmail.com>
Changing email recipient dynamically depending on code
if ($WPCF7_ContactForm->posted_data['radiobuttonname'] == "Yes") {
$WPCF7_ContactForm->mail['recipient'] = "John <john@gmail.com>";
}else{
$WPCF7_ContactForm->mail['recipient'] = "Mark <mark@gmail.com>";
}
Avoiding CF7 from sending email
Change the skip_mail value to true.
$wpcf7_data->skip_mail = true;
Redirecting someone to a different page depending on submitted data
The additional_settings is what we need to change. Here’s a self explanatory example:
if ($foo == "provider") {
$wpcf7_data->additional_settings = "on_sent_ok: "location.replace('http://xaviesteve.com//provider/');"";
}else{
$wpcf7_data->additional_settings = "on_sent_ok: "location.replace('http://xaviesteve.com//client/');"";
}
Note: My WordPress removed some code when publishing it, remember to add backward slashes to the inner double quotes in the code above.
Adding more text in the sent email
For example, we can add the users’ IP address:
$wpcf7_data->mail['body'] .= '<p>IP Address: '.$_SERVER['REMOTE_ADDR'].'</p>';
Get page from which form was submitted
$pagesubmitted = $_SERVER['HTTP_REFERER'];
That’s it!
You should now have total control over the Contact Form 7 plugin. For any other examples or questions on the code please feel free to comment below, for other issues please visit the Contact Form 7 official WordPress forum.
Comments (13)
Awesome post dude. You are going really well in blogging. I like it really much. Keep up the good work !
October 1st, 2012 at 08:03Thanks for this, very helpful.
October 30th, 2012 at 19:36Thanks, just what I was looking for.
Just one question, is it possible to output:
$wpcf7_data->mail['body']
but then replace the variables with the posted ones?
November 28th, 2012 at 17:18in other words, is it possible to get the mail body of the mail 1 or 2 being send?
Hello there,
thanks for the interesting post. It gave me a lot of indication and I was wondering if you can perhaps help me to encapsulate the name of the sender in a session variable I can recall in the subsequent Thank you page.
What I did in my function.php code is
function get_contact_form_details($cf7){
$_SESSION['cf7data'] = $cf7->posted_data;
return false;
}
add_action( ‘wpcf7_before_send_mail’, ‘get_contact_form_details’ );
whereas in the thank you page I have this code
Hi,
but nothing appear on screen, like the value has never been stored. Any help?
Thanks
December 17th, 2012 at 14:33Hi Andrea,
I would suggest you to post your question here: http://wordpress.org/support/plugin/contact-form-7
The author of the plugin itself and thousands of developers will be able to help you faster than myself (I’m quite busy these days).
Cheers
December 17th, 2012 at 14:52Your post really helped me to add contact form 7 name and email to my email marketing site. Thanks for writing this post.
February 10th, 2013 at 07:54Thanks for this useful information.
I used your plugin but had problems getting all your snippets of code to work.
Then I realised the ones that use:
$WPCF7_ContactForm->worked, and those that use$wpcf7_data->didn’t work.When I substituted the former for the latter, the other snippets worked as well. Wonderful!
Tony
February 23rd, 2013 at 20:35I Use Contact form 7
add_action('wpcf7_before_send_mail','save_to_the_database'); function save_to_the_database($cf7) { global $wpdb; //declare your varialbes, for example: $id = $cf7->posted_data["id"]; $first_name = $cf7->posted_data["first-name"]; $email_txt = $cf7->posted_data["email-id"]; //echo $ticket_id; $result = $wpdb->get_results( "INSERT INTO databasename (`id`, `firstname`, `emailid`) VALUES ('$id','$first_name','$email_txt')"); }Its work fine , also insert data into database.
Now I have Three Contact Form,
contact-form-7 id="411"contact-form-7 id="412"andcontact-form-7 id="413"How can I trigger
April 3rd, 2013 at 13:34Just perfect, thanks !
April 23rd, 2013 at 10:05Sorry but I’m new to to programming.
April 26th, 2013 at 21:30Where exactly will I add this codes?
Thanks Xavi this was a huge help. I spent a while searching and this is exactly what I needed.
May 20th, 2013 at 18:27Thank you, exactly that’s what i’ve been searching for :)
June 18th, 2013 at 12:40Thank you SO much for this, I’ve been searching everywhere for this. Fantastic post.
June 18th, 2013 at 18:43