Как добавить многоуровневую валидацию в WPForms для WordPress

Часто стандартных возможностей валидации форм 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 — они помогут сэкономить время и сделать формы ещё удобнее.

Интеграция WPForms с SMS-уведомлениями: настройка и примеры кода
25.12.2025
WPForms: отладка ошибок и ведение логов в WordPress
27.02.2026
WPForms отладка выполнения формы при ошибках в JavaScript
14.03.2026
WPForms динамические поля с расчетом значений в WordPress
20.03.2026
WPForms: настройка отправки формы по Email с использованием PHPMailer
16.04.2026