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

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

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

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

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

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

1. Добавляем механизм отслеживания последнего входа

В файл functions.php вашей темы (желательно дочерней) или в кастомный плагин добавьте следующий код:

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

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

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

Теперь создадим функцию, которая будет удалять пользователей, не заходивших, например, более 180 дней:

function wpstandart_delete_inactive_users() {
    $threshold = strtotime('-180 days');
    $args = [
        'meta_key' => 'last_login',
        'meta_value' => $threshold,
        'meta_compare' => '<',
        'fields' => 'ID',
        'number' => 100,
    ];
    $user_query = new WP_User_Query($args);
    $users_to_delete = $user_query->get_results();
    
    foreach ($users_to_delete as $user_id) {
        require_once(ABSPATH . 'wp-admin/includes/user.php');
        wp_delete_user($user_id);
    }
}

Этот код ищет пользователей, чей last_login старше 180 дней, и удаляет их по 100 за раз (чтобы не перегружать сервер).

3. Автоматизируем запуск с помощью WP-Cron

Чтобы запускать удаление регулярно, регистрируем событие WP-Cron:

if (!wp_next_scheduled('wpstandart_cron_delete_inactive_users')) {
    wp_schedule_event(time(), 'daily', 'wpstandart_cron_delete_inactive_users');
}
add_action('wpstandart_cron_delete_inactive_users', 'wpstandart_delete_inactive_users');

Этот код запустит проверку и удаление пользователей один раз в сутки.

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

  • Войдите под учетной записью и убедитесь, что в базе данных у пользователя появилось мета-поле last_login с текущей меткой времени.
  • Выполните вручную функцию wpstandart_delete_inactive_users() через консоль WP-CLI или временно добавьте вызов функции в functions.php и обновите страницу, чтобы проверить удаление пользователей.
  • Проверьте, что пользователи с last_login старше 180 дней удаляются корректно.
  • Проверьте работу WP-Cron с помощью плагина «WP Crontrol» или аналогичного, чтобы убедиться, что задача запускается ежедневно.

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

  • Отсутствует поле last_login — если не обновлять дату входа, код не сможет найти неактивных пользователей. Убедитесь, что хук wp_login подключен и срабатывает.
  • Пользователи не удаляются — возможно, WP-Cron не работает на сервере из-за настроек хостинга. Проверьте логи и настройте альтернативный cron или запуск через системный cron.
  • Удаляются администраторы — в текущем коде нет фильтра по ролям. Чтобы избежать удаления админов, добавьте проверку роли перед удалением.
  • Проблемы с производительностью при большом числе пользователей — ограничьте количество пользователей для удаления за один запуск (параметр number).

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

  • Добавьте проверку ролей и удаляйте только пользователей с ролью subscriber или другими низкоправными ролями.
  • Резервное копирование базы — перед автоматическим удалением пользователей обязательно настраивайте регулярные бэкапы.
  • Для сайтов с большим трафиком и базами используйте WP-CLI для запуска удаления по расписанию вне WP-Cron.
  • Для контроля и логирования добавьте запись удалений в файл логов или системный журнал.

Пример улучшенного удаления с проверкой роли и логированием

function wpstandart_delete_inactive_users_safe() {
    $threshold = strtotime('-180 days');
    $args = [
        'meta_key' => 'last_login',
        'meta_value' => $threshold,
        'meta_compare' => '<',
        'fields' => 'ID',
        'number' => 50,
        'role__in' => ['subscriber', 'customer'], // только определённые роли
    ];
    $user_query = new WP_User_Query($args);
    $users_to_delete = $user_query->get_results();
    
    foreach ($users_to_delete as $user_id) {
        require_once(ABSPATH . 'wp-admin/includes/user.php');
        $result = wp_delete_user($user_id);
        if ($result) {
            error_log('Удалён неактивный пользователь ID: ' . $user_id);
        }
    }
}

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

МетодПлюсыМинусы
Код + WP-CronПолный контроль, без сторонних плагинов, можно кастомизироватьТребует навыков разработки, зависит от работы WP-Cron
Плагины (например, Inactive User Deleter)Простота установки, интерфейс управленияМогут быть избыточными, не всегда подходят под уникальные задачи
Ручное удалениеМаксимальный контроль, без автоматизацииНужно время, неэффективно при большом количестве пользователей
Как автоматически очистить WooCommerce от незаконченных заказов
30.06.2026
Как автоматически удалять неактивные заказы WooCommerce
30.05.2026
Автоудаление заказов WooCommerce по статусу и времени: практическое руководство
05.06.2026
Как добавить автозаполнение форм в WordPress с помощью jQuery
14.03.2026
Создание динамического фильтра товаров WooCommerce с примерами кода
23.01.2026