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

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

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

Типичные сценарии:

  • Удаление отменённых заказов старше 30 дней;
  • Удаление заказов со статусом «ожидает оплаты» старше 7 дней;
  • Удаление заказов со статусом «обработка», которые не обновлялись более 60 дней (например, брошенные или зависшие).

Как реализовать автоматическое удаление заказов по статусу и времени

Шаг 1. Создаём WP-Cron задачу для регулярной очистки

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

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

Шаг 2. Добавляем функцию удаления заказов по статусам и времени

Реализуем функцию, которая будет искать и удалять заказы по заданным правилам:

add_action('wpin_delete_old_wc_orders', 'wpin_delete_old_orders_by_status_and_date');

function wpin_delete_old_orders_by_status_and_date() {
    // Настройки: статус => количество дней старости
    $statuses_to_delete = [
        'cancelled' => 30,
        'pending'   => 7,
        'processing' => 60,
    ];

    foreach ($statuses_to_delete as $status => $days) {
        $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

        $args = [
            'status' => $status,
            'date_modified' => '<' . $date_threshold,
            'limit' => -1,
            'return' => 'ids',
        ];

        $orders = wc_get_orders($args);

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true); // true - удалить без перемещения в корзину
            }
        }
    }
}

Шаг 3. Тестируем функцию вручную

Для проверки можно вызвать функцию напрямую из консоли WP-CLI или временно добавить в functions.php вызов:

add_action('init', function() {
    if (current_user_can('administrator') && isset($_GET['test_delete_orders'])) {
        wpin_delete_old_orders_by_status_and_date();
        exit('Orders deletion test executed');
    }
});

После этого откройте в браузере https://ваш-сайт.ru/?test_delete_orders под администратором, чтобы проверить работу.

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

  • В админке WooCommerce перейдите в «Заказы» и отфильтруйте по статусам, указанным в настройках;
  • Проверьте, что заказы старше указанного времени удалены;
  • В базе данных таблицы wp_posts и wp_postmeta проверьте отсутствие удалённых заказов (тип записи shop_order);
  • Просмотрите логи ошибок PHP и WP-Cron на наличие сбоев.

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

  • Отсутствие запланированного события WP-Cron. Проверьте, что событие wpin_delete_old_wc_orders присутствует через WP-CLI команду wp cron event list. Если нет — удалите и добавьте код регистрации заново.
  • Неверные параметры в wc_get_orders. Параметр date_modified с оператором < работает только с правильным форматом даты. Убедитесь в корректности формата ISO 8601.
  • Недостаточные права на удаление заказов. Код выполняется под правами текущего пользователя WP-Cron. Если проблема возникает, добавьте проверку прав или выполняйте удаление от имени администратора.
  • Память и время выполнения скрипта. Если заказов много, удаление может превысить лимиты. Разбейте удаление на партии и используйте set_time_limit(0) и оптимизируйте запросы.

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

  • Добавляйте логи удаления заказов с указанием ID и времени, чтобы иметь возможность аудита.
  • Не удаляйте заказы с важными статусами (например, completed), чтобы не потерять данные для бухгалтерии.
  • Используйте WP-CLI для разовых массовых удалений, если заказов очень много.
  • Для повышения производительности можно отключить триггеры и кеши WooCommerce на время удаления.
  • Регулярно делайте резервные копии базы данных перед массовыми удалениями.

Сравнение методов удаления заказов

МетодПреимуществаНедостатки
WP-Cron + wc_get_orders + wp_delete_postПолный контроль, интеграция с WP, автоматизацияНагрузка при больших объёмах, требует правильной настройки Cron
SQL-запросы напрямую к базеБыстрое удаление, подходит для больших объёмовРиск удалить лишнее, требует знаний структуры базы, обходит логику WP
Плагины очистки заказов (например, Advanced Database Cleaner)Удобство и готовые интерфейсыМогут быть ограничены в кастомизации, нагрузка на сайт
Как добавить свой шорткод в WordPress: практическое руководство
21.11.2025
Как отключить Emoji в WordPress для ускорения сайта
16.04.2026
Как создать свой плагин WordPress с нуля: подробное руководство
07.11.2025
Автоматическое удаление товаров из корзины WooCommerce при отсутствии на складе
29.04.2026
WooCommerce: как правильно настроить возвраты и обмены товаров
02.05.2026