Что такое проверка уникальности и зачем она нужна в WPForms
Проверка уникальности введённых данных в формах WPForms часто требуется, чтобы избежать дублирования записей. Например, при регистрации пользователей, отправке заявок или комментариев, где одно и то же значение (email, номер заказа, код купона) не должно повторяться. WPForms из коробки не поддерживает проверку уникальности, поэтому её нужно реализовать самостоятельно через хук валидации.
Диагностика: как понять, что нужна проверка уникальности
- Пользователи жалуются, что могут отправлять одинаковые данные несколько раз.
- В базе или CRM появляются дубликаты, которые мешают учёту.
- На сайте нет встроенной валидации для уникальных полей (например, email, ID, номер заказа).
Если вы видите подобные симптомы, значит, необходимо добавить проверку уникальности в WPForms.
Пошаговое решение: проверка уникальности поля с помощью PHP-хука
Рассмотрим пример, как проверить уникальность email в форме регистрации или обратной связи. Будем считать, что поле email имеет ключ email.
1. Получить ID формы и ключ поля
Сначала узнайте ID вашей формы в WPForms (например, 123) и ключ поля, который можно посмотреть в настройках поля (например, email).
2. Добавить в functions.php или плагин следующий код:
add_filter('wpforms_process_validate', 'wpforms_validate_unique_email', 10, 3);
function wpforms_validate_unique_email($fields, $entry, $form_data) {
// Проверяем ID формы
if ($form_data['id'] != 123) {
return $fields;
}
// Получаем значение email
$email = '';
foreach ($fields as $field) {
if ($field['name'] === 'email') {
$email = sanitize_email($field['value']);
break;
}
}
if (!$email) {
return $fields; // email не заполнен
}
global $wpdb;
// Проверяем, есть ли такой email уже в базе wpforms_entries_meta
$table = $wpdb->prefix . 'wpforms_entries_meta';
$query = $wpdb->prepare(
"SELECT COUNT(*) FROM $table WHERE meta_key = 'email' AND meta_value = %s",
$email
);
$count = $wpdb->get_var($query);
if ($count > 0) {
// Добавляем ошибку к полю email
foreach ($fields as &$field) {
if ($field['name'] === 'email') {
$field['error'] = 'Этот email уже зарегистрирован. Пожалуйста, введите другой.';
$field['error_code'] = 'unique_email';
break;
}
}
}
return $fields;
}3. Проверка работы
Отправьте форму с уже существующим email. Вы должны увидеть ошибку под полем «Этот email уже зарегистрирован» и форма не отправится.
Проверка результата после внедрения
- Отправка формы с новым email проходит успешно.
- Отправка формы с повторяющимся email приводит к появлению ошибки валидации.
- В базе WPForms не создаются дублирующие записи с одинаковым email.
Для теста можно использовать разные браузеры и инкогнито-режим, чтобы убедиться, что проверка работает всегда.
Частые ошибки и как их исправить
- Неправильный ключ поля: В коде укажите именно тот
nameполя, который в форме. Его можно увидеть в настройках поля WPForms. - Неправильный ID формы: Если проверка не срабатывает, проверьте, что ID формы совпадает с тем, что в коде.
- Ошибка в SQL-запросе: Используйте метод
$wpdb->prepareдля защиты от SQL-инъекций и корректности запроса. - Кэширование форм: Если используется кеширование, оно может мешать обновлению ошибок. Отключите кэш для страниц с формой или используйте AJAX-отправку.
Практические советы по безопасности и производительности
- Используйте
sanitize_email()для очистки данных перед проверкой. - Добавляйте проверку только для нужных форм, чтобы не снижать производительность.
- Если у вас много форм и полей, рассмотрите создание универсальной функции для проверки уникальности с параметрами.
- Обрабатывайте ошибки аккуратно, чтобы не раскрывать внутренние данные.
- Для больших сайтов с частыми проверками можно кешировать результаты запросов к базе на короткое время.
Таблица сравнения способов проверки уникальности
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| SQL-запрос к wpforms_entries_meta (как в статье) | Прямой доступ, работает сразу после отправки | Нагрузка на базу, могут быть ложные срабатывания без очистки | Оптимизировать запросы, кешировать результаты |
| Хранение данных в отдельной таблице для уникальных полей | Быстрая проверка, меньше нагрузки | Дополнительная разработка, синхронизация данных | Использовать для высоконагруженных проектов |
| Проверка через AJAX по мере ввода | Мгновенная обратная связь пользователю | Сложнее в реализации, требует JS и серверной части | Использовать для критичных полей (email, логин) |