Диагностика проблемы: зачем удалять неактивных пользователей
На больших сайтах WordPress часто накапливаются пользователи, которые зарегистрировались, но давно не заходили. Это может создавать нагрузку на базу данных, усложнять управление пользователями и потенциально снижать безопасность, если аккаунты неактивны долгое время. Автоматическое удаление таких пользователей по времени последнего входа — практическое решение для поддержания чистоты и оптимизации сайта.
Как определить неактивных пользователей WordPress
По умолчанию WordPress не хранит дату последнего входа пользователя в базу данных. Чтобы отследить активность, нужно добавить механизм логирования времени последнего логина. Это делается через хук wp_login.
Пример кода для записи времени последнего входа
function wpstandart_update_last_login( $user_login, $user ) {
update_user_meta( $user->ID, 'last_login', current_time( 'mysql' ) );
}
add_action( 'wp_login', 'wpstandart_update_last_login', 10, 2 );Этот код добавляет или обновляет мета-поле last_login с текущей датой и временем в формате MySQL после каждого успешного входа пользователя.
Пошаговое решение: автоматическое удаление неактивных пользователей
После того как ведётся учёт последнего входа, можно написать функцию, которая будет запускаться регулярно и удалять пользователей, не заходивших, например, более 180 дней.
Шаг 1. Создаем функцию удаления
function wpstandart_delete_inactive_users() {
$days_inactive = 180; // количество дней неактивности
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_inactive} days" ) );
$args = array(
'meta_key' => 'last_login',
'meta_value' => $date_threshold,
'meta_compare' => '<',
'fields' => 'ID',
'number' => -1
);
$users = get_users( $args );
foreach ( $users as $user_id ) {
// Не удаляем администраторов
if ( in_array( 'administrator', (array) get_userdata( $user_id )->roles ) ) {
continue;
}
wp_delete_user( $user_id );
}
}Шаг 2. Запускаем функцию автоматически через WP-Cron
Добавьте планировщик, чтобы функция выполнялась, например, раз в неделю.
// Регистрируем событие при активации темы или плагина
function wpstandart_schedule_inactive_user_deletion() {
if ( ! wp_next_scheduled( 'wpstandart_weekly_delete_inactive_users' ) ) {
wp_schedule_event( time(), 'weekly', 'wpstandart_weekly_delete_inactive_users' );
}
}
add_action( 'wp', 'wpstandart_schedule_inactive_user_deletion' );
// Привязываем функцию к событию
add_action( 'wpstandart_weekly_delete_inactive_users', 'wpstandart_delete_inactive_users' );
// Очистка планировщика при деактивации
function wpstandart_clear_schedule() {
$timestamp = wp_next_scheduled( 'wpstandart_weekly_delete_inactive_users' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpstandart_weekly_delete_inactive_users' );
}
}
register_deactivation_hook( __FILE__, 'wpstandart_clear_schedule' );Проверка результата после внедрения
- Войдите под тестовым пользователем и убедитесь, что в базе данных (таблица
wp_usermeta) для этого пользователя появляется полеlast_loginс текущей датой. - Запустите функцию удаления вручную, вызвав
wpstandart_delete_inactive_users()из консоли WP-CLI или временно черезadd_action('init', 'wpstandart_delete_inactive_users'), чтобы проверить удаление. - Проверьте, что администраторы не удаляются, а пользователи с датой последнего входа старше 180 дней удаляются.
- Подтвердите, что планировщик WP-Cron работает, используя плагин Query Monitor или WP Crontrol для мониторинга запланированных задач.
Частые ошибки и их исправление
- Отсутствие записи времени последнего входа: Без хука
wp_loginполеlast_loginне будет обновляться. Проверьте, что код срабатывает. - Удаление администраторов: Проверьте проверку ролей в функции удаления. Ошибки в проверке могут привести к удалению важных аккаунтов.
- WP-Cron не запускается: На некоторых серверах WP-Cron зависит от посещений сайта. Для автоматизации лучше настроить системный cron или проверить работу WP-Cron через плагины.
- Пользователи без
last_loginне учитываются: Если пользователь никогда не входил, у него нет мета-ключа. Можно дополнительно включить таких пользователей в удаление по другой логике.
Практические советы по безопасности и производительности
- Перед удалением пользователей создавайте резервную копию базы данных.
- Добавьте в функцию логирование удаленных пользователей для аудита.
- Не удаляйте пользователей с особыми ролями, кроме администратора можно исключить редакторов или других.
- Для больших сайтов выбирайте частоту удаления и количество пользователей для удаления за раз, чтобы не перегружать сервер.
Сравнение вариантов автоматического удаления неактивных пользователей
| Метод | Преимущества | Недостатки | Компромисс |
|---|---|---|---|
| Код с WP-Cron (как в статье) | Полный контроль, без сторонних плагинов | Требует технических навыков, зависит от WP-Cron | Использовать WP-Cron + системный cron для надежности |
| Плагины автоматического удаления | Простота настройки, готовые интерфейсы | Могут быть избыточными, нагрузка, безопасность | Выбирать проверенные плагины с рейтингом и поддержкой |
| Ручное удаление через SQL-запросы | Быстро для опытных администраторов | Риск ошибок, отсутствие автоматизации | Использовать для разовых чисток, не для регулярной работы |