Диагностика проблемы с возвратом товаров в склад после отмены заказа
По умолчанию WooCommerce не всегда корректно обновляет остатки товара на складе, если заказ отменяется вручную или автоматически. Это приводит к неверному учету товаров и может вызвать проблемы при дальнейших продажах, например, показывать товар как "нет в наличии" при фактическом наличии.
Основные признаки проблемы:
- После отмены заказа количество товара на складе не увеличивается.
- Товары остаются заблокированы в коризне или заказе и не доступны для продажи.
- Отсутствуют уведомления или логи возврата остатков.
Пошаговое решение: автоматический возврат товара на склад после отмены заказа в WooCommerce
1. Использование стандартного хука WooCommerce для отмены заказа
WooCommerce генерирует событие woocommerce_order_status_cancelled при смене статуса заказа на 'отменён'. Мы можем добавить обработчик, который вернёт остатки товаров на склад.
2. Добавление кастомного кода в functions.php вашей темы или в отдельный плагин
add_action('woocommerce_order_status_cancelled', 'custom_restore_stock_on_cancelled_order', 10, 1);
function custom_restore_stock_on_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 ) {
$product = $item->get_product();
if ( $product && $product->managing_stock() ) {
$qty = $item->get_quantity();
// Восстанавливаем количество на складе
wc_update_product_stock( $product, $qty, 'increase' );
}
}
}3. Обработка отмены заказа через другие статусы
Если у вас есть другие статусы, при которых требуется возврат товара на склад (например, 'failed', 'refunded'), добавьте обработчики аналогично:
add_action('woocommerce_order_status_refunded', 'custom_restore_stock_on_refunded_order', 10, 1);
function custom_restore_stock_on_refunded_order( $order_id ) {
// Логика аналогична предыдущей функции
}Проверка результата после внедрения
- Создайте тестовый заказ с несколькими товарами, убедитесь, что они уменьшают склад.
- Отмените заказ через админку (переведите статус заказа в 'Отменён').
- Проверьте, что остаток товара на складе увеличился на количество в заказе.
- Проверьте, что на странице товара в админке отображается актуальный остаток.
Частые ошибки и как их исправить
1. Возврат товара не происходит после отмены
- Проверьте, что функция
managing_stock()возвращает true для ваших товаров. Для некоторых типов товаров (например, виртуальных) управление складом может быть отключено. - Убедитесь, что хук
woocommerce_order_status_cancelledсрабатывает. Для этого можно добавитьerror_logилиvar_dumpвнутри функции.
2. Остаток увеличивается неправильно или дублируется
- Проверьте, что отмена заказа происходит один раз, и нет повторных вызовов функции.
- При автоматической отмене через сторонние плагины убедитесь, что они не вызывают конфликтующих действий.
3. Код вызывает ошибки PHP
- Проверьте, что функции WooCommerce загружены и доступны в момент вызова (например, код не вызывается до инициализации WooCommerce).
- Логируйте ошибки в
debug.logдля отладки.
Практические советы по безопасности и производительности
- Добавляйте проверки наличия объекта заказа и продукта, чтобы избежать фатальных ошибок.
- Не используйте тяжелые запросы внутри функций, вызываемых на каждом изменении статуса заказа.
- Если на сайте очень большой объем заказов, подумайте об асинхронной обработке возврата (через WP Cron или очередь задач).
Сравнение вариантов возврата товара на склад после отмены заказа
| Способ | Плюсы | Минусы |
|---|---|---|
| Встроенный функционал WooCommerce | Не требует кода, прост в использовании | Не всегда срабатывает корректно при ручных отменах |
| Кастомный код на хуках (пример выше) | Гибкий, точечный контроль, можно расширять | Требует знаний PHP, может конфликтовать с плагинами |
| Плагины для управления складом | Интерфейс, дополнительные функции управления запасами | Дополнительные затраты, возможны конфликты, нагрузка |