Диагностика проблемы: зачем и когда удалять неактивных пользователей
В крупных проектах на WordPress со временем накапливаются неактивные пользователи, которые не заходят на сайт месяцами или годами. Это может создавать проблемы с безопасностью (забытые аккаунты легче взломать), а также замедлять работу админки и усложнять управление пользователями.
Четко определить неактивных пользователей можно по дате последнего входа в систему. Если эта дата отсутствует, можно ориентироваться на дату регистрации или дату последней активности, если она логируется.
Как получить список неактивных пользователей для анализа
WordPress по умолчанию не хранит дату последнего входа. Для диагностики можно добавить следующий код в functions.php или отдельный плагин, чтобы фиксировать время последнего входа:
function record_last_login($login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}
add_action('wp_login', 'record_last_login', 10, 2);После недели работы этого кода можно собрать список неактивных пользователей, например, тех, кто не входил более 180 дней:
$args = [
'meta_key' => 'last_login',
'meta_value' => date('Y-m-d H:i:s', strtotime('-180 days')),
'meta_compare' => '<=',
'fields' => 'ID',
];
$inactive_users = get_users($args);Пошаговое решение: автоматическое удаление неактивных пользователей
Ниже пример функции, которая удаляет пользователей, не заходивших более 180 дней и не имеющих ролей администратора или редактора:
function delete_inactive_users($days = 180) {
$threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'meta_key' => 'last_login',
'meta_value' => $threshold,
'meta_compare' => '<=',
'fields' => ['ID', 'roles'],
];
$users = get_users($args);
foreach ($users as $user) {
if (in_array('administrator', $user->roles) || in_array('editor', $user->roles)) {
continue; // не удаляем важных пользователей
}
wp_delete_user($user->ID);
}
}
// Запуск удаления
// delete_inactive_users();Рекомендуется запускать эту функцию через WP-Cron с интервалом, например, раз в месяц.
Как проверить, что удаление сработало
- Перед запуском сделайте экспорт пользователей (через phpMyAdmin или плагины типа Export Users to CSV).
- После запуска функции проверьте, что пользователи с датой последнего входа раньше порога действительно удалены.
- В админке WordPress зайдите в раздел «Пользователи» и убедитесь, что количество пользователей уменьшилось.
- Проверьте логи сайта, если есть, на предмет ошибок в процессе удаления.
Частые ошибки и как их исправить
- Отсутствует мета last_login: если код записи даты последнего входа не был установлен заранее, функция ничего не удалит. Решение — добавить код записи и подождать накопления данных.
- Удаляются администраторы или редакторы: проверьте условие проверки ролей, чтобы не затронуть критичных пользователей.
- Ошибка wp_delete_user из-за связей: если пользователь связан с контентом, wp_delete_user требует передачу ID другого автора для переназначения. Можно использовать wp_delete_user($user_id, $reassign_id), где $reassign_id — пользователь-администратор.
- Функция вызывается слишком часто: чтобы избежать нагрузки, запускайте удаление раз в месяц через wp_schedule_event.
Практические советы по безопасности и производительности
- Перед удалением всегда делайте резервную копию базы данных.
- Не удаляйте пользователей без учета их ролей и контента — это может привести к потере данных.
- Для большого числа пользователей используйте пакетное удаление, чтобы не перегрузить сервер.
- Добавьте логирование удалений для аудита и отката при необходимости.
Сравнение вариантов реализации удаления неактивных пользователей
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин (например, Inactive User Deleter) | Быстро, готовое решение | Могут быть избыточные функции, нагрузка | Использовать только проверенные плагины с хорошими отзывами |
| Кастомный код с last_login | Точный контроль, можно адаптировать | Нужно время на накопление данных, требует поддержки | Запускать через WP-Cron, логировать |
| Удаление по дате регистрации | Просто реализовать | Не учитывает активность, можно удалить нужных пользователей | Использовать только для новых сайтов или с доп. проверками |