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
27.03.2026
Как удалить пустые термины в таксономиях WordPress программно
16.12.2025
Как создать собственный REST API endpoint в WordPress с примерами кода
28.11.2025
WooCommerce: автоматическое обновление данных заказа при смене статуса
17.06.2026
Как использовать REST API WordPress для автоматизации задач
20.02.2026