Диагностика проблемы: зачем и когда удалять заблокированных пользователей
В крупных WordPress-сайтах с регистрацией пользователей зачастую возникает необходимость автоматически очищать базу от заблокированных, неактивных или подозрительных аккаунтов. Это снижает нагрузку на базу данных, уменьшает риски безопасности и упрощает администрирование. Но как понять, что аккаунт следует удалить?
- Пользователь деактивирован или имеет роль, указывающую на блокировку.
- Отсутствие активности (например, последний логин более 6 месяцев назад).
- Пользователи, заблокированные вручную при выявлении подозрительной активности.
В WordPress нет стандартного статуса "заблокирован" для пользователей, поэтому чаще всего разработчики используют пользовательские метаданные или определённые роли (например, blocked или inactive).
Пошаговое решение: написание кода для автоматического удаления заблокированных пользователей
Шаг 1. Определение критериев удаления
Для примера будем считать, что нужно удалить пользователей с ролью blocked, а также тех, у кого последний вход был более 180 дней назад.
Шаг 2. Получение списка пользователей по условиям
$args = [
'role' => 'blocked',
'meta_query' => [
[
'key' => 'last_login',
'value' => date('Y-m-d H:i:s', strtotime('-180 days')),
'compare' => '<',
'type' => 'DATETIME',
],
],
];
$users = get_users($args);Примечание: Для отслеживания last_login нужно предварительно записывать время авторизации пользователя в метаданные. Это можно сделать с помощью хука wp_login:
add_action('wp_login', function($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}, 10, 2);Шаг 3. Удаление пользователей
foreach ($users as $user) {
wp_delete_user($user->ID);
}Шаг 4. Автоматизация с помощью WP-Cron
Чтобы запускать удаление автоматически, добавим задачу в WP-Cron, например, раз в сутки.
if (!wp_next_scheduled('auto_delete_blocked_users')) {
wp_schedule_event(time(), 'daily', 'auto_delete_blocked_users');
}
add_action('auto_delete_blocked_users', function() {
$args = [
'role' => 'blocked',
'meta_query' => [
[
'key' => 'last_login',
'value' => date('Y-m-d H:i:s', strtotime('-180 days')),
'compare' => '<',
'type' => 'DATETIME',
],
],
];
$users = get_users($args);
foreach ($users as $user) {
wp_delete_user($user->ID);
}
});Проверка результата после внедрения
- Проверьте вручную наличие пользователей с ролью
blockedи метаданнымиlast_loginв базе через phpMyAdmin или админку. - Запустите функцию удаления вручную (через вызов хука или отдельный скрипт) и убедитесь, что пользователи удаляются.
- Проверьте, что WP-Cron действительно срабатывает (например, с помощью плагина WP Crontrol).
- Отследите логи ошибок, чтобы убедиться в отсутствии сбоев.
Частые ошибки и как их исправить
- Отсутствие записи времени последнего входа: без
last_loginфильтрация по дате невозможна. Решение: обязательно добавьте хукwp_loginдля обновления метаданных. - Неверно указанная роль пользователя: роль
blockedдолжна существовать и быть назначена. Проверьте наличие роли черезget_editable_roles(). - Удаление администраторов: если у заблокированных пользователей есть права администратора, их удаление может привести к проблемам. Рекомендуется исключить администраторов из выборки.
- WP-Cron не срабатывает: на некоторых серверах WP-Cron работает только при посещениях сайта. Для надежности настройте системный cron или используйте внешние сервисы.
Практические советы по безопасности и производительности
- Перед массовым удалением пользователей создавайте резервную копию базы данных.
- Ограничьте права пользователя, который запускает удаление, чтобы избежать случайных ошибок.
- Оптимизируйте запросы к базе данных, минимизируя нагрузку при большом количестве пользователей.
- Используйте транзакции или поэтапное удаление при критично большом объеме данных.
Сравнение вариантов удаления заблокированных пользователей
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудозатратно, риск забыть | Подходит для небольших сайтов |
| WP-Cron с кастомным кодом | Автоматизация, гибкость | Зависимость от WP-Cron, требует разработки | Лучший вариант для средних и больших сайтов |
| Плагин сторонний (например, User Cleanup) | Готовое решение, интерфейс | Дополнительная нагрузка, возможны конфликты | Используйте, если не хотите писать код |