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

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

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

Проверьте, что у вас в WooCommerce заказ меняет статус на «cancelled» или «refunded» при отмене/возврате. Если нет, настройте статусы в WooCommerce или дополните логику, чтобы срабатывало событие смены статуса заказа.

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

Используем хук woocommerce_order_status_changed

Этот хук срабатывает при смене статуса заказа. На нем мы отследим переход в «cancelled» или «refunded» и удалим все товары из заказа.

add_action('woocommerce_order_status_changed', 'wc_clear_order_items_after_cancel_refund', 10, 4); 
function wc_clear_order_items_after_cancel_refund($order_id, $old_status, $new_status, $order) {
    if (in_array($new_status, array('cancelled', 'refunded'))) {
        // Получаем объект заказа
        $order = wc_get_order($order_id);
        if (!$order) return;

        // Удаляем все позиции товаров
        foreach ($order->get_items() as $item_id => $item) {
            $order->remove_item($item_id);
        }

        // Сохраняем изменения
        $order->save();
    }
}

Объяснение кода

  • Функция реагирует на смену статуса заказа;
  • При переходе в «cancelled» или «refunded» удаляются все позиции;
  • После удаления вызывается $order->save() для сохранения изменений в базе.

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

  1. Создайте тестовый заказ с несколькими товарами.
  2. Вручную смените статус заказа на «cancelled» или «refunded» через админку WooCommerce.
  3. Обновите страницу заказа и убедитесь, что список товаров пуст.
  4. Проверьте отчеты и убедитесь, что товары из отмененного/возвращённого заказа не учитываются.

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

  • Заказ не обновляется после удаления товаров
    Проверьте вызов $order->save() после удаления позиций.
  • Функция не срабатывает
    Убедитесь, что хук подключен в functions.php или в плагине, и что статусы заказа действительно меняются на «cancelled» или «refunded».
  • Удаляются не те позиции
    Проверьте, что вызывается именно $order->get_items() и удаляются позиции товаров, а не, например, налоги или доставка.
  • Проблемы с кэшированием
    Если вы используете кэш на сервере или объектный кэш, попробуйте отключить временно для теста.

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

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

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

МетодПлюсыМинусыКомпромисс
Удаление позиций через хук (как в статье)Полное удаление, простая реализацияПотеря данных о заказеИспользовать только для отмененных/возвращенных заказов
Добавление мета поля «отменено» к товарамСохраняется история, гибкостьСложнее фильтровать отчетыПодходит для аналитики и интеграций
Использование сторонних плагинов для управления возвратамиГотовые решения, поддержкаНагрузка и зависимость от плагинаДля сложных магазинов с большим объемом возвратов
Как избежать проблем при использовании PHP 8 в WordPress
12.02.2026
Как добавить автоматическое удаление старого контента в WordPress
09.01.2026
Как избежать ошибок при массовом изменении статусов заказов WooCommerce
23.06.2026
Как избежать проблем при использовании PHP 8 в WordPress
15.03.2026
Автоматическое удаление товаров из заказов WooCommerce после отмены или возврата
28.05.2026