Как автоматически удалять неактивных пользователей WordPress по времени последнего входа

Диагностика проблемы: зачем удалять неактивных пользователей

На больших сайтах 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-запросыБыстро для опытных администраторовРиск ошибок, отсутствие автоматизацииИспользовать для разовых чисток, не для регулярной работы
Автоматическое удаление неактивных пользователей в WordPress: практическое руководство
19.06.2026
Как создать автоматический импорт картинок в WordPress из внешнего источника
20.01.2026
Как правильно удалить или изменить URL продуктов в WooCommerce без потери SEO
17.04.2026
Автоматическое удаление старых черновиков в WordPress
22.12.2025
Как скрыть цены WooCommerce для незарегистрированных пользователей
15.05.2026