Диагностика проблемы: зачем и когда удалять неактивных пользователей
На крупных сайтах с регистрацией пользователей часто накапливаются аккаунты, которые не использовались длительное время. Это создает нагрузку на базу данных и может стать угрозой безопасности, если учетные записи заброшены, но имеют высокие права доступа. Автоматическое удаление таких пользователей поможет поддерживать чистоту базы и снизить риски.
Как определить неактивных пользователей?
Стандартный способ — ориентироваться на дату последнего входа. WordPress по умолчанию не хранит дату последнего логина, но её можно добавить и обновлять при каждом входе пользователя.
Пошаговое решение: реализация автоматического удаления неактивных пользователей
1. Добавляем механизм отслеживания последнего входа
В файл functions.php вашей темы (желательно дочерней) или в кастомный плагин добавьте следующий код:
function wpstandart_update_last_login($login, $user) {
update_user_meta($user->ID, 'last_login', current_time('timestamp'));
}
add_action('wp_login', 'wpstandart_update_last_login', 10, 2);Этот код сохраняет мета-поле last_login с UNIX-меткой времени при каждом входе пользователя.
2. Создаем функцию удаления неактивных пользователей
Теперь создадим функцию, которая будет удалять пользователей, не заходивших, например, более 180 дней:
function wpstandart_delete_inactive_users() {
$threshold = strtotime('-180 days');
$args = [
'meta_key' => 'last_login',
'meta_value' => $threshold,
'meta_compare' => '<',
'fields' => 'ID',
'number' => 100,
];
$user_query = new WP_User_Query($args);
$users_to_delete = $user_query->get_results();
foreach ($users_to_delete as $user_id) {
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}
}Этот код ищет пользователей, чей last_login старше 180 дней, и удаляет их по 100 за раз (чтобы не перегружать сервер).
3. Автоматизируем запуск с помощью WP-Cron
Чтобы запускать удаление регулярно, регистрируем событие WP-Cron:
if (!wp_next_scheduled('wpstandart_cron_delete_inactive_users')) {
wp_schedule_event(time(), 'daily', 'wpstandart_cron_delete_inactive_users');
}
add_action('wpstandart_cron_delete_inactive_users', 'wpstandart_delete_inactive_users');Этот код запустит проверку и удаление пользователей один раз в сутки.
Проверка результата после внедрения
- Войдите под учетной записью и убедитесь, что в базе данных у пользователя появилось мета-поле
last_loginс текущей меткой времени. - Выполните вручную функцию
wpstandart_delete_inactive_users()через консоль WP-CLI или временно добавьте вызов функции вfunctions.phpи обновите страницу, чтобы проверить удаление пользователей. - Проверьте, что пользователи с
last_loginстарше 180 дней удаляются корректно. - Проверьте работу WP-Cron с помощью плагина «WP Crontrol» или аналогичного, чтобы убедиться, что задача запускается ежедневно.
Частые ошибки и как их исправить
- Отсутствует поле
last_login— если не обновлять дату входа, код не сможет найти неактивных пользователей. Убедитесь, что хукwp_loginподключен и срабатывает. - Пользователи не удаляются — возможно, WP-Cron не работает на сервере из-за настроек хостинга. Проверьте логи и настройте альтернативный cron или запуск через системный cron.
- Удаляются администраторы — в текущем коде нет фильтра по ролям. Чтобы избежать удаления админов, добавьте проверку роли перед удалением.
- Проблемы с производительностью при большом числе пользователей — ограничьте количество пользователей для удаления за один запуск (параметр
number).
Практические советы по безопасности и производительности
- Добавьте проверку ролей и удаляйте только пользователей с ролью
subscriberили другими низкоправными ролями. - Резервное копирование базы — перед автоматическим удалением пользователей обязательно настраивайте регулярные бэкапы.
- Для сайтов с большим трафиком и базами используйте WP-CLI для запуска удаления по расписанию вне WP-Cron.
- Для контроля и логирования добавьте запись удалений в файл логов или системный журнал.
Пример улучшенного удаления с проверкой роли и логированием
function wpstandart_delete_inactive_users_safe() {
$threshold = strtotime('-180 days');
$args = [
'meta_key' => 'last_login',
'meta_value' => $threshold,
'meta_compare' => '<',
'fields' => 'ID',
'number' => 50,
'role__in' => ['subscriber', 'customer'], // только определённые роли
];
$user_query = new WP_User_Query($args);
$users_to_delete = $user_query->get_results();
foreach ($users_to_delete as $user_id) {
require_once(ABSPATH . 'wp-admin/includes/user.php');
$result = wp_delete_user($user_id);
if ($result) {
error_log('Удалён неактивный пользователь ID: ' . $user_id);
}
}
}Сравнение вариантов удаления неактивных пользователей
| Метод | Плюсы | Минусы |
|---|---|---|
| Код + WP-Cron | Полный контроль, без сторонних плагинов, можно кастомизировать | Требует навыков разработки, зависит от работы WP-Cron |
| Плагины (например, Inactive User Deleter) | Простота установки, интерфейс управления | Могут быть избыточными, не всегда подходят под уникальные задачи |
| Ручное удаление | Максимальный контроль, без автоматизации | Нужно время, неэффективно при большом количестве пользователей |