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

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

Большие сайты на WordPress с регистрацией пользователей часто сталкиваются с проблемой накопления неактивных аккаунтов. Это увеличивает размер базы данных, замедляет запросы и может создавать риск безопасности. Вопрос: как автоматически и безопасно удалять пользователей, которые не заходили на сайт, например, более 6 месяцев?

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

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

Добавляем мета-поле с датой последнего входа

Добавим код в functions.php активной темы или в отдельный сниппет, который будет обновлять мета-поле last_login при каждом успешном входе пользователя:

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

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

Пошаговое решение: автоматическое удаление

1. Создаем функцию удаления неактивных пользователей

function delete_inactive_users() {
    $threshold = strtotime( '-6 months' ); // 6 месяцев назад

    $args = array(
        'meta_key'     => 'last_login',
        'meta_value'   => date( 'Y-m-d H:i:s', $threshold ),
        'meta_compare' => '<',
        'fields'       => 'ID',
        'number'       => -1
    );

    $user_query = new WP_User_Query( $args );
    $users = $user_query->get_results();

    if ( ! empty( $users ) ) {
        foreach ( $users as $user_id ) {
            require_once( ABSPATH . 'wp-admin/includes/user.php' );
            wp_delete_user( $user_id );
        }
    }
}

2. Запускаем функцию по расписанию с помощью WP-Cron

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

function schedule_inactive_user_deletion() {
    if ( ! wp_next_scheduled( 'delete_inactive_users_event' ) ) {
        wp_schedule_event( time(), 'weekly', 'delete_inactive_users_event' );
    }
}
add_action( 'wp', 'schedule_inactive_user_deletion' );

add_action( 'delete_inactive_users_event', 'delete_inactive_users' );

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

  • В базе данных в таблице wp_usermeta проверьте наличие метаполя last_login у пользователей.
  • Отслеживайте журнал ошибок и логи сервера, чтобы убедиться, что Cron-задача выполняется.
  • Добавьте временный лог в функцию удаления, например, записывайте ID удаленных пользователей в отдельный файл или в лог WordPress:
function delete_inactive_users() {
    $threshold = strtotime( '-6 months' );
    $args = array(
        'meta_key' => 'last_login',
        'meta_value' => date( 'Y-m-d H:i:s', $threshold ),
        'meta_compare' => '<',
        'fields' => 'ID',
        'number' => -1
    );
    $user_query = new WP_User_Query( $args );
    $users = $user_query->get_results();

    if ( ! empty( $users ) ) {
        foreach ( $users as $user_id ) {
            error_log( 'Deleting user ID: ' . $user_id );
            require_once( ABSPATH . 'wp-admin/includes/user.php' );
            wp_delete_user( $user_id );
        }
    }
}

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

  • Отсутствие мета-поля last_login: Если вы не добавили отслеживание даты последнего входа, удаление не сработает. Проверьте, что хук wp_login подключен правильно.
  • Неправильный формат даты: Используйте current_time('mysql') для записи и Y-m-d H:i:s для сравнения.
  • WP-Cron не срабатывает: По умолчанию WP-Cron срабатывает при посещении сайта. Для надежности настройте системный cron на вызов wp-cron.php.
  • Удаление администраторов: Проверьте, что функция не удаляет пользователей с ролью администратора (можно добавить фильтр в запрос).

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

  • Добавьте фильтр по ролям, чтобы не удалять администраторов и важных пользователей:
$args['role__not_in'] = array('Administrator');
  • Для больших сайтов лучше удалять пользователей пакетами по 50-100 за один запуск, чтобы избежать таймаутов:
$args['number'] = 100;
  • Логируйте удаление пользователей для аудита и восстановления при ошибках.
  • Регулярно проверяйте базу данных и оптимизируйте таблицы, чтобы избежать фрагментации после удаления.
  • Если нужны дополнительные отчеты, можно расширить функцию, отправляя уведомления администратору после удаления.
  • Для упрощения работы с пользователями рассмотрите Clearfy Pro с функциями оптимизации и очистки пользователей https://wpshop.ru/plugins/clearfy?source=wplessons.ru&medium=article&campaign=kak-avtomaticheski-udaljat-neaktivnyh-polzovatelej-v-wordpress-bez-plaginov

Сравнение вариантов удаления неактивных пользователей

МетодПлюсыМинусыПример
Собственный код + WP-CronПолный контроль, без плагиновТребует навыков и поддержкиКод из статьи
Плагины очистки пользователейУдобство и интерфейсДополнительная нагрузка, возможные конфликтыBetter Delete User, WP Bulk Delete
Ручная очистка через админкуПростотаТрудоемко, риск пропуститьАдминка WordPress
Как использовать шорткод в WooCommerce для отображения данных заказа
08.07.2026
Как использовать метод pre_get_posts для создания сложного фильтрования в WordPress
05.03.2026
Как отключить автовыделение и автозагрузку изображений в WordPress
02.03.2026
Как автоматически удалить товар из заказов WooCommerce после отмены или возврата
18.04.2026
Как создать собственный виджет в WordPress с примером кода
30.11.2025