Диагностика проблемы: зачем ограничивать регистрацию по домену
В стандартном WordPress нет встроенных настроек для фильтрации регистраций пользователей по email-доменам. Это часто становится проблемой на сайтах с открытой регистрацией, когда нужно запретить регистрацию с бесплатных почтовых сервисов, временных почтовых ящиков или корпоративных доменов конкурентов. Без такой фильтрации можно получить множество мусорных аккаунтов, что снижает безопасность и качество базы пользователей.
Пошаговое решение: фильтрация регистрации по домену email
1. Использование хука registration_errors
Для запрета регистрации с определённых доменов нужно использовать фильтр registration_errors, который позволяет валидировать данные перед созданием пользователя.
2. Пример кода для functions.php
function wpweb_block_email_domains( $errors, $sanitized_user_login, $user_email ) {
// Список запрещённых доменов
$blocked_domains = array('tempmail.com', 'disposablemail.com', 'spamdomain.net');
// Получаем домен из email
$email_domain = strtolower( substr( strrchr( $user_email, '@' ), 1 ) );
if ( in_array( $email_domain, $blocked_domains ) ) {
$errors->add( 'domain_blocked', __( 'Регистрация с этого домена электронной почты запрещена.' ) );
}
return $errors;
}
add_filter( 'registration_errors', 'wpweb_block_email_domains', 10, 3 );3. Добавление доменов в список
Добавляйте в массив $blocked_domains все домены, которые хотите заблокировать. Можно расширить функционал, загрузив список из файла или настроек плагина.
Проверка результата после внедрения
Для проверки:
- Перейдите на страницу регистрации WordPress (обычно
/wp-login.php?action=register). - Попробуйте зарегистрироваться, указав email с запрещённым доменом — регистрация должна быть заблокирована с ошибкой.
- Зарегистрируйтесь с разрешённым доменом — регистрация должна пройти успешно.
Если вы используете сторонние плагины регистрации, проверьте, что они корректно вызывают стандартный хук registration_errors.
Частые ошибки и как их исправить
- Ошибка: фильтр не срабатывает при регистрации через плагин
Причина: плагин регистрации не использует стандартные хуки WordPress.
Решение: проверьте документацию плагина, возможно, там есть свои фильтры или методы для валидации регистрации. - Ошибка: пользователи обходят фильтр, регистрируясь с похожими доменами
Причина: в коде проверяется точное совпадение домена.
Решение: используйте проверку по суффиксу или расширьте список запрещённых доменов, например, блокировать все поддомены типаmail.tempmail.com. - Ошибка: регистрируются email с большими буквами, и фильтр не срабатывает
Причина: сравнение доменов без приведения к нижнему регистру.
Решение: используйтеstrtolowerдля преобразования домена перед сравнением.
Практические советы по безопасности и производительности
- Храните список запрещённых доменов в отдельном конфигурационном файле или настройках плагина, чтобы не редактировать код при каждом изменении.
- Регулярно обновляйте список временных и спам-доменов — их много и они меняются.
- Для ускорения проверки используйте
in_arrayс массивом, а при большом списке — применяйте структуры данных с быстрым поиском, например, хеш-таблицы. - Если ваш сайт использует WooCommerce или кастомные формы регистрации, интегрируйте проверку в соответствующие хуки этих плагинов.
Сравнение способов ограничения регистрации по домену
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Фильтр registration_errors (код) | Лёгкий, без плагинов, гибкий | Требует базовых знаний PHP, не всегда срабатывает с плагинами регистрации | Небольшие сайты с классической регистрацией |
| Плагины фильтрации email (например, WPBruiser, CleanTalk) | Простота настройки, поддержка обновлений | Может влиять на производительность, зависит от стороннего кода | Сложные сайты с большим трафиком и регистрациями |
| Кастомные решения в плагинах регистрации | Максимальная интеграция | Требует разработки и поддержки | Кастомные проекты с уникальными формами |