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

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

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

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

1. Добавление кода для удаления отменённых заказов по расписанию

Для автоматизации можно использовать WP-Cron — встроенный механизм планирования задач в WordPress. Ниже пример кода, который создаёт задачу на ежедневное удаление заказов со статусом cancelled старше 7 дней.

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

function wpcource_cleanup_cancelled_orders() {
    $args = array(
        'status' => 'cancelled',
        'limit' => -1,
        'date_created' => '<' . ( time() - WEEK_IN_SECONDS * 1 ), // старше 7 дней
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );
    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true ); // удаляет заказ и связанные с ним данные
    }
}
add_action( 'wpcource_cleanup_cancelled_orders_hook', 'wpcource_cleanup_cancelled_orders' );

2. Обработка товаров в отменённых заказах

Если требуется также удалить товары, которые больше нигде не используются, можно добавить скрипт для проверки связей товара с другими заказами и удаления только «лишних» продуктов. Обычно товары не удаляются при удалении заказов, так как их используют на витрине.

Пример проверки и удаления товара, если его нет в других заказах:

function wpcource_delete_orphan_products_from_cancelled_orders() {
    $args = array(
        'status' => 'cancelled',
        'limit' => -1,
        'date_created' => '<' . ( time() - WEEK_IN_SECONDS * 1 ),
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );
    $product_ids_to_check = array();

    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        foreach ( $order->get_items() as $item ) {
            $product_ids_to_check[] = $item->get_product_id();
        }
    }

    $product_ids_to_check = array_unique( $product_ids_to_check );

    foreach ( $product_ids_to_check as $product_id ) {
        // Проверяем, есть ли этот товар в других заказах со статусом, отличным от cancelled
        $args_check = array(
            'limit' => 1,
            'status' => array( 'completed', 'processing', 'on-hold' ),
            'return' => 'ids',
            'meta_query' => array(
                array(
                    'key' => '_product_id',
                    'value' => $product_id,
                    'compare' => '=',
                ),
            ),
        );
        // WP_Query для заказов с этим продуктом (упрощённый пример, требует доработки)
        $orders_with_product = wc_get_orders( $args_check );

        if ( empty( $orders_with_product ) ) {
            wp_delete_post( $product_id, true );
        }
    }
}
add_action( 'wpcource_cleanup_cancelled_orders_hook', 'wpcource_delete_orphan_products_from_cancelled_orders' );

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

  • В панели WooCommerce перейти в раздел «Заказы» и проверить, что отменённые заказы старше 7 дней исчезли.
  • Для отладки можно временно заменить wp_delete_post на логирование ID заказов в файл через error_log.
  • Проверить, что WP-Cron активен и задача выполняется — в админке плагина WP Crontrol или через вывод wp_next_scheduled.

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

  • WP-Cron не работает: если сайт не посещают, задачи по расписанию не выполняются. Решение — настроить системный cron или использовать внешние сервисы.
  • Удаление заказов не происходит: проверьте статус заказов и дату создания, соответствуют ли они условию; убедитесь, что код подключен и хук срабатывает.
  • Удаляются не те заказы: проверьте правильность параметра 'status' => 'cancelled' и фильтра даты.
  • Не получается удалить товары: товары могут быть защищены настройками, используйте wp_delete_post( $product_id, true ) для принудительного удаления.

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

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

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

МетодПлюсыМинусыПример использования
WP-Cron + собственный кодГибкость, полное управлениеЗависимость от посещаемости сайтаКод из статьи
Плагины очистки заказовПростота настройки, готовые решенияМогут быть платными, лишний кодAdvanced Order Cleaner и др.
Ручное удаление в админкеПростота, контрольНеавтоматично, время затратноеЧерез панель WooCommerce
Как изменить размер и оптимизировать изображения в WordPress без плагинов
05.01.2026
Как удалить разные виды кеша в WordPress
15.02.2026
WooCommerce: как автоматически удалять отменённые заказы и товары из них
07.05.2026
Как автоматизировать создание резервных копий WordPress с помощью кода
04.03.2026
WooCommerce: как автоматически удалять отменённые заказы с помощью кода
04.06.2026

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