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

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

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

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

Чаще всего под неактивным клиентом понимают пользователя, который:

  • Не совершал покупок в течение заданного периода (например, 6 месяцев);
  • Не заходил в свой аккаунт;
  • Не проявлял активности (отсутствие заказов, отзывов и т.п.).

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

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

1. Создаем WP-Cron задачу для регулярной проверки

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

if ( ! wp_next_scheduled( 'remove_inactive_customers_weekly' ) ) {
    wp_schedule_event( time(), 'weekly', 'remove_inactive_customers_weekly' );
}

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

Функция будет искать пользователей с ролью "customer", у которых нет заказов за последние 180 дней (6 месяцев), и удалять их.

function remove_inactive_customers() {
    $cutoff_date = date( 'Y-m-d H:i:s', strtotime( '-180 days' ) );

    // Получаем всех клиентов
    $args = [
        'role' => 'customer',
        'fields' => ['ID'],
        'meta_query' => [
            'relation' => 'OR',
            [
                'key' => '_last_order_date',
                'value' => $cutoff_date,
                'compare' => '<',
                'type' => 'DATETIME',
            ],
            [
                'key' => '_last_order_date',
                'compare' => 'NOT EXISTS'
            ]
        ]
    ];

    $user_query = new WP_User_Query( $args );

    if ( ! empty( $user_query->results ) ) {
        foreach ( $user_query->results as $user_id ) {
            // Проверяем, есть ли у пользователя заказы после cutoff_date
            $orders = wc_get_orders([
                'customer_id' => $user_id,
                'date_created' => '>' . $cutoff_date,
                'limit' => 1
            ]);

            if ( empty( $orders ) ) {
                wp_delete_user( $user_id );
            }
        }
    }
}
add_action( 'remove_inactive_customers_weekly', 'remove_inactive_customers' );

3. Оптимизация: кэширование даты последнего заказа

Для ускорения выборки можно сохранить дату последнего заказа пользователя в метаполе "_last_order_date". Это можно делать при оформлении заказа, используя хук woocommerce_thankyou:

function update_last_order_date( $order_id ) {
    $order = wc_get_order( $order_id );
    $user_id = $order->get_user_id();
    if ( $user_id ) {
        update_user_meta( $user_id, '_last_order_date', current_time( 'mysql' ) );
    }
}
add_action( 'woocommerce_thankyou', 'update_last_order_date' );

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

Чтобы убедиться, что система работает:

  • Вручную создайте тестового клиента, который не делает заказов больше 6 месяцев (можно установить дату вручную в базе);
  • Принудительно запустите задачу WP-Cron с помощью плагина WP Crontrol или WP-CLI:
wp cron event run remove_inactive_customers_weekly
  • Проверьте, удалился ли тестовый пользователь;
  • Посмотрите логи ошибок и убедитесь, что нет сбоев.

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

  • Пользователи не удаляются: проверьте, что задача WP-Cron активна и вызывается. Можно использовать плагин WP Crontrol для мониторинга.
  • Удаляются не те пользователи: убедитесь, что критерии фильтрации корректны. Например, метаполе _last_order_date должно обновляться при каждом заказе.
  • Производительность падает при большом количестве клиентов: используйте постраничный запуск удаления или делайте проверку и удаление по частям.
  • Потеря данных: перед внедрением на живом сайте сделайте резервную копию базы данных.

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

  • Всегда тестируйте на staging-среде перед внедрением на продакшн.
  • Не удаляйте клиентов без резервной копии, так как восстановить данные пользователей сложно.
  • Используйте WP-CLI для запуска и отладки задач, это быстрее и надежнее.
  • Добавьте логирование удалений в отдельный файл для аудита действий.
  • Регулярно очищайте WP-Cron от старых задач, чтобы избежать зависаний.

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

МетодПреимуществаНедостаткиПример
Ручное удаление через админку Простота, контроль Трудозатратно, не подходит для большого числа клиентов WooCommerce - Пользователи - Удалить
WP-Cron с кастомным скриптом Автоматизация, гибкость Требует настройки, может влиять на производительность при большом объеме Код из статьи
Плагин для очистки базы Удобство, дополнительные функции (например Clearfy Pro) Зависимость от стороннего кода, лицензии Clearfy Pro
Исключение товаров WooCommerce по атрибуту из поиска и категорий
23.06.2026
Как отключить AJAX-перезагрузку в WordPress без потери производительности
06.02.2026
Как удалить зависшие задачи WP-Cron в WordPress
06.12.2025
Как создать и использовать виджеты в WordPress без плагинов
09.02.2026
Как использовать WooCommerce REST API для управления товарами в WordPress
14.02.2026