Диагностика проблемы: зачем удалять неактивных пользователей?
В крупных проектах на WordPress количество пользователей со временем растёт, включая тех, кто давно не заходил на сайт. Накопление таких аккаунтов увеличивает нагрузку на базу данных и может создавать риски безопасности, если у пользователей слабые пароли или устаревшие права доступа. Автоматическое удаление неактивных пользователей помогает поддерживать чистоту базы и безопасность сайта.
Как определить неактивных пользователей в WordPress?
По умолчанию WordPress хранит дату последнего входа пользователя в метаполе last_login только при использовании специальных плагинов, иначе такой информации нет. Для реализации автоматического удаления необходимо сначала отслеживать дату последнего входа.
Добавление отслеживания последнего входа
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин, чтобы сохранять дату входа пользователя:
function wp_save_last_login( $login, $user ) {
update_user_meta( $user->ID, 'last_login', current_time( 'timestamp' ) );
}
add_action( 'wp_login', 'wp_save_last_login', 10, 2 );Этот хук срабатывает при каждом успешном входе и обновляет метаполе last_login.
Пошаговое решение: автоматическое удаление пользователей неактивных более 180 дней
1. Создаём функцию для удаления
function wp_delete_inactive_users() {
$threshold = strtotime( '-180 days' ); // 180 дней назад
$args = array(
'meta_key' => 'last_login',
'meta_value' => $threshold,
'meta_compare' => '<',
'fields' => 'ID',
'number' => 100,
);
$users = get_users( $args );
foreach ( $users as $user_id ) {
// Исключаем администраторов и редакторов
$user = get_userdata( $user_id );
if ( in_array( 'administrator', $user->roles ) || in_array( 'editor', $user->roles ) ) {
continue;
}
wp_delete_user( $user_id );
}
}2. Автоматизируем запуск через WP-Cron
Добавим событие, которое будет запускать очистку раз в сутки.
function wp_schedule_inactive_user_cleanup() {
if ( ! wp_next_scheduled( 'wp_inactive_user_cleanup_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wp_inactive_user_cleanup_hook' );
}
}
add_action( 'wp', 'wp_schedule_inactive_user_cleanup' );
add_action( 'wp_inactive_user_cleanup_hook', 'wp_delete_inactive_users' );Проверка результата после внедрения
- Создайте тестового пользователя, не входившего в систему более 180 дней (можно вручную установить
last_loginв прошлом). - Запустите функцию
wp_delete_inactive_users()вручную через консоль WP-CLI:wp eval 'wp_delete_inactive_users();'. - Проверьте, что тестовый пользователь удалён из базы.
- Для проверки автоматического запуска можно временно изменить период на 1 день и проверить Cron через
wp cron event list.
Частые ошибки и как их исправить
- Отсутствие метаполя
last_loginу пользователей. Решение: убедитесь, что код, сохраняющий дату входа, активен и работает. - Удаление администраторов или важных пользователей. Добавляйте проверки ролей, как показано в примере, чтобы не удалить критичных аккаунтов.
- Функция не запускается автоматически. Проверьте, работает ли WP-Cron и нет ли конфликтов с плагинами, блокирующими Cron.
- Производительность при большом количестве пользователей. Ограничивайте количество пользователей за один проход (параметр
number), чтобы избежать таймаутов.
Практические советы по безопасности и производительности
- Не удаляйте пользователей без резервного копирования базы данных.
- Используйте WP-CLI для безопасного ручного запуска и отладки.
- Исключайте из удаления пользователей с особыми ролями и тех, кто недавно изменялся.
- Для больших сайтов рассмотрите пакетную обработку с отслеживанием прогресса.
- Для мониторинга можно добавить логирование удалений в файл или таблицу базы.
Таблица сравнения подходов к удалению неактивных пользователей
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин (например, Inactive User Deleter) | Удобство, готовый функционал, поддержка | Зависимость от стороннего кода, возможные конфликты |
| Кастомный код с WP-Cron (как в статье) | Гибкость, полное управление, отсутствие лишних функций | Требует навыков, ответственность за ошибки |
| Удаление вручную через WP-CLI | Безопасность и контроль | Неавтоматизировано, требует регулярного вмешательства |