Что значит «неактивный пользователь» и зачем его удалять
В WordPress неактивными можно считать пользователей, которые не заходили на сайт длительное время и не проявляют активности. Обычно это гости, зарегистрированные без дальнейшего взаимодействия, либо заброшенные аккаунты. Их удаление помогает снизить нагрузку на базу данных, повысить безопасность (меньше потенциальных точек взлома) и улучшить управление пользователями.
Диагностика: как определить неактивных пользователей
В WordPress нет встроенного поля для последнего входа, поэтому сначала нужно добавить возможность отслеживать дату последнего логина.
Добавление метаполя для даты последнего входа
В файл functions.php вашей темы или в кастомный плагин добавьте следующий код, чтобы сохранять дату входа пользователя:
add_action('wp_login', 'update_last_login_meta', 10, 2);
function update_last_login_meta($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}Этот код будет обновлять метаполе last_login с датой и временем каждого входа пользователя.
Проверка текущих пользователей и даты последнего входа
Для диагностики используйте SQL-запрос в phpMyAdmin или WP CLI, чтобы посмотреть пользователей без даты логина или с очень старой датой:
SELECT ID, user_login, user_email, meta_value AS last_login
FROM wp_users
LEFT JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id AND wp_usermeta.meta_key = 'last_login'
ORDER BY last_login ASC NULLS FIRST
LIMIT 20;Пользователи с пустой датой или датой более 6 месяцев назад — кандидаты на удаление.
Пошаговое решение: как автоматически удалять неактивных пользователей
Для удаления добавим WP-Cron задачу, которая раз в сутки будет находить и удалять пользователей, не заходивших более 180 дней.
1. Добавляем функцию удаления в functions.php
function delete_inactive_users() {
$threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
$args = array(
'meta_key' => 'last_login',
'meta_compare' => '<',
'meta_value' => $threshold,
'fields' => 'ID',
'number' => 100,
);
$user_query = new WP_User_Query($args);
$users_to_delete = $user_query->get_results();
if (!empty($users_to_delete)) {
foreach ($users_to_delete as $user_id) {
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}
}
}
add_action('daily_delete_inactive_users_event', 'delete_inactive_users');2. Регистрируем ежедневное событие WP-Cron
function setup_daily_cron_for_user_deletion() {
if (!wp_next_scheduled('daily_delete_inactive_users_event')) {
wp_schedule_event(time(), 'daily', 'daily_delete_inactive_users_event');
}
}
add_action('wp', 'setup_daily_cron_for_user_deletion');Этот код добавит задание, которое будет запускаться раз в сутки и удалять пользователей старше 180 дней по дате последнего входа.
Проверка результата после внедрения
- Проверьте наличие метаполя
last_loginу пользователей через phpMyAdmin или WP CLI. - Запустите функцию вручную для теста, вызвав
delete_inactive_users();из консоли WP CLI или временно вызвав из админки. - Убедитесь, что пользователи с последним входом более 180 дней удаляются.
- Проверьте логи сервера на ошибки, связанные с wp_delete_user.
Частые ошибки и как их исправить
- Отсутствие даты последнего входа: если пользователи не заходили после установки кода,
last_loginотсутствует — такие пользователи не будут удалены. Для них можно добавить отдельную логику. - Удаление администраторов: wp_delete_user удаляет пользователя без проверки роли. Добавьте проверку, чтобы не удалять админов:
if (!in_array('administrator', get_userdata($user_id)->roles)) {
wp_delete_user($user_id);
}- Отсутствие запуска WP-Cron: на некоторых хостингах WP-Cron не срабатывает, если нет трафика. Настройте системный cron или запускайте вручную.
Практические советы по безопасности и производительности
- Используйте WP-CLI для массового тестирования и удаления пользователей, чтобы избежать таймаутов.
- Логируйте удаление пользователей в отдельный файл или базу данных для аудита.
- Добавьте резервное копирование базы данных перед автоматическим удалением.
- Чтобы избежать случайного удаления, установите минимальный срок «неактивности» (например, 180 дней).
- Если на сайте много пользователей, разбивайте удаление на партии по 50-100 пользователей за раз.
Чек-лист для настройки автоматического удаления неактивных пользователей
- Добавлен хук
wp_loginдля обновленияlast_login - Проверена корректность данных
last_loginу пользователей - Создана функция удаления пользователей старше порогового срока
- Настроено ежедневное событие WP-Cron для вызова функции удаления
- Добавлена проверка ролей, чтобы не удалять администраторов
- Проведено тестирование функции вручную
- Проверены логи и ошибки
- Рассмотрено резервное копирование базы перед массовым удалением