wpcompany.ru wordpress WPCompany

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

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

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

Чтобы убедиться, что товары не удаляются, нужно проверить статус заказа и содержимое заказанных позиций в админке WooCommerce.

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

1. Использование хука woocommerce_order_status_cancelled

WooCommerce предоставляет хук для обработки смены статуса заказа. Мы можем привязаться к событию смены статуса на cancelled и удалить товары из заказа.

2. Пример кода для functions.php вашей темы или плагина

add_action('woocommerce_order_status_cancelled', 'wpcompany_remove_items_from_cancelled_order');
function wpcompany_remove_items_from_cancelled_order($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(false);
    $order->save();
}

Этот код удалит все товары из заказа сразу после его отмены.

3. Альтернативный подход: удаление товаров при смене любого статуса на «отменён»

add_action('woocommerce_order_status_changed', 'wpcompany_remove_items_on_status_cancelled', 10, 4);
function wpcompany_remove_items_on_status_cancelled($order_id, $old_status, $new_status, $order) {
    if ($new_status === 'cancelled') {
        foreach ($order->get_items() as $item_id => $item) {
            $order->remove_item($item_id);
        }
        $order->calculate_totals(false);
        $order->save();
    }
}

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

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

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

  • Код не срабатывает при отмене заказа: Проверьте, правильно ли вы добавили код и активна ли тема/плагин с ним. Убедитесь, что статус отмены именно cancelled, а не похожий (например, refunded).
  • Удаление товаров не обновляет сумму заказа: Обязательно вызывайте calculate_totals(false) и save() после удаления позиций.
  • Конфликт с другими плагинами: Некоторые плагины могут переопределять логику работы со статусами заказа. Проверьте совместимость, отключая другие плагины.

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

  • Используйте проверку наличия ID заказа и объекта WC_Order перед выполнением операций.
  • Не выполняйте тяжёлых операций в хук, чтобы не замедлять обработку смены статуса.
  • Для больших магазинов с большим количеством заказов рассмотрите логику удаления товаров через фоновые задачи (cron) для минимизации нагрузки.
  • Регулярно делайте резервное копирование базы данных перед внесением изменений.

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

МетодПлюсыМинусыПример кода
Хук woocommerce_order_status_cancelled Простая реализация, срабатывает сразу Не учитывает другие способы отмены В статье
Хук woocommerce_order_status_changed с проверкой статуса Гибко реагирует на смену статуса Нужно внимательно фильтровать статусы В статье
Ручное удаление через админку Без кода, контролируемо Трудоёмко, риск ошибок Нет
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше