Contact Form 7 — один из самых популярных плагинов для создания форм обратной связи в WordPress. Стандартный набор валидации полей покрывает большинство типичных случаев, однако иногда требуется реализовать особые правила проверки данных, которые не поддерживаются из коробки. В этой статье подробно разберём, как добавить кастомную валидацию в Contact Form 7 с примерами кода и полезными советами.
Почему нужна кастомная валидация в Contact Form 7
Стандартные типы полей Contact Form 7 позволяют задавать обязательность, тип данных (email, номер телефона, URL) и минимальные требования. Однако если нужно проверить, например, правильность формата номера телефона с международным кодом, или фильтровать конкретные слова в текстовом поле — стандартных возможностей не хватит.
Кастомная валидация позволяет:
- Проверять сложные форматы данных, например, ИНН, паспортные данные, номера карт;
- Фильтровать нежелательные слова или символы, обеспечивая безопасность;
- Добавлять логические проверки между несколькими полями;
- Отображать собственные сообщения об ошибках для пользователя.
Все это можно реализовать с помощью встроенного WordPress-хука Contact Form 7.
Как работает валидация в Contact Form 7: основные хуки и структура
Contact Form 7 использует фильтр wpcf7_validate_{type} для валидации каждого типа поля. Например, для текстового поля это будет wpcf7_validate_text, для email — wpcf7_validate_email. Чтобы добавить кастомную валидацию, нужно подключиться к нужному хуку и реализовать свою функцию проверки.
Аргументы функции валидации:
$result— объект результата валидации, который нужно модифицировать при ошибках;$tag— объект поля формы с параметрами и атрибутами;$value— значение, введённое пользователем.
В случае ошибки нужно вызвать у объекта $result метод invalidate(), передав идентификатор поля и сообщение об ошибке.
Пример: базовая валидация текстового поля
add_filter('wpcf7_validate_text', 'contactform7ru_custom_text_validation', 20, 2);
function contactform7ru_custom_text_validation($result, $tag) {
$name = $tag->name;
$value = isset($_POST[$name]) ? trim($_POST[$name]) : '';
if ($name === 'your-custom-field') {
if (strlen($value) < 5) {
$result->invalidate($tag, 'Поле должно содержать не менее 5 символов.');
}
}
return $result;
}В этом примере мы проверяем, чтобы поле с именем your-custom-field содержало минимум 5 символов. Если условие не выполняется, пользователь увидит сообщение об ошибке.
Как добавить валидацию для email с проверкой домена отправителя
Иногда нужно ограничить регистрацию или заявки только определёнными доменами почты — например, разрешить только корпоративные email. Реализуем это с помощью фильтра wpcf7_validate_email.
add_filter('wpcf7_validate_email', 'contactform7ru_validate_corporate_email', 20, 2);
function contactform7ru_validate_corporate_email($result, $tag) {
$name = $tag->name;
$value = isset($_POST[$name]) ? trim($_POST[$name]) : '';
if ($name === 'your-email') {
if (!preg_match('/@yourcompany\.com$/i', $value)) {
$result->invalidate($tag, 'Разрешены только email с доменом yourcompany.com');
}
}
return $result;
}Замените your-email на имя вашего поля, а yourcompany.com — на нужный домен.
Валидация числовых полей с ограничением диапазона
Для полей, где пользователь вводит число (например, возраст, количество товаров), можно добавить проверку на минимальное и максимальное значение. В Contact Form 7 для числовых полей используется тип number, для которого существует фильтр wpcf7_validate_number.
add_filter('wpcf7_validate_number', 'contactform7ru_validate_number_range', 20, 2);
function contactform7ru_validate_number_range($result, $tag) {
$name = $tag->name;
$value = isset($_POST[$name]) ? $_POST[$name] : '';
if ($name === 'your-age') {
if (!is_numeric($value) || $value < 18 || $value > 99) {
$result->invalidate($tag, 'Возраст должен быть числом от 18 до 99.');
}
}
return $result;
}Таким образом можно ограничить ввод в нужном диапазоне.
Отладка кастомной валидации и полезные советы
При разработке кастомных правил валидации важно точно знать имя поля (атрибут name в форме CF7), иначе проверка не сработает. Также рекомендуется использовать разные имена функций с префиксом, например, contactform7ru_, чтобы избежать конфликтов с другими плагинами.
Если валидация не срабатывает:
- Проверьте, что ваш код подключён в файле functions.php или в собственном плагине;
- Убедитесь, что фильтр добавлен с правильным приоритетом и количеством аргументов (обычно 20 и 2);
- Добавьте
error_logилиvar_dumpдля отладки значений; - Убедитесь, что имя поля совпадает с тем, что указано в самой форме.
Расширенные примеры: валидация с использованием регулярных выражений
Для сложных форматов данных удобно использовать регулярные выражения. Например, проверка номера телефона по международному формату E.164:
add_filter('wpcf7_validate_tel', 'contactform7ru_validate_international_phone', 20, 2);
function contactform7ru_validate_international_phone($result, $tag) {
$name = $tag->name;
$value = isset($_POST[$name]) ? trim($_POST[$name]) : '';
if ($name === 'your-phone') {
if (!preg_match('/^\+\d{10,15}$/', $value)) {
$result->invalidate($tag, 'Введите номер телефона в формате +1234567890 (минимум 10 цифр).');
}
}
return $result;
}Такой код позволит принимать только корректные международные номера телефона. Можно адаптировать под любые требования.
Заключение по кастомной валидации в Contact Form 7
Добавление собственной валидации — мощный инструмент для адаптации форм под ваши бизнес-задачи. Contact Form 7 предоставляет гибкие хуки, которые позволяют контролировать правильность данных до отправки формы. Используйте приведённые примеры как шаблон и расширяйте их под свои нужды, улучшая качество сбора данных и удобство для пользователей.