WordPress Contact Form 7 Hook Unofficial Developer Documentation and Examples

wordpress contact form 7 plugin action hook

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.

About the author
Xavi Esteve

Published on September 21, 2012 by , a UX Designer and a Front-End Developer with more than 10 years of experience. I am currently working for Fitbug as a Front-end Developer in London UK and enjoy contributing to the Open Source community, sharing interesting links in Twitter and blogging about related topics.

Comments (13)

  • Avatar ivandurham

    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:03
  • Avatar Seth Etter

    Thanks for this, very helpful.

    October 30th, 2012 at 19:36
  • Avatar Jonas

    Thanks, 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?
    in other words, is it possible to get the mail body of the mail 1 or 2 being send?

    November 28th, 2012 at 17:18
  • Avatar Andrea Moro

    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:33
  • Avatar Xavi

    Hi 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:52
  • Avatar Cube3x

    Your 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:54
  • Avatar tonyb

    Thanks 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:35
  • Avatar Sanket Vyas

    I 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" and contact-form-7 id="413"

    How can I trigger

    If id of form = 411, Insert into DB -> Table1
    If id of form = 412, Insert into DB -> Table2
    If id of form = 413, Insert into DB -> Table3
    April 3rd, 2013 at 13:34
  • Avatar Javayim

    Just perfect, thanks !

    April 23rd, 2013 at 10:05
  • Avatar MikeS

    Sorry but I’m new to to programming.
    Where exactly will I add this codes?

    April 26th, 2013 at 21:30
  • Avatar MarcelM

    Thanks Xavi this was a huge help. I spent a while searching and this is exactly what I needed.

    May 20th, 2013 at 18:27
  • Avatar Krony

    Thank you, exactly that’s what i’ve been searching for :)

    June 18th, 2013 at 12:40
  • Avatar Y-Love

    Thank you SO much for this, I’ve been searching everywhere for this. Fantastic post.

    June 18th, 2013 at 18:43

More posts

Back to top