Условные обязательные поля для WordPress Contact Form 7
Я понимаю, что этот вопрос может считаться офтопиком, но я не уверен, где еще его задать, так как он касается как 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 и выпадающего списка.

Я нашел обходной путь, который работает в 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" в обязательное поле, обойдя таким образом проверку на заполненность.

Это решение сработало у меня. В моем случае, если чекбокс был отмечен, адрес становился обязательным полем.
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 );

Я только что столкнулся с этой проблемой в проекте и решил написать небольшой туториал о том, как я её решил. Надеюсь, это поможет кому-то в будущем:
https://wpharvest.com/contact-form-7-custom-fields-validation/
