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

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

В крупных WordPress-сайтах, особенно с регистрацией и пользовательскими ролями, со временем накапливаются неактивные аккаунты. Они могут негативно влиять на безопасность, нагрузку на базу данных и управляемость сайта. Если автоматизировать удаление неактивных пользователей, можно поддерживать чистоту базы и ускорить работу админки.

Под неактивными пользователями обычно понимают тех, кто не заходил на сайт (не авторизовывался) в течение определённого периода, например, 6 месяцев или год.

Как определить неактивных пользователей в WordPress

WordPress по умолчанию не хранит дату последнего входа пользователя, поэтому сначала нужно добавить такую функциональность.

Добавление записи времени последнего входа

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

function update_last_login( $user_login, $user ) {
    update_user_meta( $user->ID, 'last_login', current_time( 'timestamp' ) );
}
add_action( 'wp_login', 'update_last_login', 10, 2 );

Теперь у каждого пользователя в базе появится метаполе last_login с UNIX-таймстампом последнего входа.

Пошаговое решение: скрипт удаления неактивных пользователей

Создадим PHP-скрипт, который можно запускать вручную или через WP-Cron для удаления пользователей, не заходивших более 6 месяцев.

function delete_inactive_users( $months = 6 ) {
    $cutoff = strtotime( '-' . intval( $months ) . ' months' );

    $args = array(
        'meta_key' => 'last_login',
        'meta_value' => $cutoff,
        'meta_compare' => '<',
        'fields' => 'ID',
        'number' => 1000, // лимит по числу пользователей
    );
    $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 );
        }
        return count( $users_to_delete );
    }
    return 0;
}

Вызов delete_inactive_users(6); удалит всех, кто не заходил более 6 месяцев.

Как запускать скрипт автоматически через WP-Cron

Для автоматизации можно добавить задачу в WP-Cron, которая будет запускать функцию ежемесячно:

function schedule_inactive_user_cleanup() {
    if ( ! wp_next_scheduled( 'inactive_user_cleanup_hook' ) ) {
        wp_schedule_event( time(), 'monthly', 'inactive_user_cleanup_hook' );
    }
}
add_action( 'wp', 'schedule_inactive_user_cleanup' );

add_action( 'inactive_user_cleanup_hook', function() {
    delete_inactive_users( 6 );
} );

Проверка результата после внедрения

  • В базе данных в таблице wp_usermeta появятся метаполя last_login у пользователей, которые входили на сайт.
  • Выполните вручную функцию delete_inactive_users(6) и проверьте, что пользователи с датой последнего входа старше 6 месяцев удалены.
  • Посмотрите лог ошибок или добавьте в функцию логирование, чтобы убедиться, что удаление прошло успешно.

Частые ошибки и как их исправить

  • Нет записи last_login для некоторых пользователей — они никогда не входили, или поле не обновилось. В этом случае их можно считать неактивными и удалить отдельно, например, с помощью дополнительного условия.
  • Удаляются администраторы или важные роли — добавьте фильтр исключения определённых ролей из удаления:
$args['role__not_in'] = array('administrator', 'editor');
  • Функция wp_delete_user() не работает из-за недостатка прав — убедитесь, что скрипт запускается с достаточными правами, например, через WP-Cron или из админки.

Практические советы по безопасности и производительности

  • Обязательно создавайте резервные копии базы перед массовым удалением пользователей.
  • Не пытайтесь удалять большое число пользователей за один запуск — используйте параметр number у WP_User_Query для пакетной обработки.
  • Исключайте из удаления пользователей с ролями администратора или модератора.
  • Для оптимизации запросов добавьте индексы по метаполям, если трафик и база большие.
  • Логируйте удаление в отдельный файл, чтобы быстро отслеживать действия.

Сравнение вариантов: плагин vs собственный код

КритерийПлагинСобственный кодКомпромисс
ГибкостьОграничена настройкамиПолный контрольКод с настройками в админке
Риск конфликтовВозможныМинимальныйТестирование на стенде
ЗависимостиНовые зависимостиОтсутствуютМинимальные базы кода
ОбновленияАвтоматическиеТребуют поддержкиИспользовать WP-CLI для запуска
WooCommerce: как автоматически удалять заказы по статусу с помощью кода
29.05.2026
Автоматическое удаление неактивных товаров в WooCommerce: практическое решение
23.05.2026
Как избежать ошибки Allowed memory size в WordPress
29.11.2025
Как отключить XML-RPC в WordPress для повышения безопасности
02.01.2026
Как создать фильтрованные новости в WordPress с помощью AJAX
20.03.2026