Часто стандартных возможностей валидации форм WPForms бывает недостаточно для сложных сценариев сбора данных. В этой статье разберём, как реализовать многоуровневую валидацию — когда проверка значения поля зависит от данных в других полях, внешних условий или даже пользовательских правил.
Почему нужна многоуровневая валидация в WPForms
WPForms отлично справляется с базовой валидацией: обязательные поля, типы данных, длина и формат. Однако бывает нужно:
- Проверять согласованность значений между несколькими полями (например, даты начала и окончания события).
- Выполнять проверки на стороне сервера с учётом пользовательских условий.
- Добавлять дополнительные сообщения об ошибках с разъяснениями.
Без кастомной логики это невозможно, поэтому используем хуки WPForms и пишем свой код.
Основные хуки для валидации в WPForms
Для расширения валидации в WPForms нам пригодится фильтр wpforms_process_validate. Он позволяет добавить свои проверки после стандартных, и вывести ошибки, если что-то не так.
Сигнатура фильтра:
add_filter('wpforms_process_validate', 'wpformskit_custom_validation', 10, 3);Параметры функции:
$fields— массив полей формы с их значениями.$entry— объект записи формы.$form_data— данные формы и её настройки.
Пример базовой кастомной валидации
Допустим, хотим проверить, что дата окончания не меньше даты начала:
function wpformskit_custom_validation($fields, $entry, $form_data) {
$start_date = '';
$end_date = '';
foreach ($fields as $field) {
if ($field['id'] === '1') { // ID поля с датой начала
$start_date = $field['value'];
}
if ($field['id'] === '2') { // ID поля с датой окончания
$end_date = $field['value'];
}
}
if ($start_date && $end_date) {
if (strtotime($end_date) < strtotime($start_date)) {
wpforms()->process->errors[ $form_data['id'] ][2] = 'Дата окончания не может быть меньше даты начала.';
}
}
return $fields;
}
add_filter('wpforms_process_validate', 'wpformskit_custom_validation', 10, 3);Обратите внимание, что ключ массива errors содержит ID поля, для которого выводится ошибка.
Добавление вложенных условий и проверок
Допустим, у нас есть поле «Тип заявки» (select с вариантами), и в зависимости от выбранного варианта нам нужно валидировать дополнительные поля.
Реализуем проверку: если выбран вариант «Специальный запрос», то поле «Комментарий» должно быть заполнено и содержать минимум 20 символов.
function wpformskit_conditional_validation($fields, $entry, $form_data) {
$request_type = '';
$comment = '';
foreach ($fields as $field) {
if ($field['id'] === '3') { // Тип заявки
$request_type = $field['value'];
}
if ($field['id'] === '4') { // Комментарий
$comment = $field['value'];
}
}
if ($request_type === 'special_request') {
if (empty($comment) || mb_strlen(trim($comment)) < 20) {
wpforms()->process->errors[$form_data['id']][4] = 'Комментарий обязателен и должен содержать не менее 20 символов для специального запроса.';
}
}
return $fields;
}
add_filter('wpforms_process_validate', 'wpformskit_conditional_validation', 10, 3);Таким образом можно создавать сложные зависимости между полями и контролировать корректность ввода данных.
Валидация с использованием внешних API и сервисов
Иногда нужно проверить данные вне WordPress, например, проверить телефон через сервис валидации или определить корректность email через внешнее API.
Пример: проверим email с помощью простого запроса к API проверки (псевдокод):
function wpformskit_email_api_validation($fields, $entry, $form_data) {
foreach ($fields as $field) {
if ($field['id'] === '5') { // Email
$email = $field['value'];
$response = wp_remote_get('https://api.emailverify.com/verify?email=' . urlencode($email));
if (is_wp_error($response) || wp_remote_retrieve_response_code($response) !== 200) {
wpforms()->process->errors[$form_data['id']][5] = 'Не удалось проверить email. Попробуйте позже.';
return $fields;
}
$body = json_decode(wp_remote_retrieve_body($response), true);
if (empty($body['is_valid']) || !$body['is_valid']) {
wpforms()->process->errors[$form_data['id']][5] = 'Email не прошёл проверку.';
}
}
}
return $fields;
}
add_filter('wpforms_process_validate', 'wpformskit_email_api_validation', 10, 3);Не забудьте оптимизировать такие проверки, чтобы не замедлять отправку форм.
Использование плагинов для расширенной валидации
Если хочется готовые решения, рекомендуем обратить внимание на плагины:
- WPForms Conditional Logic Addon — расширяет возможности условной логики.
- Clearfy Pro — содержит инструменты для оптимизации и улучшения форм.
С их помощью можно упростить создание сложных правил без программирования.
Практические советы по написанию кастомной валидации
1. Всегда проверяйте наличие и корректность данных, чтобы избежать ошибок PHP.
2. Используйте wpforms()->process->errors для вывода ошибок, привязанных к конкретным полям.
3. Тестируйте все сценарии ввода, включая пустые и некорректные данные.
4. Помните про безопасность — фильтруйте и экранируйте пользовательский ввод.
5. Для сложных проверок учитывайте производительность и возможность кеширования.
Пример комплексной функции валидации
function wpformskit_complex_validation($fields, $entry, $form_data) {
// Получаем значения
$start_date = $end_date = $request_type = $comment = '';
foreach ($fields as $field) {
switch ($field['id']) {
case '1': $start_date = $field['value']; break;
case '2': $end_date = $field['value']; break;
case '3': $request_type = $field['value']; break;
case '4': $comment = $field['value']; break;
}
}
// Проверка дат
if ($start_date && $end_date && strtotime($end_date) < strtotime($start_date)) {
wpforms()->process->errors[$form_data['id']][2] = 'Дата окончания не может быть меньше даты начала.';
}
// Условная проверка комментария
if ($request_type === 'special_request') {
if (empty($comment) || mb_strlen(trim($comment)) < 20) {
wpforms()->process->errors[$form_data['id']][4] = 'Комментарий обязателен и должен содержать не менее 20 символов.';
}
}
return $fields;
}
add_filter('wpforms_process_validate', 'wpformskit_complex_validation', 10, 3);Такой подход позволяет создать гибкую, многоуровневую систему валидации без изменения исходников плагина WPForms.
Заключение
Многоуровневая валидация в WPForms — мощный инструмент для улучшения качества данных и пользовательского опыта. Используя фильтры и хуки плагина, вы сможете реализовать любые проверки, от простых до самых сложных, с минимальными затратами времени и без риска сломать работу форм.
Для удобства и расширения возможностей рекомендуем изучить WPForms Conditional Logic Addon и Clearfy Pro — они помогут сэкономить время и сделать формы ещё удобнее.