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

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

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

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

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

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

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

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

Пример кода, который удаляет пользователей, не совершавших заказов и не заходивших на сайт более 180 дней:

function wc_delete_inactive_customers() {
    $days_inactive = 180; // Порог неактивности в днях
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_inactive} days"));

    // Получаем ID пользователей с ролью 'customer'
    $args = [
        'role' => 'customer',
        'fields' => ['ID', 'user_registered'],
        '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) {
        $last_order = wc_get_customer_last_order($user->ID, 'completed');

        $last_order_date = $last_order ? $last_order->get_date_completed()->date('Y-m-d H:i:s') : null;

        // Проверяем дату последнего заказа или дату регистрации
        $compare_date = $last_order_date ? $last_order_date : $user->user_registered;

        if ($compare_date < $date_threshold) {
            require_once ABSPATH . 'wp-admin/includes/user.php';
            wp_delete_user($user->ID);
        }
    }
}

// Вспомогательная функция получения последнего заказа клиента
function wc_get_customer_last_order($user_id, $status = 'completed') {
    $orders = wc_get_orders([
        'customer_id' => $user_id,
        'limit' => 1,
        'orderby' => 'date',
        'order' => 'DESC',
        'status' => $status,
    ]);
    return !empty($orders) ? $orders[0] : false;
}

2. Регистрация WP-Cron задачи для регулярного запуска

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

function wc_schedule_inactive_customers_cleanup() {
    if (!wp_next_scheduled('wc_delete_inactive_customers_hook')) {
        wp_schedule_event(time(), 'weekly', 'wc_delete_inactive_customers_hook');
    }
}
add_action('wp', 'wc_schedule_inactive_customers_cleanup');
add_action('wc_delete_inactive_customers_hook', 'wc_delete_inactive_customers');

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

  • Просмотрите список клиентов в админке (Пользователи > Все пользователи) до и после запуска задачи;
  • Для ускоренной проверки временно измените период неактивности на несколько дней и вручную вызовите функцию wc_delete_inactive_customers() через wp-cli или временный админ-скрипт;
  • Проверьте логи сервера для ошибок при удалении пользователей;
  • Убедитесь, что удаляются только клиенты с указанными критериями, а остальные остаются.

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

  • Неправильная дата последнего заказа: если заказы не имеют статуса completed, функция не учитывает их. Рекомендуется проверить статус заказов в магазине и при необходимости добавить другие статусы.
  • Отсутствие WP-Cron запуска: если на сайте мало посещений, WP-Cron может не запускаться. Для гарантированной работы настройте системный cron или запускайте WP-Cron вручную.
  • Удаление администраторов или других ролей: убедитесь, что условие 'role' => 'customer' корректно ограничивает выборку только клиентами.
  • Неочищаемые данные: после удаления пользователя могут оставаться метаданные или заказы. WooCommerce обычно хранит данные заказов, но если нужно полное удаление, потребуется дополнительный код.

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

  • Перед удалением пользователей делайте резервные копии базы данных;
  • Добавьте логирование удалённых клиентов для аудита;
  • Не запускайте функцию слишком часто — еженедельного запуска достаточно;
  • Ограничьте доступ к коду удаления только администраторам;
  • При большом количестве клиентов используйте пакетную обработку (например, по 50 пользователей за запуск), чтобы избежать таймаутов.

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

МетодПлюсыМинусыКомпромисс
Плагин (например, User Cleaner)Готовое решение, интерфейс, логиЗависимость от стороннего кода, нагрузкаИспользовать, если нет возможности писать код
Самописный код с WP-CronКонтроль, минимальная нагрузка, кастомизацияТребует навыков, возможны ошибкиРекомендуется для опытных разработчиков
Ручное удаление через админкуПростота, безопасностьТрудозатратно, не масштабируетсяПодходит для маленьких магазинов
WooCommerce: успешное отправление email после подтверждения заказа
31.05.2026
Как удалить старые изображения в WordPress без плагинов
22.03.2026
Как удалить URL доменов во внутренних ссылках WordPress
12.01.2026
Как использовать хуки для динамического отображения контента в WordPress
20.02.2026
WordPress: автоматический экспорт данных в Excel
18.11.2025

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