В чем суть проблемы с наличием товаров в WooCommerce после отмены заказа
В WooCommerce при отмене или возврате заказа стандартное поведение не всегда корректно восстанавливает количество товара на складе. Особенно это актуально, если используются кастомные статусы заказов или сторонние плагины, которые влияют на управление запасами. В итоге товар может остаться в статусе "нет в наличии" или с некорректным количеством, что приводит к потере продаж и неудобствам для клиентов.
Диагностика проблемы: как проверить актуальное состояние запасов
Для диагностики выполните следующие действия:
- Откройте панель администратора WooCommerce → Товары → нужный товар и проверьте поле «Количество на складе»;
- Перейдите в Заказы → проверьте статус отмененного заказа и его детали;
- Включите логирование WooCommerce для инвентаризации (WooCommerce → Статус → Логи) — возможны ошибки в обновлении запасов;
- Проверьте, что в настройках WooCommerce (WooCommerce → Настройки → Товары → Инвентаризация) включено управление запасами.
Пошаговое решение: автоматическое восстановление наличия товара при отмене заказа
Добавим в functions.php вашей темы (или в плагин-сниппет) следующий код, который будет отслеживать отмену заказа и корректно восстанавливать запасы товара:
add_action('woocommerce_order_status_cancelled', 'restore_stock_on_order_cancelled', 10, 1);
add_action('woocommerce_order_status_refunded', 'restore_stock_on_order_cancelled', 10, 1);
function restore_stock_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) {
$product = $item->get_product();
if (!$product || !$product->managing_stock()) continue;
$qty = $item->get_quantity();
// Увеличиваем запас товара
$stock_quantity = $product->get_stock_quantity();
$new_stock = $stock_quantity + $qty;
$product->set_stock_quantity($new_stock);
$product->save();
}
}Этот код обрабатывает события отмены и возврата заказа, корректно увеличивая количество товара на складе.
Что делать, если используется кастомный статус заказа
Если у вас есть пользовательские статусы, добавьте их в обработку, например:
add_action('woocommerce_order_status_my_custom_status', 'restore_stock_on_order_cancelled', 10, 1);Проверка результата после внедрения
Чтобы убедиться, что всё работает, выполните следующие шаги:
- Создайте заказ с товаром, у которого ограниченный запас (например, 5 штук).
- Подтвердите заказ и убедитесь, что запас уменьшился (например, стал 4).
- Отмените или сделайте возврат заказа.
- Проверьте в карточке товара наличие: оно должно вернуться к исходному количеству (5).
- Также убедитесь, что в WooCommerce логи не появляются ошибки, связанные с запасами.
Частые ошибки и как их исправить
- Запас не обновляется: Проверьте, что у продукта включено управление запасами (
manage_stock= true). Если выключено, код не сработает. - Код не срабатывает на кастомных статусах: Добавьте хук для вашего статуса отмены, как показано выше.
- Конфликты с плагинами управления запасами: Отключите сторонние плагины для тестирования, чтобы убедиться, что они не блокируют изменение запасов.
- Изменение запасов происходит несколько раз: Проверьте, что событие обрабатывается только один раз для каждого заказа, избегайте дублирующих хуков.
Практические советы по безопасности и производительности
- Используйте дочернюю тему или отдельный плагин для добавления кода, чтобы избежать потери изменений при обновлении темы.
- Не используйте тяжелые запросы в хуках обработки статусов, чтобы не замедлять процесс оформления заказа.
- Резервируйте базу данных перед внесением изменений, если работаете на живом сайте.
- Для больших магазинов с большим количеством заказов рассмотрите использование фоновых задач (wp-cron) для обновления запасов, если возникает нагрузка.
Сравнение вариантов решения
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Встроенный WooCommerce (без кода) | Простота, встроенная поддержка | Иногда не корректно обрабатывает отмены, зависит от статусов | Маленькие магазины с базовыми статусами |
| Код на хуках (как в статье) | Гибкость, точный контроль, работает с кастомными статусами | Требует навыков разработки, нужно тестировать | Магазины с кастомными статусами и сложной логикой |
| Сторонние плагины управления запасами | Расширенный функционал, готовые решения | Дополнительная нагрузка, возможны конфликты | Крупные магазины, требующие комплексного управления |