Диагностика проблемы: зачем и когда нужно удалять неактивных пользователей
В крупных WordPress-сайтах с регистрацией пользователей часто накапливается множество аккаунтов, которые давно не активны — не заходили на сайт, не обновляли данные, не совершали действий. Это может негативно влиять на безопасность, увеличивать размер базы данных и создавать нагрузку на систему. Автоматизация удаления таких пользователей помогает поддерживать чистоту базы и снижать риски злоупотреблений.
Как определить неактивных пользователей в WordPress
Ключевой параметр для определения неактивности — дата последнего входа пользователя. По умолчанию WordPress не хранит эту информацию, поэтому сначала нужно добавить её с помощью плагина или кода.
Добавление мета-поля с датой последнего входа
Добавим код в functions.php или в собственный плагин, чтобы фиксировать дату каждого входа:
function update_last_login($login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}
add_action('wp_login', 'update_last_login', 10, 2);Этот хук wp_login сработает при успешном входе пользователя, записывая текущую дату и время.
Пошаговое решение: автоматическое удаление неактивных пользователей
Создадим функцию, которая будет находить пользователей, у которых дата последнего входа старше заданного периода (например, 180 дней), и удалять их.
function delete_inactive_users() {
$threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
$args = array(
'meta_key' > 'last_login',
'meta_value' > $threshold,
'meta_compare' > '<',
'fields' > 'ID',
'number' > -1
);
$users = get_users($args);
foreach ($users as $user_id) {
wp_delete_user($user_id);
}
}
// Запускаем удаление через WP-Cron каждый день
if (!wp_next_scheduled('daily_delete_inactive_users')) {
wp_schedule_event(time(), 'daily', 'daily_delete_inactive_users');
}
add_action('daily_delete_inactive_users', 'delete_inactive_users');Здесь мы используем get_users с фильтрацией по мета-полю last_login. Функция wp_delete_user удаляет пользователя из базы.
Добавление исключений по ролям
Часто нужно исключить из удаления администраторов и других важных ролей. Добавим аргумент role__not_in:
$args['role__not_in'] = array('administrator', 'editor');Проверка результата после внедрения
- Зайдите в базу данных и проверьте таблицу
wp_usermeta— у активных пользователей должно появиться полеlast_loginс актуальной датой. - После запуска Cron-задачи (можно вызвать вручную) проверьте, что пользователи с датой последнего входа старше 180 дней удалены.
- Используйте плагин User Switching для тестирования входа и обновления даты.
Частые ошибки и как их исправить
- Отсутствие данных о последнем входе: Без хука
wp_loginполеlast_loginне создастся. Проверьте, что код добавлен и срабатывает. - Удаление важных пользователей: Не забудьте добавить исключения по ролям для администраторов и редакторов.
- Проблемы с Cron: Если WP-Cron отключен, задача не выполнится. Проверьте, работает ли Cron, или настройте системный cron.
- Большая нагрузка при удалении: При большом количестве пользователей лучше делать удаление пачками, чтобы избежать перегрузки сервера.
Практические советы по безопасности и производительности
- Для безопасности делайте резервные копии базы перед массовым удалением.
- Ограничивайте права запуска скрипта только администраторам.
- Используйте транзакции в базе, если планируете сложные операции с пользователями.
- Для больших сайтов используйте WP-CLI для запуска скриптов удаления, это эффективнее и не зависит от Cron.
Сравнение методов автоматического удаления неактивных пользователей
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудозатратно, риск пропуска |
| Плагин (например, Inactive User Deleter) | Готовое решение, настройки | Дополнительный плагин, нагрузка |
| Код с WP-Cron (как в статье) | Гибкость, без плагинов | Требует навыков, настройка Cron |
| WP-CLI скрипт | Быстро, эффективно для больших сайтов | Требует доступа к серверу, командной строке |