Диагностика проблемы: зачем ограничивать регистрацию пользователей?
В стандартной установке WordPress регистрация пользователей либо включена для всех, либо полностью отключена. Однако в ряде случаев необходимо ограничить регистрацию по определённым критериям: например, разрешить регистрацию только с корпоративных e-mail, ограничить число новых пользователей в сутки или запретить регистрацию с определённых IP-адресов, чтобы снизить спам и нагрузку на сайт.
Какие способы ограничения доступны в WordPress?
Основные варианты ограничения регистрации пользователей:
- Ограничение по домену email (например, разрешить только @company.com)
- Лимит по количеству регистраций в день/час
- Блокировка регистрации с заданных IP-адресов или диапазонов
- Включение капчи или дополнительных проверок
- Ручное одобрение новых пользователей (модерация)
Пошаговое решение: ограничение регистрации по домену email и лимиту в сутки
1. Ограничение регистрации по домену электронной почты
Добавим проверку email в хук registration_errors, чтобы разрешить регистрацию только с нужным доменом:
function restrict_registration_email_domain( $errors, $sanitized_user_login, $user_email ) {
$allowed_domain = 'company.com'; // Замените на нужный домен
$email_domain = substr( strrchr( $user_email, '@' ), 1 );
if ( strtolower( $email_domain ) !== strtolower( $allowed_domain ) ) {
$errors->add( 'domain_restricted', 'Регистрация разрешена только с e-mail домена ' . $allowed_domain );
}
return $errors;
}
add_filter( 'registration_errors', 'restrict_registration_email_domain', 10, 3 );2. Ограничение количества регистраций в сутки
Добавим проверку в тот же хук для подсчёта регистраций за последние 24 часа и запрета, если лимит превышен:
function limit_daily_user_registrations( $errors, $sanitized_user_login, $user_email ) {
$limit = 5; // Максимум регистраций в сутки
global $wpdb;
$since = date( 'Y-m-d H:i:s', strtotime( '-1 day' ) );
$count = $wpdb->get_var( $wpdb->prepare(
"SELECT COUNT(ID) FROM $wpdb->users WHERE user_registered >= %s",
$since
) );
if ( $count >= $limit ) {
$errors->add( 'registration_limit', 'Превышен дневной лимит регистрации новых пользователей. Попробуйте позже.' );
}
return $errors;
}
add_filter( 'registration_errors', 'limit_daily_user_registrations', 20, 3 );Обратите внимание, что оба фильтра можно объединять в один, но для наглядности разделены.
Проверка результата после внедрения
- Попробуйте зарегистрироваться с e-mail, не оканчивающимся на
@company.com— должна появиться ошибка и регистрация заблокирована. - Зарегистрируйте 5 пользователей (или установите лимит меньше для теста) и попытайтесь зарегистрировать шестого — получите сообщение о превышении лимита.
- Проверьте логи ошибок сервера, если регистрация проходит без ошибок, но ограничения не работают.
Частые ошибки и как исправить
- Неверная регистрация email: в коде важно правильно извлечь домен из email, используйте
substr(strrchr($user_email, '@'), 1), а не просто explode, чтобы избежать ошибок. - Запрос к базе данных без индекса: запрос подсчёта пользователей по дате
user_registeredможет быть медленным на больших сайтах — рекомендуется добавить индекс по колонкеuser_registeredв таблицеwp_users. - Конфликты с плагинами регистрации: если используете плагины вроде WooCommerce, Profile Builder и др., убедитесь, что фильтр
registration_errorsсрабатывает в их процессе регистрации; возможно, нужно подключиться к другим хукам.
Практические советы по безопасности и производительности
- Для снижения спама используйте капчу (reCAPTCHA) вместе с ограничениями по домену и лимитам.
- Добавьте логирование заблокированных попыток — можно записывать в отдельный файл или таблицу, чтобы анализировать активность.
- Тестируйте ограничения на тестовом сайте перед внедрением в продакшен.
- Добавьте уведомление администратору о блокировке регистраций при превышении лимита.
Альтернативные варианты реализации: код vs плагины
| Способ | Плюсы | Минусы |
|---|---|---|
Код (через registration_errors) | Полный контроль, минимум плагинов, быстрая адаптация под задачи | Требует навыков программирования, возможны ошибки при обновлениях |
| Плагин «Restrict User Registration» или похожие | Простая настройка, готовые функции, поддержка капчи, лимитов | Дополнительная нагрузка, возможные конфликты, ограниченная кастомизация |