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

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

Неактивные пользователи на сайте WordPress могут создавать нагрузку на базу данных и потенциально увеличивать риски безопасности. Особенно это актуально для сайтов с регистрацией пользователей, таких как интернет-магазины на WooCommerce, сообщества или порталы. Удаление пользователей, которые не заходили на сайт долгое время (например, более 6 месяцев), позволяет поддерживать базу данных в актуальном состоянии и уменьшить вероятность компрометации аккаунтов.

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

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

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

function wptips_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', // предполагается, что есть мета "last_login"
        'meta_value' => $date_threshold,
        'meta_compare' => '<',
        'fields' => 'ID',
        'number' => -1,
        'exclude' => array(1), // исключаем администратора с ID 1
    );

    $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) {
            wp_delete_user($user_id);
        }
    }
}

Важно: WordPress по умолчанию не хранит дату последнего входа пользователя. Для этого нужно заранее организовать сохранение этого значения, например, с помощью хука wp_login:

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

2. Планируем задачу WP-Cron

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

function wptips_schedule_inactive_users_cleanup() {
    if (!wp_next_scheduled('wptips_daily_inactive_user_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wptips_daily_inactive_user_cleanup');
    }
}
add_action('wp', 'wptips_schedule_inactive_users_cleanup');

add_action('wptips_daily_inactive_user_cleanup', 'wptips_delete_inactive_users');

Как проверить, что решение работает

  • Убедитесь, что в базе правильно сохраняется мета last_login для пользователей (проверьте таблицу wp_usermeta или через админку).
  • Запустите функцию удаления вручную, вызвав wptips_delete_inactive_users() из консоли WP-CLI или временно через админ-панель, чтобы проверить удаление.
  • Проверьте журнал ошибок сервера или лог плагина, чтобы убедиться в отсутствии ошибок.
  • Через несколько дней убедитесь, что пользователи с датой последнего входа старше порога удаляются автоматически.

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

  • Отсутствие мета last_login: функция ничего не удалит, если дата последнего входа не сохраняется. Решение — реализовать сохранение даты входа через хук wp_login.
  • Удаляется администратор: будьте внимательны с ID пользователей. В коде исключён пользователь с ID 1, но если у вас несколько админов, добавьте их в исключения.
  • WP-Cron не запускается автоматически: стандартный WP-Cron работает только при посещениях сайта. Для надежности настройте системный cron на сервере для вызова wp-cron.php.
  • Ошибка удаления пользователей: убедитесь, что у пользователя, под которым работает скрипт, есть права на удаление пользователей и подключена функция wp_delete_user.

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

  • Перед удалением пользователей создавайте резервные копии базы или экспортируйте список удаляемых пользователей.
  • Ограничьте удаление только теми пользователями, которые действительно неактивны и не имеют важных ролей.
  • Для больших сайтов разбивайте процесс удаления на части, чтобы избежать превышения лимита времени выполнения скрипта.
  • Для точного учета активности можно дополнительно отслеживать последние действия в пользовательских сессиях или действиях WooCommerce.

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

МетодПлюсыМинусы
WP-Cron + пользовательская функцияПолный контроль, нет зависимости от плагинов, можно адаптировать под любые требованияНеобходима настройка отслеживания last_login, WP-Cron зависит от посещений сайта
Плагины для очистки пользователей (например, Inactive User Deleter)Простота использования, готовые настройки и интерфейсМогут быть избыточными, нагрузка при больших базах, меньше гибкости
Ручное удаление через SQL-запросыБыстро и без нагрузки на сайтРиск ошибок, отсутствие логики проверки ролей и безопасности
Как устроен AJAX в WooCommerce и как его оптимизировать
30.04.2026
Как отключить автоматическое преобразование HTML в WooCommerce без плагинов
12.06.2026
Как использовать REST API в WordPress для создания нестандартных эндпоинтов
09.12.2025
Как установить ограничения на регистрацию пользователей в WordPress
24.03.2026
Как удалить или изменить slug постов в WordPress без редиректа
10.02.2026