wpcompany.ru wordpress WPCompany

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

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

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

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

Использование хука для реагирования на смену статуса заказа

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

add_action('woocommerce_order_status_cancelled', 'remove_items_on_order_cancelled', 10, 1);
function remove_items_on_order_cancelled($order_id) {
    if (!$order_id) {
        return;
    }

    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }

    foreach ($order->get_items() as $item_id => $item) {
        $order->remove_item($item_id);
    }

    $order->calculate_totals();
    $order->save();
}

Пояснения к коду

  • woocommerce_order_status_cancelled — хук, который срабатывает при смене статуса заказа на "отменен".
  • Метод remove_item($item_id) удаляет товар из заказа.
  • После удаления товаров важно вызвать calculate_totals() для перерасчёта итоговых значений и save() для сохранения изменений.

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

  • Создайте тестовый заказ с несколькими товарами.
  • Измените статус заказа на "отменен" через админку WooCommerce.
  • Откройте заказ в админке и убедитесь, что список товаров пуст.
  • Проверьте, что итоговая сумма заказа стала 0.

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

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

  • Заказ не обновляется после изменения статуса: проверьте, что вызваны методы calculate_totals() и save(). Без них изменения не сохранятся.
  • Удаление товаров происходит слишком рано или поздно: используйте правильный хук woocommerce_order_status_cancelled, а не универсальные save_post или woocommerce_checkout_order_processed, чтобы избежать конфликтов.
  • Функция не срабатывает: проверьте, что код добавлен в файл functions.php текущей темы или в отдельный плагин, и что нет синтаксических ошибок.
  • Проблемы с плагинами кэширования: при использовании кэширования админки или фронтенда очистите кэш после внесения изменений.

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

  • Не удаляйте товары из заказов, если это нарушает бизнес-логику бухгалтерии или учёта. Лучше использовать отдельные статусы или метаданные для пометки отменённых позиций.
  • Добавляйте проверку прав пользователя, если планируете расширять функционал, чтобы избежать нежелательных изменений извне.
  • Оптимизируйте код, избегая ненужных запросов к базе и повторных вызовов методов.
  • При больших объёмах заказов учтите время выполнения скриптов и возможность таймаутов. В этом случае лучше реализовывать пакетное удаление товаров через крон-задачи.

Альтернативные варианты реализации

МетодПлюсыМинусы
Использование хука woocommerce_order_status_cancelled и удаления товаровПростота и скорость реализации, точечное действиеПолное удаление товаров из заказа может быть нежелательным для статистики
Добавление кастомного статуса для отменённых товаровСохраняет историю заказа, гибкостьТребует доработок интерфейса и логики
Использование плагинов учета заказов с расширенными функциямиГотовые решения, поддержкаЗависимость от стороннего кода, может быть избыточным
×
WPShop
партнерка без «но»!

До 3225₽ за каждую продажу

Подключиться к игре