Contact Form 7 - Custom Validation Contact Form 7 - Custom Validation wordpress wordpress

Contact Form 7 - Custom Validation


From contactform7.com on Custom Validation → Validation as a Filter:

In Contact Form 7, a user-input validation is implemented as a filterfunction. The filter hook used for the validation varies depending onthe type of form-tag and is determined as: wpcf7_validate_ + {type ofthe form-tag}. So, for text form-tags, the filter hookwpcf7_validate_text is used. Likewise, wpcf7_validate_email* is usedfor email* form-tags.

Let’s say you have the following email fields in a form:

  Email:         [email* your-email]  Confirm email: [email* your-email-confirm]

The following listing shows code that verifies whether the two fieldshave identical values.

add_filter('wpcf7_validate_email*', 'custom_email_confirmation_validation_filter', 20, 2);function custom_email_confirmation_validation_filter($result, $tag) {    $tag = new WPCF7_FormTag($tag);    if ('your-email-confirm' == $tag->name) {        $your_email = isset($_POST['your-email']) ? trim($_POST['your-email']) : '';        $your_email_confirm = isset($_POST['your-email-confirm']) ? trim($_POST['your-email-confirm']) : '';        if ($your_email != $your_email_confirm) {            $result->invalidate($tag, "Are you sure this is the correct address?");        }    }    return $result;}

Two parameters will be passed to the filter function: $result and$tag. $result is an instance of WPCF7_Validation class that manages asequence of validation processes. $tag is an associative arraycomposed of given form-tag components; as you saw in the previousrecipe, you can use WPCF7_FormTag class to handle this type of data.

Look through the inside of the filter function. First, check the nameof the form-tag to ensure the validation is applied only to thespecific field (your-email-confirm).

The two email field values are then compared, and if they don’t match,$result->invalidate() will be called. You need to pass two parametersto the invalidate() method: the first parameter should be the $tagvariable, and the second parameter is the validation error messagethat you want the field to display.

Lastly, don’t forget to return the $result.


I had a similar issue for validating name fields, I added the following code in my functions.php, you could customize it by changing the regex

function my_wpcf7_validate_text( $result, $tag ) {    $type = $tag['type'];    $name = $tag['name'];    $value = $_POST[$name] ;    if ( strpos( $name , 'name' ) !== false ){        $regex = '/^[a-zA-Z]+$/';        $Valid = preg_match($regex,  $value, $matches );        if ( $Valid > 0 ) {        } else {            $result->invalidate( $tag, wpcf7_get_message( 'invalid_name' ) );        }    }    return $result;}add_filter( 'wpcf7_validate_text*', 'my_wpcf7_validate_text' , 10, 2 );add_filter( 'wpcf7_messages', 'mywpcf7_text_messages' );function mywpcf7_text_messages( $messages ) {    return array_merge( $messages, array(        'invalid_name' => array(            'description' => __( "Name is invalid", 'contact-form-7' ),            'default' => __( 'Name seems invalid.', 'contact-form-7' )        )    ));}


// Add custom validation for CF7 form fields

function is_company_email($email){ // Check against list of common public email providers & return true if the email provided *doesn't* match one of them        if(                preg_match('/@gmail.com/i', $email) ||                preg_match('/@hotmail.com/i', $email) ||                preg_match('/@live.com/i', $email) ||                preg_match('/@msn.com/i', $email) ||                preg_match('/@aol.com/i', $email) ||                preg_match('/@yahoo.com/i', $email) ||                preg_match('/@inbox.com/i', $email) ||                preg_match('/@gmx.com/i', $email) ||                preg_match('/@me.com/i', $email)        ){                return false; // It's a publicly available email address        }else{                return true; // It's probably a company email address        }}function your_validation_filter_func($result,$tag){        $type = $tag['type'];        $name = $tag['name'];        if('yourid' == $value){ // Only apply to fields with the form field name of "company-email"                $the_value = $_POST[$name];                if(!is_company_email($the_value)){ // Isn't a company email address (it matched the list of free email providers)                        $result['valid'] = false;                        $result->invalidate( $tag, wpcf7_get_message( 'invalid_email' ));                }        }        return $result;} add_filter( 'wpcf7_validate_email', 'your_validation_filter_func', 10, 2 ); // Email field or contact number field  add_filter( 'wpcf7_validate_email*', 'your_validation_filter_func', 10, 2 );     // Req. Email field or contact number