In this guide, you will learn how to create custom validation in CF7. This guide is also the solution for programmatically making fields required.

Contact Form 7 uses the validation server-side, which means we need to hook into the PHP functions/filters in order to create custom validations.

In my scenario, I have a select field called type-of-enquiry with 2 options, Sales and Support.

If sales is selected, I am showing and validating country(select) and state(select), if support is selected, I am showing product(select), telephone(tel) and subject(text).

We start off by creating a custom file in our theme or child theme, I’ve named mine “cf7-custom-validation.php” and saved it in a custom folder called “inc” and we import it in our functions.php file using:

functions.php

require_once( get_template_directory() . '/inc/cf7-custom-validation.php' );
Code language: PHP (php)

cf7-custom-validation.php

<?php // Block direct access to the file defined( 'ABSPATH' ) || exit; /** * Each field type has its own validation filter, * so we create a function for each type */ add_filter( 'wpcf7_validate_select', 'wpharvest_custom_validation_select', 20, 2 ); add_filter( 'wpcf7_validate_tel', 'wpharvest_custom_validation_tel', 20, 2 ); add_filter( 'wpcf7_validate_text', 'wpharvest_custom_validation_text', 20, 2 ); /** * Go through all the select fields */ function wpharvest_custom_validation_select( $result, $tag ) { // Get the type of enquiry from the dropdown $enquiryType = isset( $_POST['type-of-enquiry'] ) ? trim( $_POST['type-of-enquiry'] ) : ''; // If selection is Sales if( $enquiryType == 'Sales' ){ // If current validation is your-country and is empty then invalidate field if ( 'your-country' == $tag->name && empty( $_POST['your-country'] ) ) { $result->invalidate($tag, "This field is required."); } // We can also make validation dependent on other fields // If current validation is state, the country selected is United States and is empty then invalidate field if ( 'state' == $tag->name && trim( $_POST['your-country'] ) == 'United States' && empty( $_POST['state'] ) ) { $result->invalidate($tag, "This field is required."); } } // If selection is Support if( $enquiryType == 'Support' ){ // If current validation is product and is empty then invalidate field if ( 'product' == $tag->name && empty( $_POST['product'] ) ) { $result->invalidate($tag, "This field is required."); } } return $result; } /** * Go through all the tel fields */ function wpharvest_custom_validation_tel( $result, $tag ) { // Get the type of enquiry from the dropdown $enquiryType = isset( $_POST['type-of-enquiry'] ) ? trim( $_POST['type-of-enquiry'] ) : ''; // If selection is Support if( $enquiryType == 'Support' ){ // If current validation is telephone and is empty then invalidate field if ( 'telephone' == $tag->name && empty( $_POST['telephone'] ) ) { $result->invalidate($tag, "This field is required."); } } return $result; } /** * Go through all the text fields */ function wpharvest_custom_validation_text( $result, $tag ) { // Get the type of enquiry from the dropdown $enquiryType = isset( $_POST['type-of-enquiry'] ) ? trim( $_POST['type-of-enquiry'] ) : ''; // If selection is Support if( $enquiryType == 'Support' ){ // If current validation is subject and is empty then invalidate field if ( 'subject' == $tag->name && empty( $_POST['subject'] ) ) { $result->invalidate($tag, "This field is required."); } } return $result; }
Code language: HTML, XML (xml)

Published by Dragos Micu

WooCommerce

2 Comments

  1. You can also try one plugin that allow to set custom validation message for every field.
    Plugin URL: https://wordpress.org/plugins/cf7-custom-validation-message/
    Thanks for your code it works as well..

    Reply
  2. Hey Dragos,

    I have an issue that´s similar but not as easy as that the “normal” fields.

    I have an issue with the file fields.

    Bild-Upload*
    [file* lh-img filetypes:jpg|png|jpeg class:lh-img-input]
    Dateien durchsuchen

    Video-Upload*
    [file* lh-video filetypes:mp4 class:lh-video-input]
    Dateien durchsuchen

    That´s them, so you can see there is one for a video file and one for an image.

    So when you upload a file to “lh-img”, the field “lh-video” shouldn´t be required anymore, same goes for the reversed case (video uploaded, img not required).

    Your code works for fields like mail or text, but the file fields are another thing there and I couldn´t figure it out. Maybe someone has the same Problem and that would help them as well.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

drueckglueck casino se resena tragamonedas mas pagadoras tragaperras online dragon s luck deluxe noticias juegos y casinos la emoci n 5a1ae del azar descargar juegos de los casinos poker casinos tragamonedas 660e gratis sin descargar sin registrarse la mejora para tu divertimento es casinos de sorteos crown coins casino apuestas king neptuno el 426eb casino en l nea para vivir la experiencia del juego juego la autoprohibici n en casinos c mo evitar la dependencia y proteger tu 02a8016d finanzas guias 1f0ea el casino que ofrece muy poco un an lisis cr tico de la experiencia del jugador juegos con cartas de casino resena 1win argentina comparativa apuestas deportivas microgaming high 5 silver oak casino resena casino descubre el mapa del casino golden grin en payday 2 un edb1ea2 destino de juego emocionante apuestas la experiencia del casino en 26ebcc gta v una vista desde la argentina blog 8ee002 casinos sin dep sito en m xico la opci n perfecta para los jugadores casino edb1ea2 vestimenta tem tica en el casino desaf a la norma y divi rtete reportajes el jefe de la acci n un vistazo al rol del jefe en 1f843197 sala de sportsbook en casinos andorra vs inglaterra apuestas y pronosticos 07 06 2025 awg hottest bachelor guias f0ea1b c mo registrarte en jvspin desde m xico pasos f ciles y seguros bonos la ordenaci n del juego en 9143bf casinos online en espa a un enfoque responsable