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

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

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

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

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

  • Дата последнего входа (meta_key last_login или подобное, если ведётся логин-активность);
  • Дата последнего заказа;
  • Дата регистрации и отсутствие активности.

В стандартном WooCommerce дата последнего заказа хранится как дата последнего опубликованного заказа пользователя, а дата последнего входа — обычно отсутствует в базе по умолчанию. Поэтому для точного анализа нужно дополнительно сохранять дату последнего логина через хук.

Добавление мета даты последнего входа пользователя

Чтобы отслеживать дату последнего входа пользователя, добавьте следующий код в functions.php вашей темы или в кастомный плагин:

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

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

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

1. Определяем порог неактивности, например, 365 дней без входа и без заказов.
2. На основании данных last_login и даты последнего заказа формируем список пользователей-кандидатов на удаление.
3. Запускаем WP-Cron задачу для автоматического удаления таких пользователей.

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

function wptest_delete_inactive_users() {
    $threshold = strtotime('-365 days');

    // Получаем пользователей, у которых last_login старше порога
    $args = [
        'meta_key' => 'last_login',
        'meta_value' => date('Y-m-d H:i:s', $threshold),
        'meta_compare' => '<',
        'fields' => 'ID',
        'role__in' => ['customer'],
        'number' => -1
    ];

    $users = get_users($args);

    foreach ($users as $user_id) {
        // Проверяем последний заказ
        $args_orders = [
            'customer_id' => $user_id,
            'limit' => 1,
            'orderby' => 'date',
            'order' => 'DESC',
            'return' => 'ids'
        ];
        $orders = wc_get_orders($args_orders);

        if (empty($orders)) {
            // Нет заказов — удаляем
            require_once(ABSPATH . 'wp-admin/includes/user.php');
            wp_delete_user($user_id);
        } else {
            // Проверяем дату последнего заказа
            $order_date = strtotime($orders[0]->get_date_created());
            if ($order_date < $threshold) {
                wp_delete_user($user_id);
            }
        }
    }
}

// Регистрируем CRON задачу
add_action('wptest_daily_cleanup', 'wptest_delete_inactive_users');

// Активируем задачу при активации темы/плагина
function wptest_schedule_cleanup() {
    if (!wp_next_scheduled('wptest_daily_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wptest_daily_cleanup');
    }
}
add_action('wp', 'wptest_schedule_cleanup');

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

Для проверки работы сценария:

  • Отслеживайте логи и количество пользователей в админке (Пользователи > Все пользователи) до и после запуска задачи;
    можно временно добавить error_log в функцию удаления для вывода ID удалённых пользователей;
  • Запустите CRON вручную через WP-CLI wp cron event run wptest_daily_cleanup или программно;
  • Убедитесь, что пользователи с последним входом или заказом старше 365 дней удалены.

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

  • Отсутствие данных о последнем входе: Без сохранения last_login функция не сможет определить неактивных пользователей. Решение: внедрите регистрацию даты логина через хук wp_login.
  • Удаление администраторов или важных ролей: Проверьте фильтр ролей, чтобы удалять только нужные (например, 'customer').
  • Ошибка при удалении пользователя: Убедитесь, что подключена функция wp_delete_user (файл wp-admin/includes/user.php подключён).
  • CRON-задача не запускается: Проверьте, включён ли WP-Cron и нет ли конфликтов с сервером.

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

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

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

МетодОписаниеПлюсыМинусы
Плагин (например, WP Bulk Delete)Готовое решение с настройками фильтровПросто настроить, нет кодаМожет быть избыточным, нагружает сайт
Кастомный код с WP-CronТочный контроль логики удаленияГибкость, интеграция с бизнес-логикойТребует знаний PHP, поддержки кода
Удаление вручную через SQL-запросыБыстрая очистка через базу данныхОчень быстро при больших данныхРиск ошибок, потеря данных без логики
Как настроить автоматическое удаление забытых корзин в WooCommerce
10.05.2026
Как избежать проблем с загрузкой больших файлов в WordPress
14.06.2026
Как удалить автоматически пустые категории в WordPress
24.03.2026
Автоматический импорт постов из Яндекс.Дзен в WordPress
16.02.2026
Как автоматизировать удаление старого контента в WordPress без плагинов
14.03.2026