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 ofWPCF7_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 useWPCF7_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 theinvalidate()
method: the first parameter should be the$tag
variable, 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