Диагностика проблемы: зачем удалять неактивных пользователей
На крупных сайтах с регистрацией пользователей часто накапливаются неактивные аккаунты, которые не используются владельцами и занимают место в базе данных. Это может замедлять работу сайта, увеличивать нагрузку на сервер и создавать риски безопасности, так как забытые аккаунты могут быть уязвимы для взлома.
Первый шаг — определить, кто считается неактивным. Обычно это пользователи, которые давно не заходили на сайт (например, более 6 месяцев), и не совершали никаких действий.
Как проверить активность пользователей в базе
WordPress хранит дату последнего входа пользователя в поле last_login только если установлен соответствующий плагин или собственное решение. По умолчанию стандартный WordPress не ведет такую статистику, но есть поле user_registered с датой регистрации.
Для проверки активности без плагинов и дополнительных данных можно ориентироваться на дату последнего изменения профиля или метаданных, но это не всегда надежно. Лучший вариант — добавить механизм записи времени последнего входа.
Пошаговое решение: автоматическое удаление неактивных пользователей
1. Добавляем хранение даты последнего входа
Для точного отслеживания добавим хук на успешный вход пользователя и запишем дату в метаполе last_login:
add_action('wp_login', function($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}, 10, 2);2. Создаем функцию для удаления неактивных пользователей
Напишем функцию, которая будет удалять пользователей, не входивших более 180 дней (6 месяцев). Можно запускать ее вручную или через WP-Cron.
function delete_inactive_users($days = 180) {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . intval($days) . ' days'));
// Получаем IDs пользователей с last_login < $date_threshold или без last_login (новые пользователи без входов)
$user_ids = $wpdb->get_col($wpdb->prepare(
"SELECT u.ID FROM {$wpdb->users} u
LEFT JOIN {$wpdb->usermeta} um ON u.ID = um.user_id AND um.meta_key = 'last_login'
WHERE (um.meta_value < %s OR um.meta_value IS NULL) AND u.ID > 1",
$date_threshold
));
foreach ($user_ids as $user_id) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user($user_id);
}
return count($user_ids);
}3. Запускаем функцию по крону
Настроим WP-Cron, чтобы вызывать удаление раз в неделю:
add_action('weekly_delete_inactive_users', 'delete_inactive_users');
if (!wp_next_scheduled('weekly_delete_inactive_users')) {
wp_schedule_event(time(), 'weekly', 'weekly_delete_inactive_users');
}Проверка результата после внедрения
- Залогиньтесь под тестовым пользователем и проверьте, что в таблице
usermetaдля него появляется метаlast_loginс актуальным временем. - Запустите функцию
delete_inactive_users(180)вручную через админ-панель или через командную строку WP-CLI и проверьте, что неактивные аккаунты удаляются. - Проверьте, что WP-Cron событие запланировано и срабатывает (через плагин WP Crontrol или wp cron event list).
Частые ошибки и как их исправить
- Пользователи не удаляются: Проверьте, что ID пользователей не равны 1 (администратор), он не удаляется. Также убедитесь, что функция вызывается, а не просто объявлена.
- Нет мета last_login: Если не записывается время входа, проверьте правильность хука
wp_loginи параметры функции. - Удаление критичных пользователей: Добавьте исключения по ролям, если нужно сохранить админов или других важных пользователей.
- Проблемы с WP-Cron: Если крон не срабатывает, настройте реальный cron на сервер, чтобы запускать WP-Cron через wp-cron.php.
Практические советы по безопасности и производительности
- Перед удалением пользователей сделайте резервную копию базы.
- Добавьте логирование удалений в отдельный файл или базу для аудита.
- Ограничьте удаление пользователей с определенными ролями (например, админ, редактор) чтобы избежать проблем.
- Для больших сайтов делайте удаление пакетами по 50-100 пользователей, чтобы избежать таймаутов.
- Проверяйте и очищайте связанные с пользователями данные (комментарии, заказы WooCommerce) вручную или через дополнительные функции.
Сравнение вариантов удаления неактивных пользователей
| Вариант | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Удаление вручную через админку | Простота, контроль | Долго, неудобно на больших сайтах | Использовать для единичных случаев |
| Плагин для удаления | Автоматизация, удобный интерфейс | Зависимость от стороннего кода, нагрузка | Выбирать проверенные плагины, тестировать |
| Собственный код с WP-Cron | Гибкость, контроль, минимальная нагрузка | Требует навыков, настройка | Оптимальный для опытных разработчиков |