Условные обязательные поля для WordPress Contact Form 7

1 июл. 2015 г., 18:51:27
Просмотры: 22.4K
Голосов: 1

Я понимаю, что этот вопрос может считаться офтопиком, но я не уверен, где еще его задать, так как он касается как WordPress, так и плагина Contact Form 7. Если вы знаете, где лучше разместить этот вопрос, пожалуйста, подскажите.


Я пытаюсь реализовать условно обязательное поле. У меня есть код для работы, но, кажется, я запутался и нуждаюсь в стороннем взгляде.

Мне нужно, чтобы при выборе checkbox со значением "да" выпадающий список рядом с ним становился обязательным, а если выбрано "нет" - необязательным.

Вот что у меня есть в форме в виде шорткода на бэкенде:

Если вы заказывали у нас ранее, работаете ли вы с одним из наших внешних торговых представителей?
[checkbox* check-sales id:checksales "Да" "Нет"]

Если вы выбрали "Да", с каким представителем вы обычно работаете?
[select sales-rep id:sales include_blank "Марла" "Лиза" "Венди" "Стейси" "Николь" "Линда" "Джоди" "Жизель" "Рэй" "Крейг"]

[submit]

А вот пример PHP-кода, который добавляется в файл functions.php:

function is_gmail($email) {  
      if(substr($email, -10) == '@gmail.com') {  
           return true;  
      } else {  
           return false;  
      };  
 };  
 function custom_email_validation_filter($result, $tag) {  
      $type = $tag['type'];  
      $name = $tag['name'];  
      if($name == 'your-email') { // Применяется только к полям с именем "your-email"  
           $the_value = $_POST[$name];  
           if(!is_gmail($the_value)){  
                $result['valid'] = false;  
                $result['reason'][$name] = 'Это не gmail адрес!'; // Сообщение об ошибке  
           };  
      };  
       return $result;  
 };  
 add_filter('wpcf7_validate_email','custom_email_validation_filter', 10, 2); // Поле Email  
 add_filter('wpcf7_validate_email*', 'custom_email_validation_filter', 10, 2); // Обязательное поле Email 

Я понимаю, что этот код предназначен для проверки email. Однако я не могу разобраться, что нужно изменить, чтобы это работало для checkbox и выпадающего списка.

2
Комментарии

Вы можете использовать этот туториал. Это простой jQuery и CF7, если вы все еще хотите продолжать использовать CF7. https://wordpress.org/support/topic/plugin-contact-form-7-this-is-how-to-showhide-fields-with-jquery?replies=8

TalwinderSingh TalwinderSingh
1 июл. 2015 г. 19:28:11

Это я знаю, как сделать. Мне не нужно показывать или скрывать поля. Мне нужно, чтобы при выборе одного ответа другое поле становилось обязательным.

Nicole Nicole
1 июл. 2015 г. 19:42:15
Все ответы на вопрос 3
1

Я нашел обходной путь, который работает в IE, Chrome и Firefox. Вместо подхода на PHP решил использовать jQuery. Это не полное решение, но может выручить тех, кому нужно применить подобный функционал.

<script type="text/javascript">
/*! jQuery скрипт для скрытия определенных полей формы */
$(document).ready(function () {

    // Изначально скрываем поле
    $("#hide").hide();

    // Показываем текстовое поле только при выборе третьего варианта
    $('#dropdown').change(function () {
        if ($("#dropdown").val() == "Other") {
            $("#hide").show();
            var input = $("#hide");
            if (input.length > 0) { // Если поле ввода содержит значение - очищаем его
                input.val('');
            }

        } else {
            $("#hide").hide();
            var input = $("#hide");
            input.val("NA"); // Добавляем значение NA в скрытое обязательное поле!

        }
    });
});
</script>

Этот код добавит "NA" в обязательное поле, обойдя таким образом проверку на заполненность.

10 июл. 2015 г. 17:48:14
Комментарии

Это не работает для файловых полей ввода, так как их значения нельзя установить программно.

Mark Buikema Mark Buikema
30 авг. 2016 г. 20:58:10
0

Это решение сработало у меня. В моем случае, если чекбокс был отмечен, адрес становился обязательным полем.

function my_custom_conditional_required($result, $tag) {
    $tag = new WPCF7_Shortcode( $tag );
    $name = $tag->name;
    $value = isset( $_POST[$name] )
        ? trim( wp_unslash( strtr( (string) $_POST[$name], "\n", " " ) ) )
        : '';

    $myCheckbox= $_POST['myCheckbox'][0];

    if( $name == "address" && $myCheckbox== true){
        if ( '' == $value ) :
            $result->invalidate( $tag, 'Адрес является обязательным полем.' );
         endif;
    }

    return $result;
}

add_filter( 'wpcf7_validate_text', 'my_custom_conditional_required', 10, 2 );
add_filter( 'wpcf7_validate_text*', 'my_custom_conditional_required', 10, 2 );
25 янв. 2019 г. 11:04:59
0

Я только что столкнулся с этой проблемой в проекте и решил написать небольшой туториал о том, как я её решил. Надеюсь, это поможет кому-то в будущем:

https://wpharvest.com/contact-form-7-custom-fields-validation/

16 мар. 2020 г. 14:39:15