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

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

В крупных проектах на 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Безопасность и контрольНеавтоматизировано, требует регулярного вмешательства
Как использовать WPReset для автоматического восстановления WordPress после ошибок
23.12.2025
Как удалить оставшиеся виджеты после удаления плагинов WordPress
28.05.2026
Оптимизация базы данных WordPress при больших объемах данных
13.12.2025
Как создать и использовать собственные типы записей (Custom Post Types) в WordPress
22.11.2025
Как отключить и удалить редактор Gutenberg в WordPress без потери данных
07.05.2026