Contact Form 7: как добавить внутреннюю валидацию на PHP для защиты и гибкости

Contact Form 7 — один из самых популярных плагинов для создания форм в WordPress. Он обладает удобным интерфейсом и встроенной валидацией на стороне клиента, но иногда этого может быть недостаточно. Клиенты могут отключать JavaScript, а встроенная валидация ограничена по функционалу. В этом случае полезна внутренняя валидация на PHP — она выполняется на сервере, что позволяет надежно проверить данные до их обработки и отправки.

Почему важна внутренняя валидация в Contact Form 7

Встроенная валидация Contact Form 7 работает через HTML5 и JavaScript, что удобно, но не всегда безопасно. Клиенты могут:

  • Отключить JavaScript;
  • Отправлять специально подготовленные данные через API;
  • Игнорировать ограничения типа и длины полей.

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

Как работает внутренняя валидация Contact Form 7: фильтры и хуки

Contact Form 7 предоставляет фильтр wpcf7_validate_{$type}_* , где {$type} — тип поля (например, text, email, tel). Он позволяет добавлять собственные правила валидации для конкретных типов полей.

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

Рассмотрим пример на практике.

Пример: добавляем внутреннюю валидацию для поля с номером телефона

Допустим, нам нужно, чтобы номер телефона был строго в формате +7 (XXX) XXX-XX-XX. В Contact Form 7 создадим поле с именем phone:

[tel* phone]

Далее добавим PHP-код в файл functions.php вашей темы или в отдельный плагин:

add_filter( 'wpcf7_validate_tel*', 'contactform7ru_custom_phone_validation', 20, 2 );
function contactform7ru_custom_phone_validation( $result, $tag ) {
    $name = $tag->name;
    if ( 'phone' == $name ) {
        $phone = isset( $_POST[$name] ) ? trim( $_POST[$name] ) : '';
        // Регулярное выражение для формата +7 (999) 999-99-99
        if ( ! preg_match( '/^\+7 \(\d{3}\) \d{3}-\d{2}-\d{2}$/', $phone ) ) {
            $result->invalidate( $tag, 'Введите номер телефона в формате +7 (999) 999-99-99.' );
        }
    }
    return $result;
}

Объяснение кода:

  • Фильтр wpcf7_validate_tel* применяется к обязательным полям типа tel.
  • Проверяем, что имя поля — phone, чтобы не влиять на другие поля.
  • Получаем значение из $_POST и проверяем через регулярное выражение.
  • Если проверка не проходит, вызываем метод invalidate для установки ошибки валидации.

Теперь, при отправке формы, если телефон введен неправильно, пользователь увидит сообщение об ошибке и отправка не произойдет.

Расширение: валидация нескольких полей с зависимостями

Иногда нужно проверять несколько полей одновременно — например, если выбрана опция «Да» в одном поле, то второе поле становится обязательным и должно пройти проверку.

Это сложнее, но Contact Form 7 позволяет использовать фильтр wpcf7_validate для валидации всей формы:

add_filter( 'wpcf7_validate', 'contactform7ru_custom_form_validation', 20, 2 );
function contactform7ru_custom_form_validation( $result, $tags ) {
    $submission = WPCF7_Submission::get_instance();
    if ( !$submission ) {
        return $result;
    }

    $data = $submission->get_posted_data();

    // Проверяем, есть ли поле с именем 'subscribe' и его значение 'yes'
    if ( isset( $data['subscribe'] ) && 'yes' == $data['subscribe'] ) {
        // При подписке поле 'email' обязательно и должно быть валидным email
        if ( empty( $data['email'] ) || ! is_email( $data['email'] ) ) {
            foreach ( $tags as $tag ) {
                if ( 'email' === $tag->type && 'email' === $tag->name ) {
                    $result->invalidate( $tag, 'Введите корректный email при подписке.' );
                    break;
                }
            }
        }
    }

    return $result;
}

Здесь мы:

  • Получаем данные формы через класс WPCF7_Submission.
  • Проверяем значение поля subscribe.
  • Если выбран вариант «Да» (значение yes), проверяем поле email отдельно.
  • Если email пустой или невалидный, устанавливаем ошибку в соответствующем поле.

Таким образом можно строить сложные правила валидации, которые выходят за рамки стандартных возможностей Contact Form 7.

Практические советы по созданию внутренней валидации для Contact Form 7

1. Учитывайте типы полей и их имена

В фильтрах часто передается объект тега с именем и типом поля — используйте это, чтобы не менять валидацию для всех полей одного типа, а только для нужных.

2. Помните про безопасность

Обязательно фильтруйте и проверяйте данные, чтобы избежать XSS и других уязвимостей. Валидация должна быть строгой и не полагаться только на клиентскую валидацию.

3. Тестируйте с разными браузерами и отключенным JavaScript

Внутренняя валидация должна работать всегда, даже если JS отключен или пользователь отправляет данные с помощью CURL, Postman и других инструментов.

4. Используйте пользовательские сообщения об ошибках

Сообщения должны быть понятными и конкретными, чтобы пользователь понял, что исправить.

5. Храните код в отдельном плагине или дочерней теме

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

Заключение: когда нужна внутренняя валидация в Contact Form 7

Если вам необходимо контролировать ввод данных максимально строго, реализовать сложные проверки и защиту от некорректных запросов, внутренняя валидация на PHP — лучший выбор. Contact Form 7 предоставляет удобные фильтры и хуки, которые позволяют гибко добавлять свои правила. В статье мы рассмотрели базовые и расширенные примеры, которые легко адаптировать под свои задачи и формы.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Contact Form 7: как добавить подписку на рассылку с помощью checkbox
04.03.2026
Contact Form 7: как добавить ответы из формы в базу данных WordPress
17.01.2026
Contact Form 7: автоматическая замена значения поля по условию
27.01.2026
Contact Form 7: динамические поля с помощью шорткодов и фильтров
05.02.2026
Contact Form 7: автоматическая отправка данных формы в Google Analytics через событие
02.02.2026
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙