Проблема: неправильное обновление остатков и цены после возврата товара в WooCommerce
В стандартном WooCommerce возврат товара не всегда корректно обновляет количество и стоимость на складе, особенно если используются кастомные цены, скидки или изменённые атрибуты товара. Это приводит к рассинхронизации данных и ошибкам в учёте запасов и финансов.
Диагностика проблемы
- Проверить, обновляется ли количество товара в админке WooCommerce после возврата.
- Проверить, меняется ли стоимость товара или итоговая сумма заказа при возврате.
- Посмотреть логи ошибок PHP для уведомлений о сбоях в хуках.
- Убедиться, что не используются сторонние плагины, которые могут блокировать стандартные хуки WooCommerce.
Пошаговое решение: автоматическое обновление количества и стоимости товара после возврата
Для решения задачи нужно использовать хук woocommerce_order_refunded, который срабатывает при возврате товара, и написать обработчик, который скорректирует количество товара на складе и обновит стоимость, если есть кастомные расчёты.
add_action('woocommerce_order_refunded', 'custom_update_stock_and_price_on_refund', 10, 2);
function custom_update_stock_and_price_on_refund($order_id, $refund_id) {
$order = wc_get_order($order_id);
$refund = wc_get_order($refund_id);
// Перебираем все возмещённые позиции
foreach ($refund->get_items() as $item_id => $item) {
$product_id = $item->get_product_id();
$quantity_refunded = $item->get_quantity();
$product = wc_get_product($product_id);
if (!$product) continue;
// Обновляем количество товара на складе
if ($product->managing_stock()) {
$stock_qty = $product->get_stock_quantity();
$new_stock = $stock_qty + $quantity_refunded;
$product->set_stock_quantity($new_stock);
$product->save();
}
// Пример: обновление стоимости - если используется кастомная логика
// Здесь нужно добавить код для пересчёта цены, если применимо
}
}
Если у вас есть кастомные поля с ценами или скидками, их нужно обновлять отдельно в этом же обработчике.
Как проверить, что решение сработало
- Создайте возврат в тестовом заказе в админке WooCommerce.
- Проверьте в карточке товара, что количество на складе увеличилось на количество возвращённых товаров.
- Проверьте, что цена товара (если менялась) соответствует ожидаемой.
- Проверьте, что в заказе отражены корректные суммы после возврата.
Частые ошибки и как их исправить
- Не срабатывает хук: Проверьте, не отключен ли WooCommerce в режиме разработки, и нет ли конфликтов с плагинами кеширования.
- Количество не обновляется: Убедитесь, что у товара включено управление запасами (
manage_stock), иначе изменения количества игнорируются. - Цена не обновляется: Кастомные цены требуют дополнительной логики, стандартные хуки не меняют цену в заказах автоматически.
- Ошибки PHP при возврате: Проверьте синтаксис и наличие всех обязательных функций WooCommerce, обновите WooCommerce до последней версии.
Практические советы по безопасности и производительности
- Используйте транзакции базы данных или проверяйте успешность сохранения товара после изменения запасов.
- Минимизируйте количество операций внутри хука, чтобы не замедлять процесс возврата заказа.
- Обрабатывайте возвраты только для тех товаров, у которых включено управление запасами.
- Тестируйте на staging-сервере перед внедрением на живом сайте.
Сравнение вариантов реализации обновления остатков
| Метод | Преимущества | Недостатки |
|---|---|---|
| Использование стандартных настроек WooCommerce | Простота, поддержка из коробки | Не всегда обновляет кастомные цены, проблемы с комплексными возвратами |
Кастомный хук woocommerce_order_refunded |
Гибкость, возможность кастомизации логики | Требует программирования, возможность ошибок при неправильной реализации |
| Плагины для управления возвратами и складом | Интерфейс и дополнительные функции | Может грузить систему, конфликтовать с другими плагинами, платные |