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

Диагностика проблемы с неактивными клиентами в WooCommerce

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

Обычно под неактивным клиентом понимают пользователя, который:

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

В WooCommerce информация о клиентах хранится в таблице wp_users и wp_usermeta, а заказы — в wp_posts с типом shop_order. Для выявления неактивных клиентов нужно сопоставить пользователей и заказы.

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

1. Определяем период неактивности

Для примера возьмём 12 месяцев (365 дней). Клиенты, не совершавшие заказов за этот период, подлежат удалению.

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

function wc_delete_inactive_customers() {
    global $wpdb;
    $days_inactive = 365;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));

    // Получаем ID пользователей, которые были клиентами WooCommerce
    $customer_role = 'customer';

    // Получаем всех пользователей с ролью customer
    $customers = get_users(array('role' => $customer_role, 'fields' => array('ID')));
    if (empty($customers)) return;

    $inactive_customers = array();

    foreach ($customers as $customer) {
        $user_id = $customer->ID;

        // Проверяем заказы пользователя с датой после порога
        $order_exists = $wpdb->get_var($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ('wc-completed', 'wc-processing') AND post_author = %d AND post_date > %s LIMIT 1",
            $user_id, $date_threshold
        ));

        if (!$order_exists) {
            $inactive_customers[] = $user_id;
        }
    }

    // Удаляем пользователей без заказов за указанный период
    foreach ($inactive_customers as $user_id) {
        wp_delete_user($user_id);
    }

    // Логируем результат
    error_log('WooCommerce: удалено неактивных клиентов: ' . count($inactive_customers));
}

3. Планируем задачу в WP-Cron для регулярного запуска

add_action('wc_delete_inactive_customers_event', 'wc_delete_inactive_customers');

function wc_schedule_inactive_customers_deletion() {
    if (!wp_next_scheduled('wc_delete_inactive_customers_event')) {
        wp_schedule_event(time(), 'daily', 'wc_delete_inactive_customers_event');
    }
}
add_action('wp', 'wc_schedule_inactive_customers_deletion');

4. Как отключить задачу, если потребуется

function wc_unschedule_inactive_customers_deletion() {
    $timestamp = wp_next_scheduled('wc_delete_inactive_customers_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_delete_inactive_customers_event');
    }
}

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

  • Проверить лог ошибок PHP на наличие записи об удалённых пользователях (error_log в функции).
  • Вручную проверить наличие пользователей с ролью customer, которые не совершали заказов более 12 месяцев - они должны отсутствовать.
  • Запустить функцию вручную через консоль WP-CLI: wp eval 'wc_delete_inactive_customers();' и проверить результат.
  • Убедиться, что заказы пользователей не удаляются вместе с пользователями (удаление wp_delete_user не затрагивает заказы, т.к. автор заказа — ID пользователя, но заказы остаются в базе).

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

  • Удаляются не те пользователи: Проверьте правильность роли в get_users(). Иногда клиенты имеют другую роль или кастомные роли.
  • Удаление пользователей не происходит: Убедитесь, что WP-Cron работает. Для теста вызовите функцию вручную.
  • Удаляются пользователи с недавними заказами: Проверьте условие даты и статус заказов. Нужно учитывать статусы wc-completed и wc-processing.
  • Пользователи не удаляются из-за прав: Скрипт должен запускаться с правами администратора (через WP-Cron это обычно так).

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

  • Перед удалением пользователей сделайте резервную копию базы данных.
  • Если база большая, лучше разбивать удаление на партии (например, по 50 пользователей за раз) во избежание таймаутов.
  • Логируйте действия в отдельный файл, чтобы не захламлять основной error_log.
  • Для точного учета активности можно расширить критерии — например, использовать дату последнего входа пользователя из мета (last_login), если она есть.
  • Возможна интеграция с плагином Clearfy Pro из WPShop для очистки базы и оптимизации после массового удаления.

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

МетодОписаниеПреимуществаНедостатки
Ручное удаление через админку Удаление пользователей по фильтрам вручную Простота, безопасность Долго, неудобно при большом количестве
Автоматизация WP-Cron + кастомная функция Регулярный автоматический поиск и удаление Экономия времени, регулярность Нужна правильная настройка, риски при ошибках
Использование плагина Готовые решения для очистки пользователей Удобство, дополнительные опции Зависимость от плагина, возможные конфликты
Как установить и настроить PHP Redis для ускорения WordPress
05.01.2026
WooCommerce: автоматическое удаление закрытых заказов
04.07.2026
Как автоматизировать управление ролями и правами в WordPress
02.03.2026
WooCommerce: не отображается цена товара после обновления — как исправить
24.04.2026
WooCommerce: как автоматически удалять закрытые заказы для оптимизации базы данных
24.06.2026