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

Проблема: накопление неактивных клиентов в WooCommerce

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

Диагностика: как определить неактивных клиентов

В WooCommerce клиенты — это пользователи с ролью customer. Неактивными считаются те, кто не совершал заказов и не был авторизован давно. Для оценки активности можно использовать следующие критерии:

  • Отсутствие заказов за последние N месяцев
  • Дата последнего логина пользователя
  • Дата регистрации пользователя (если он неактивен с регистрации)

Для проверки активности можно использовать SQL-запросы или WP_User_Query с мета-полями. Например, чтобы вывести пользователей-customer, которые не делали заказов за последний год:

SELECT u.ID, u.user_login FROM wp_users u
LEFT JOIN wp_wc_customer_lookup c ON u.ID = c.user_id
LEFT JOIN wp_posts p ON p.post_author = u.ID AND p.post_type = 'shop_order' AND p.post_status IN ('wc-completed', 'wc-processing') AND p.post_date > DATE_SUB(NOW(), INTERVAL 12 MONTH)
WHERE u.ID NOT IN (SELECT post_author FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-completed', 'wc-processing') AND post_date > DATE_SUB(NOW(), INTERVAL 12 MONTH))
AND u.ID = c.user_id
AND c.user_id IS NOT NULL
AND u.user_registered < DATE_SUB(NOW(), INTERVAL 12 MONTH);

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

1. Создаем кастомный скрипт на PHP

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

function wc_delete_inactive_customers() {
    $months_inactive = 12; // период неактивности в месяцах
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$months_inactive} months"));

    // Получаем пользователей с ролью customer, зарегистрированных до $date_threshold
    $args = array(
        'role' => 'customer',
        'date_query' => array(
            'before' => $date_threshold,
        ),
        'fields' => 'ID',
        'meta_query' => array(
            'relation' => 'OR',
            // Пользователи без заказов
            array(
                'key' => '_last_order',
                'compare' => 'NOT EXISTS'
            ),
            // Пользователи, у которых последний заказ старше $date_threshold
            array(
                'key' => '_last_order',
                'value' => $date_threshold,
                'compare' => '<',
                'type' => 'DATETIME'
            ),
        ),
    );

    $user_query = new WP_User_Query($args);
    $users_to_delete = $user_query->get_results();

    if (empty($users_to_delete)) {
        error_log('WooCommerce: Нет неактивных клиентов для удаления');
        return;
    }

    foreach ($users_to_delete as $user_id) {
        require_once(ABSPATH . 'wp-admin/includes/user.php');
        wp_delete_user($user_id);
        error_log("WooCommerce: Удален неактивный клиент ID {$user_id}");
    }
}

// Добавляем хук для запуска по крону
add_action('wc_cron_delete_inactive_customers', 'wc_delete_inactive_customers');

// Регистрируем задание, если еще не зарегистрировано
if (!wp_next_scheduled('wc_cron_delete_inactive_customers')) {
    wp_schedule_event(time(), 'weekly', 'wc_cron_delete_inactive_customers');
}

2. Обновляем мета-данные о последнем заказе клиента

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

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

3. Тестируем выполнение

Выполните вручную задание WP-Cron:

do_action('wc_cron_delete_inactive_customers');

Проверьте логи ошибок или добавьте временно error_log для контроля. Убедитесь, что неактивные клиенты удаляются.

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

  • Запустите скрипт вручную через консоль WP-CLI или вызов функции.
  • Проверьте наличие клиентов в базе через админку WooCommerce (раздел «Клиенты»).
  • Сделайте заказ от нового пользователя и проверьте, что он не удаляется.
  • Отслеживайте логи ошибок для выявления проблем.

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

  • Не удаляются пользователи: Проверьте, правильно ли обновляется мета-поле _last_order. Без него скрипт не сможет определить активность.
  • Удаляются активные клиенты: Проверьте логику даты и правильность временной зоны сервера.
  • WP-Cron не запускается: Настройте системный cron или проверьте доступность вызова wp-cron.php.
  • Пользователи с другими ролями удаляются: В запросе WP_User_Query укажите строго роль customer.

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

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

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

МетодПлюсыМинусы
Плагин очистки клиентовПростота, готовый UI, поддержкаМожет быть платным, нагрузка, ограниченная кастомизация
Кастомный WP-Cron скриптПолный контроль, тонкая настройка, бесплатныйНужны навыки разработки, возможны ошибки при реализации
Ручное удаление через базу данныхБыстро, без дополнительного кодаРиск ошибок, отсутствие автоматизации, сложность для новичков
Как регистрировать собственные события в WordPress для мониторинга
05.04.2026
Жесткая фильтрация входящих данных в WordPress: практические методы и примеры
09.12.2025
WooCommerce: как автоматизировать удаление старого товара и отсутствующих вариантов
11.06.2026
WooCommerce: как автоматически удалять старые товары и отсутствующие варианты
17.06.2026
Как отладивать проблемы с производительностью WordPress: практические советы
11.11.2025