Ограничение числа регистраций пользователей на сайте WordPress — важная задача для защиты от спама и контроля нагрузки на сервер. В этой статье разберём, как можно ограничить количество регистраций за определённый промежуток времени, используя как готовые плагины, так и кастомные решения с помощью кода.
Почему важно ограничивать количество регистраций
Часто сайты WordPress сталкиваются с проблемой массовых регистраций ботов или злоумышленников, что приводит к:
- засорению базы данных ненужными аккаунтами;
- перегрузке сервера;
- возможным угрозам безопасности;
- искажению статистики.
Ограничение регистраций поможет держать под контролем поток новых пользователей и повысит безопасность сайта.
Использование плагинов для ограничения регистраций
Если вы не хотите писать код, можно использовать готовые плагины. Вот несколько популярных решений:
1. WP Limit Login Attempts
Хотя этот плагин в основном ограничивает попытки входа, он также позволяет контролировать регистрации с определённого IP-адреса.
2. Registration Limits
Этот плагин даёт возможность настроить максимальное количество регистраций за временной промежуток, например, за час или день.
Плагин простой в использовании и подходит для большинства задач.
Скачать Registration Limits на WPSHOP
3. Clearfy Pro
Clearfy Pro — мощный оптимизатор и средство безопасности, в котором есть функции ограничения регистраций и защиты от спама.
Имеет множество настроек и интегрируется с другими сервисами.
Кастомное решение на PHP для ограничения регистраций
Если вы хотите уникальную логику, можно реализовать ограничение регистраций через код. Рассмотрим пример, который ограничит регистрации с одного IP не более 3 раз в час.
Создаём таблицу для хранения регистраций
Для начала создадим таблицу в базе данных, которая будет хранить IP и время регистрации:
function wptemp_create_registration_limit_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wptemp_registration_limits';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
ip VARCHAR(100) NOT NULL,
registration_time DATETIME NOT NULL,
PRIMARY KEY (id),
INDEX ip_idx (ip),
INDEX reg_time_idx (registration_time)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'wptemp_create_registration_limit_table');
Проверка и запись регистрации
Далее при попытке регистрации проверяем количество регистраций с IP за последний час:
function wptemp_limit_registrations_by_ip( $user_login, $user_email, $errors ) {
global $wpdb;
$table_name = $wpdb->prefix . 'wptemp_registration_limits';
$ip = $_SERVER['REMOTE_ADDR'];
$time_limit = date('Y-m-d H:i:s', strtotime('-1 hour'));
// Количество регистраций с IP за последний час
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $table_name WHERE ip = %s AND registration_time > %s",
$ip, $time_limit
));
if ( $count >= 3 ) {
$errors->add('registration_limit_exceeded', __('Превышено максимальное число регистраций с вашего IP. Попробуйте позже.'));
}
}
add_action('register_post', 'wptemp_limit_registrations_by_ip', 10, 3);
function wptemp_log_registration( $user_id ) {
global $wpdb;
$table_name = $wpdb->prefix . 'wptemp_registration_limits';
$ip = $_SERVER['REMOTE_ADDR'];
$wpdb->insert( $table_name, [
'ip' => $ip,
'registration_time' => current_time('mysql')
]);
}
add_action('user_register', 'wptemp_log_registration');
Расширение функционала: Ограничение по email-домену и верификация
Помимо ограничения по IP, иногда полезно ограничить регистрации по домену email или добавить капчу. Для этого можно использовать плагины, например, reCAPTCHA или Advanced noCaptcha & invisible Captcha.
Также можно добавить проверку домена email на этапе регистрации:
function wptemp_restrict_email_domain( $user_login, $user_email, $errors ) {
$allowed_domains = ['example.com', 'mysite.ru']; // разрешённые домены
$email_domain = substr(strrchr($user_email, "@"), 1);
if ( !in_array( $email_domain, $allowed_domains ) ) {
$errors->add('email_domain_restricted', __('Регистрация с данного домена email запрещена.'));
}
}
add_action('register_post', 'wptemp_restrict_email_domain', 10, 3);
Практические советы и рекомендации
- Всегда проверяйте, чтобы ваша таблица для логов регистраций очищалась автоматически — например, удаляйте записи старше 24 часов, чтобы база не разрасталась.
- Комбинируйте ограничения: IP + email + капча для лучшей защиты.
- Используйте плагин Clearfy Pro для комплексной защиты и оптимизации сайта, особенно если нужны дополнительные возможности безопасности.
- Регулярно обновляйте плагины и ядро WordPress, чтобы избежать уязвимостей.
- Тестируйте ограничения на тестовом сайте перед применением на боевом.
Заключение и полезные ссылки
Ограничение количества регистраций — важная и выполнимая задача. Используйте описанные методы и плагины для контроля регистраций и защиты сайта от спама.
Полезные ресурсы: