WooCommerce: как автоматически обновлять стоимость и количество товара после возврата

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

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

Проверить проблему можно следующим образом:

  • Создайте тестовый заказ с товаром, у которого включено управление запасами.
  • Оформите возврат через панель администратора, выбрав опцию возврата товара на склад.
  • Проверьте, изменилось ли количество товара на складе в карточке товара.
  • Проверьте, обновилась ли общая стоимость заказа или отдельных позиций, если применялись скидки или налоги.

Если количество товара не увеличилось, либо стоимость заказа не пересчиталась — проблема налицо.

Пошаговое решение: автоматическое обновление запасов и стоимости при возврате

1. Автоматический возврат количества товара на склад

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

add_action('woocommerce_order_refunded', 'auto_restore_stock_on_refund', 10, 2);
function auto_restore_stock_on_refund($order_id, $refund_id) {
    $order = wc_get_order($order_id);
    if (!$order) return;

    foreach ($order->get_items() as $item_id => $item) {
        $product = $item->get_product();
        if (!$product || !$product->managing_stock()) continue;

        $qty_refunded = 0;
        $refund = wc_get_order($refund_id);
        if ($refund) {
            foreach ($refund->get_items() as $refund_item) {
                if ($refund_item->get_meta('_refunded_item_id') == $item_id) {
                    $qty_refunded = $refund_item->get_quantity();
                    break;
                }
            }
        }

        if ($qty_refunded > 0) {
            $new_stock = $product->get_stock_quantity() + $qty_refunded;
            $product->set_stock_quantity($new_stock);
            $product->save();
        }
    }
}

Обратите внимание: в этом примере мы берем количество возвращенного товара из позиции возврата и добавляем его обратно на склад.

2. Пересчет стоимости заказа после возврата

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

add_action('woocommerce_order_refunded', 'recalculate_order_totals_on_refund', 20, 2);
function recalculate_order_totals_on_refund($order_id, $refund_id) {
    $order = wc_get_order($order_id);
    if (!$order) return;

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

Этот код гарантирует, что после возврата заказ будет пересчитан, включая налоги, скидки и общую стоимость.

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

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

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

  • Количество товара не обновляется: проверьте, что у товара включено управление запасами ($product->managing_stock()). Если отключено, скрипт не сработает.
  • Неверное количество возврата: убедитесь, что вы правильно получаете количество из позиции возврата. В некоторых версиях WooCommerce структура данных может отличаться.
  • Пересчет стоимости не происходит: проверьте, что хук woocommerce_order_refunded действительно вызывается. Добавьте логирование для отладки.
  • Конфликты с другими плагинами: временно отключите другие плагины, которые могут влиять на обработку возвратов или управление запасами.

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

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

Сравнение вариантов реализации

ВариантПреимуществаНедостатки
Использование встроенных функций WooCommerceМинимальные изменения, совместимостьНе всегда автоматически обновляет запасы и стоимость
Кастомный код на хуках (пример выше)Гибкое управление, точное обновление данныхТребует поддержки и тестирования
Плагины для управления возвратами и складомДополнительный функционал, интерфейсМожет конфликтовать с другими плагинами, нагрузка

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как удалить пустые термины в таксономиях WordPress программно
20.09.2026
WooCommerce: как автоматически изменять стоимость товара при изменении атрибутов
28.09.2026
Как отключить wc-ajax=get_refreshed_fragments в WooCommerce без поломки мини-корзины
12.08.2026
Как автоматизировать обработку форм в WordPress с примерами кода
23.09.2026
Как избежать конфликтов между плагинами в WordPress: практическое руководство
01.10.2026
×
Прокачай свой сайт WordPress!

WordPress

-20% на премиум темы и плагины

Создай сайт своей мечты ⋙