add_filter( 'wpcf7_validate', 'wpp_logic_for_skip_cf7_validate_in_posts', 2, 2 );
function wpp_logic_for_skip_cf7_validate_in_posts( $result, $tags ) {
$return = new WPCF7_Validation();
$invalid_fields = $result->get_invalid_fields();
/**
* Массив с полями не обязавтельными к проверке в определенных постах
* ключь - id поста в котором валидация не обязательна
* значения - тег(имя) поля которое не надо проверять
*/
// TODO: Вот тут некисло было бы сделать фильтром например $logic_for_skip = apply_filters( 'wpp_fr_cf7_skip_fields_array', [] ); так будет сильно удобнее настраивать, но для примера покатит и так
$logic_for_skip = [
4 => [
'your-name',
'your-message'
],
602 => [
'your-message'
]
];
// TODO: Этот кусок я бы не тянул в продакшен, так как значение скрытого поля _wpcf7_container_post легко подменить но queried_object тут не возвращает ID ибо, то-что было интересно я решил и валидация пропускается.
$current_id = (int)$_REQUEST[ '_wpcf7_container_post' ];
// если ошибок нет, то нихрена не делаем
if ( !is_array( $invalid_fields ) || count( $invalid_fields ) == 0 )
return $result;
//если ошибки есть, то смотрим в каких полях и если их надо пропустить пропускаем
foreach ( $invalid_fields as $invalid_field_key => $invalid_field_data ) {
if ( empty( $logic_for_skip[ $current_id ] ) || !in_array( $invalid_field_key, $logic_for_skip[ $current_id ] ) ) {
$return->invalidate( $invalid_field_key, $invalid_field_data[ 'reason' ] );
}
}
return $return;
}