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 предоставляет удобные фильтры и хуки, которые позволяют гибко добавлять свои правила. В статье мы рассмотрели базовые и расширенные примеры, которые легко адаптировать под свои задачи и формы.