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

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

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

Пошаговое решение: удаление заказов и товаров со статусом «Отменен» через cron и хуки WooCommerce

1. Автоматическое удаление заказов со статусом «Отменен»

Создадим функцию, которая будет запускаться по расписанию и удалять заказы с нужным статусом.

function wpb_delete_cancelled_orders() {
    $args = array(
        'status' => 'cancelled',
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // Удаление без перемещения в корзину
    }
}

// Регистрируем событие cron, если оно ещё не существует
if (!wp_next_scheduled('wpb_delete_cancelled_orders_hook')) {
    wp_schedule_event(time(), 'daily', 'wpb_delete_cancelled_orders_hook');
}

add_action('wpb_delete_cancelled_orders_hook', 'wpb_delete_cancelled_orders');

2. Автоматическое удаление товаров, связанных с отменёнными заказами

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

function wpb_delete_products_from_cancelled_orders() {
    $args = array(
        'status' => 'cancelled',
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders($args);
    $products_to_delete = array();

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

    $products_to_delete = array_unique($products_to_delete);
    foreach ($products_to_delete as $product_id) {
        wp_delete_post($product_id, true); // Удаление товара
    }
}

// Можно добавить вызов функции в тот же крон, что и удаление заказов
add_action('wpb_delete_cancelled_orders_hook', 'wpb_delete_products_from_cancelled_orders');

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

  • Зайдите в админку WooCommerce > Заказы и отфильтруйте по статусу «Отменен». После запуска cron заказы с этим статусом должны исчезнуть.
  • Проверьте каталог товаров — те, что были связаны с отменёнными заказами, должны быть удалены.
  • Для ручного запуска cron добавьте временно в functions.php do_action('wpb_delete_cancelled_orders_hook'); и проверьте результат.
  • Логи сервера и консоль ошибок PHP должны быть чистыми, без предупреждений и ошибок по функции удаления.

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

  • Заказы не удаляются: проверьте, что статус заказов точно «cancelled» (в WooCommerce на английском или локализованном языке). Используйте wc_get_order_statuses() для проверки доступных статусов.
  • Cron событие не запускается: убедитесь, что WP-Cron работает, либо настройте системный cron на сервере. Для диагностики используйте плагин WP Crontrol.
  • Товары не удаляются: проверьте, что ID продуктов корректно передаются и что пользователь, под которым работает код, имеет права на удаление постов.
  • Удаление с ошибками: не используйте wp_delete_post для продуктов с зависимостями без проверки. Можно добавить проверку на наличие связанных заказов или запасов.

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

  • Перед внедрением автоматического удаления сделайте резервную копию базы данных.
  • Добавьте логирование удалений для возможности аудита, например, запись ID заказов и товаров в отдельный файл.
  • Если база данных большая, разделите удаление на партии с помощью параметра limit и смещения offset для избежания таймаутов.
  • Для повышения безопасности используйте capability-проверки перед выполнением удаления, особенно если код запускается из пользовательских действий.
  • Регулярно очищайте базу данных с помощью плагинов вроде Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpbegin.ru&utm_medium=article&utm_campaign=woocommerce-udaleniye-otmenennyh-zakazov-i-tovarov-avtomatikoy) для общего улучшения производительности.
WooCommerce: как автоматически удалять заказы со статусом «Отменен»
25.05.2026
Как создать автоматический импорт данных из Яндекс.Метрики в WordPress
27.02.2026
Как создать автоматические уведомления в WordPress с помощью хуков и плагинов
07.02.2026
WooCommerce: как добавить пользовательское поле в форму оплаты через хук
23.04.2026
WooCommerce: как автоматически удалять товары после отмены заказа
28.05.2026