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

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

На крупных интернет-магазинах на WooCommerce часто накапливаются заказы в статусе "ожидает оплаты" или "в обработке", которые не завершились из-за неудачных попыток оплаты или отказа клиента. Такие неактивные заказы занимают место в базе данных, замедляют работу админ-панели и мешают аналитике.

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

  • Перейдите в WooCommerce → Заказы и отфильтруйте по статусу pending, on-hold и failed.
  • Проверьте количество заказов в этих статусах и дату их создания.
  • Если количество заказов больше сотен, а большинство из них не обновлялись более 7–14 дней, пора автоматизировать очистку.

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

Создаем функцию для удаления заказов

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

function wporders_delete_old_orders() {
    $days = 14; // Количество дней, после которых заказы считаются неактивными
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'limit' => -1,
        'status' => ['pending', 'failed', 'on-hold'],
        'date_created' => '<' . $date,
        'return' => 'ids',
    ];

    $orders = wc_get_orders($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // Жесткое удаление
        }
    }
}

Настраиваем CRON-задачу для регулярного удаления

Чтобы функция выполнялась автоматически, зарегистрируем событие в WP-Cron:

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

add_action('wporders_daily_order_cleanup', 'wporders_delete_old_orders');

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

  • Зайдите в базу данных или панель заказов WooCommerce и убедитесь, что заказы со статусами pending, failed и on-hold старше 14 дней удаляются после выполнения CRON-задачи.
  • Для ручного теста запустите функцию wporders_delete_old_orders() через консоль WP-CLI или временно вызовите ее из шаблона.
  • Проверьте логи сервера на наличие ошибок, связанных с удалением заказов.

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

  • Удаляются не все заказы: проверьте правильность аргументов в wc_get_orders, особенно параметр date_created. В WooCommerce 3.0+ необходимо использовать объекты WC_DateTime или передавать дату в правильном формате.
  • CRON-задача не запускается: убедитесь, что на сайте посещают страницы (WP-Cron зависит от трафика) или настройте системный cron на сервере для wp-cron.php.
  • Удаление заказов приводит к ошибкам: проверьте, не блокирует ли какие-либо плагины удаление заказов. Временно отключите плагины, влияющие на заказы, для теста.

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

  • Всегда делайте резервное копирование базы данных перед запуском автоматического удаления.
  • Используйте wp_delete_post($order_id, true) для полного удаления заказов, включая метаданные.
  • Для больших магазинов с тысячами заказов не запускайте удаление всех заказов за один запрос — можно добавить лимит в запрос и запускать функцию несколько раз с помощью WP-CLI или более частых cron-задач.
  • Добавьте логирование удалений для аудита. Например, записывайте ID удалённых заказов в отдельный файл или таблицу.

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

МетодПлюсыМинусыПример
Ручное удаление через админкуПростота, контрольТрудозатратно при большом объеме заказовWooCommerce → Заказы → выберите и удалите
Автоматический WP-Cron скриптАвтоматизация, минимальное вмешательствоЗависит от посещаемости сайта, требует тестированияКод из статьи выше
Сторонние плагины (например, WP Sweep)Дополнительные функции очисткиМогут удалять лишнее, не всегда гибкоПлагин WP Sweep (https://wordpress.org/plugins/wp-sweep/)
WooCommerce: как удалить личные данные клиента после удаления заказа
31.05.2026
Как создать автоматический скрипт для резервирования товаров в WooCommerce
16.02.2026
Как сделать удобный фильтрованный список заказов в WordPress без WooCommerce
31.01.2026
Как создать собственный REST API для WooCommerce в WordPress
21.11.2025
WooCommerce: как использовать кастомные метаданные для поиска и фильтров заказов
22.04.2026