Диагностика проблемы: зачем удалять неактивных пользователей
На крупных сайтах и проектах на WordPress с множеством зарегистрированных пользователей быстро накапливаются учетные записи, которые давно не использовались. Это не только занимает место в базе данных, но и создает угрозу безопасности — например, такие аккаунты могут быть целями для взлома. Кроме того, неактивные пользователи создают шум в аналитике и усложняют управление ролями и разрешениями.
Чтобы понять, есть ли на вашем сайте проблема, можно выполнить запрос к базе данных и проверить, сколько пользователей не заходили на сайт более полугода:
SELECT user_login, user_email, user_registered, last_login_meta.meta_value AS last_login FROM wp_users LEFT JOIN wp_usermeta AS last_login_meta ON wp_users.ID = last_login_meta.user_id AND last_login_meta.meta_key = 'last_login' WHERE last_login_meta.meta_value < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 6 MONTH)) OR last_login_meta.meta_value IS NULL;Если таких пользователей много, пора подумать об автоматизации их удаления.
Как отслеживать последний вход пользователя в WordPress
По умолчанию WordPress не хранит дату последнего входа пользователя. Для автоматизации удаления нужно сначала реализовать сохранение этой информации. Для этого добавим хук, который будет обновлять метаполе last_login при каждом успешном входе:
add_action('wp_login', function($user_login, $user) { update_user_meta($user->ID, 'last_login', time()); }, 10, 2);Данный код нужно добавить в файл functions.php вашей темы или в отдельный плагин.
Пошаговое решение: автоматическое удаление неактивных пользователей
1. Создаем функцию удаления
function delete_inactive_users($days = 180) { $threshold = time() - ($days * 24 * 60 * 60); $args = [ 'meta_key' => 'last_login', 'meta_value' => $threshold, 'meta_compare' => '<', 'fields' => 'ID' ]; $users = get_users($args); foreach ($users as $user_id) { wp_delete_user($user_id); } }2. Запускаем функцию по расписанию
Создадим cron-задачу, которая будет запускать удаление раз в неделю:
if (!wp_next_scheduled('weekly_delete_inactive_users')) { wp_schedule_event(time(), 'weekly', 'weekly_delete_inactive_users'); } add_action('weekly_delete_inactive_users', function() { delete_inactive_users(180); });3. Вручную тестируем функцию
Для проверки работы функции вызовите delete_inactive_users(180); напрямую в консоли WP-CLI или временно добавьте вызов в functions.php и проверьте, удаляются ли пользователи с датой последнего входа более 180 дней назад.
Проверка результата после внедрения
- Запустите SQL-запрос из раздела диагностики и убедитесь, что пользователей с
last_loginстарше 180 дней стало меньше. - Проверьте логи cron, если они настроены, или добавьте логирование в функцию удаления:
function delete_inactive_users($days = 180) { $threshold = time() - ($days * 24 * 60 * 60); $args = [ 'meta_key' => 'last_login', 'meta_value' => $threshold, 'meta_compare' => '<', 'fields' => 'ID' ]; $users = get_users($args); foreach ($users as $user_id) { wp_delete_user($user_id); error_log("Deleted user ID: $user_id due to inactivity"); } }Частые ошибки и как их исправить
- Ошибка: Не удаляются пользователи.
Причина: Мета-полеlast_loginне установлено или крон-задача не настроена.
Решение: Проверьте, работает ли код обновленияlast_loginпри входе, и активирован ли WP Cron. - Ошибка: Удаляются нужные пользователи (например, администраторы).
Причина: Не исключены роли из удаления.
Решение: Добавьте в запрос исключение для ролей, например, так:
$args['role__not_in'] = ['administrator', 'editor'];- Ошибка: Сайт тормозит из-за большого количества пользователей.
Причина: Запросы к базе данных не оптимизированы.
Решение: Удаляйте пользователей партиями, например по 50 записей за раз, чтобы снизить нагрузку.
Практические советы по безопасности и производительности
- Не удаляйте пользователей без резервной копии базы данных.
- Перед удалением можно отправить уведомление пользователям с предупреждением о предстоящем удалении.
- Исключайте из удаления пользователей с важными ролями (администраторы, редакторы).
- Для больших сайтов лучше использовать WP-CLI скрипты для пакетного удаления, что уменьшит нагрузку на веб-сервер.
- Добавьте логирование удалений для аудита и отката в случае ошибок.
Сравнение способов автоматического удаления пользователей WordPress
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Через WP Cron и usermeta | Автоматизация, гибкость, нет сторонних плагинов | Требует добавления кода, зависит от WP Cron | Код из статьи |
| Плагины (например, Inactive User Deleter) | Простота установки, готовый функционал | Могут быть избыточными, нагрузка, несовместимости | Установка и настройка через админку |
| WP-CLI скрипты | Эффективно для больших баз, быстро | Требует доступа к серверу и знаний CLI | wp user delete $(wp user list --meta_key=last_login --meta_value=timestamp --meta_compare='<' --field=ID) |