WooCommerce: автоматическое удаление неактивных клиентов по времени

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

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

Как определить неактивного клиента

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

Пошаговое решение: автоматическое удаление неактивных клиентов с помощью WP CLI и WP Cron

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

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

function wc_delete_inactive_customers() {
    $period = 365; // дней
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$period} days"));

    // Получаем пользователей с ролью 'customer' без заказов за период
    $args = [
        'role' => 'customer',
        'meta_query' => [
            'relation' => 'OR',
            [
                'key' => '_last_order_date',
                'value' => $date_threshold,
                'compare' => '<',
                'type' => 'DATETIME'
            ],
            [
                'key' => '_last_order_date',
                'compare' => 'NOT EXISTS'
            ]
        ]
    ];
    $users = get_users($args);

    foreach ($users as $user) {
        // Проверяем заказы пользователя
        $orders = wc_get_orders([
            'customer_id' => $user->ID,
            'limit' => 1,
            'orderby' => 'date',
            'order' => 'DESC'
        ]);
        
        if (empty($orders)) {
            // Удаляем пользователя без заказов
            wp_delete_user($user->ID);
        } else {
            $last_order = reset($orders);
            if ($last_order->get_date_created()->date('Y-m-d H:i:s') < $date_threshold) {
                wp_delete_user($user->ID);
            }
        }
    }
}

2. Регистрируем событие WP Cron для регулярного запуска

if (!wp_next_scheduled('wc_delete_inactive_customers_event')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_inactive_customers_event');
}

add_action('wc_delete_inactive_customers_event', 'wc_delete_inactive_customers');

3. Добавляем мета-обновление даты последнего заказа

Чтобы оптимизировать выборку, обновляем мета-поле _last_order_date при каждом новом заказе:

add_action('woocommerce_thankyou', function($order_id) {
    $order = wc_get_order($order_id);
    if (!$order) return;

    $user_id = $order->get_user_id();
    if ($user_id) {
        update_user_meta($user_id, '_last_order_date', $order->get_date_created()->date('Y-m-d H:i:s'));
    }
});

Проверка результата

  • Запустите функцию вручную через WP CLI: wp eval 'wc_delete_inactive_customers();' — проверьте, что неактивные клиенты удаляются.
  • Проверьте, что планировщик срабатывает: wp cron event list должен содержать wc_delete_inactive_customers_event.
  • В базе данных пользователи с ролью 'customer', у которых нет заказов или заказы старше 365 дней, должны быть удалены.

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

  • Пользователи не удаляются: проверьте правильность ролей и наличие мета-полей, убедитесь, что функция вызывается (например, через WP CLI).
  • Планировщик задач не запускается: убедитесь, что у вас правильно настроен WP Cron (если сайт с низким трафиком, WP Cron может не запускаться автоматически).
  • Удаляются не те пользователи: проверьте логику даты и сравнения, используйте дебаг с error_log() для вывода ID пользователей перед удалением.

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

  • Перед массовым удалением сделайте резервную копию базы данных.
  • Ограничьте количество пользователей, удаляемых за один запуск, чтобы избежать таймаутов. Например, добавьте параметр 'number' => 50 в get_users.
  • Для крупных баз используйте WP CLI скрипт с пагинацией для пакетной обработки.
  • Добавьте логирование удалённых пользователей для аудита.
  • Не удаляйте пользователей с другими ролями и правами — проверяйте роль customer.

Сравнение способов удаления неактивных клиентов

МетодПлюсыМинусыРекомендуется для
Код с WP Cron и хуками (как в статье)Без плагинов, гибко, масштабируемоНужны базовые знания PHP, настройка WP CronСредние и крупные магазины с контролем процесса
Плагины удаления пользователей (User Cleaner и др.)Простота, GUIМогут конфликтовать, лишний кодМаленькие магазины, без разработчика
Ручное удаление через админкуПросто, без кодаТрудозатратно, риск ошибокОчень маленькие проекты
Автоматические записи в WordPress: создание и настройка по расписанию
01.02.2026
WooCommerce: как автоматически удалять отменённые заказы и товары из них
07.05.2026
Автоматическое удаление спам комментариев в WordPress
20.12.2025
Как удалить постоянные редиректы в WordPress: практическое руководство
26.03.2026
Отслеживание изменений в сообщениях комментариев WordPress
05.02.2026

Обучение разработке на WordPress, как создавать темы, плагины. Подробнее об обучении.