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

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

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

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

Для начала нужно убедиться, что WooCommerce фиксирует статусы заказов корректно. Основные статусы, при которых имеет смысл удалять товары, — cancelled (отменён) и refunded (возврат). Можно проверить статус заказа через админку WooCommerce или программно:

$order = wc_get_order( $order_id );
$status = $order->get_status();
if ( in_array( $status, array( 'cancelled', 'refunded' ) ) ) {
    // заказ отменён или возвращён
}

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

Реализуем хук, который будет запускаться при смене статуса заказа и удалять все товары из таких заказов.

1. Подключаем обработчик смены статуса заказа

add_action( 'woocommerce_order_status_changed', 'remove_order_items_on_cancel_or_refund', 10, 4 );

2. Функция удаления товаров

function remove_order_items_on_cancel_or_refund( $order_id, $old_status, $new_status, $order ) {
    if ( in_array( $new_status, array( 'cancelled', 'refunded' ) ) ) {
        // Получаем все позиции заказа
        $items = $order->get_items();

        foreach ( $items as $item_id => $item ) {
            // Удаляем позицию из заказа
            wc_delete_order_item( $item_id );
        }

        // Обновляем заказ, чтобы применить изменения
        $order->calculate_totals( true );
    }
}

3. Добавление кода в functions.php или отдельный плагин

Рекомендуется размещать этот код в дочерней теме или в кастомном плагине, чтобы сохранить изменения при обновлении WooCommerce.

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

  • Создайте тестовый заказ с товарами через фронтэнд магазина.
  • Измените статус заказа на «Отменён» или «Возврат» через админку WooCommerce.
  • Перейдите в детали заказа и убедитесь, что все товары удалены из заказа.
  • Проверьте, что общая сумма и другие данные заказа пересчитаны корректно.

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

  • Товары не удаляются при смене статуса: Проверьте, что хук woocommerce_order_status_changed подключён с правильными параметрами и при переходе на нужный статус действительно срабатывает. Можно добавить error_log() для отладки.
  • Удаление товаров приводит к ошибкам в заказе: Важно вызывать $order->calculate_totals(true) после удаления, чтобы обновить сумму и данные заказа.
  • Код помещён в неподходящее место: Убедитесь, что код находится в functions.php дочерней темы или в отдельном плагине, а не в родительской теме или плагинах, которые обновляются.

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

  • Всегда делайте резервную копию базы данных перед внедрением подобных изменений.
  • Проверяйте совместимость с используемой версией WooCommerce и WordPress.
  • Используйте условия, чтобы код запускался только при необходимости, избегая лишних операций.
  • Для больших магазинов с высокой нагрузкой можно добавить логирование операций удаления для аудита.

Сравнение способов решения задачи

СпособОписаниеПлюсыМинусы
Код на хуке woocommerce_order_status_changedАвтоматическое удаление товаров при смене статуса заказаПолный контроль, нет лишних плагиновТребует навыков программирования, риск ошибок
Использование плагинов очистки заказовПлагины для управления и очистки заказовПростота, готовые решенияДополнительная нагрузка, может конфликтовать с другими плагинами
Ручное удаление товаровАдминка WooCommerce, ручная очистка заказовПростота, не требует кодаТрудоёмко, риск пропуска заказов
Как удалить автоматические частые запросы в WordPress для оптимизации производительности
19.01.2026
Как добавить автоматическое удаление старого контента в WordPress
09.01.2026
Автоматическое удаление товаров из заказов WooCommerce после отмены или возврата
04.05.2026
Как создать меню в WordPress с помощью хука wp_nav_menu
01.11.2025
Как использовать хук pre_get_posts в WordPress для фильтрации записей
29.01.2026