Диагностика проблемы: почему не возвращаются товары в склад при отмене заказа WooCommerce
В стандартной установке WooCommerce при отмене заказа товары не всегда автоматически возвращаются на склад. Это приводит к неправильному отображению остатков, что негативно влияет на продажи и управление запасами. Проблема часто проявляется, если отмена заказа не проходит через штатный интерфейс или если используются сторонние плагины, модифицирующие логику заказов.
Как проверить, что товары не возвращаются на склад?
- Отмените заказ в админке WooCommerce.
- Перейдите в карточку товара и проверьте количество на складе.
- Если количество не увеличилось, значит возврат запасов не сработал.
Пошаговое решение: автоматизация возврата товара в WooCommerce при отмене заказа
Для решения используем хук woocommerce_order_status_cancelled, который срабатывает при смене статуса заказа на «Отменён». Через этот хук пропишем функцию, которая вернёт товары в запас.
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() ) continue;
$qty = $item->get_quantity();
// Восстановить количество товара на складе
wc_update_product_stock( $product, $qty, 'increase' );
}
}Данный код гарантирует, что при отмене заказа количество товаров будет увеличено на количество, указанное в заказе. Важно, что функция проверяет, что товар управляет запасами, чтобы избежать ошибок с виртуальными товарами или услугами.
Как внедрить код?
- Добавьте код в файл
functions.phpактивной темы или в специальный плагин для пользовательских функций. - Убедитесь, что в WooCommerce активировано управление запасами (Настройки → Товары → Управление запасами).
Проверка результата после внедрения
После добавления кода и его активации сделайте следующее:
- Создайте тестовый заказ с товаром, у которого указан запас.
- Обработайте заказ, например, перейдите в статус "В ожидании" или "Обрабатывается".
- Отмените заказ через админку.
- Проверьте остаток товара — он должен увеличиться на количество, указанное в заказе.
Частые ошибки и как их исправить
- Код не срабатывает при смене статуса: Проверьте, что используете именно
woocommerce_order_status_cancelled, а не другие хуки.
Также убедитесь, что код загружается (например, нет синтаксических ошибок вfunctions.php). - Товары не управляют запасами: Убедитесь, что у товаров включено управление запасами в карточке товара и в настройках WooCommerce.
- Конфликты с другими плагинами, изменяющими логику заказов: Попробуйте временно отключить сторонние плагины, связанные с заказами, и проверить работу скрипта.
Практические советы по безопасности и производительности
- Безопасность: Не изменяйте код WooCommerce напрямую, используйте дочерние темы или плагины для кастомизации.
- Оптимизация: Хук срабатывает только при смене статуса на «Отменён», что минимизирует нагрузку.
- Логирование: Для отладки можно добавить логирование в функцию, например, через
error_log():
error_log('Возврат товара на склад для заказа ID: ' . $order_id);Альтернативные варианты: код vs плагины
| Метод | Плюсы | Минусы |
|---|---|---|
Код с хуком woocommerce_order_status_cancelled | Легко контролировать, бесплатно, быстро | Требует базовых знаний PHP, возможны конфликты с кастомными плагинами |
| Плагины для управления запасами (например, WooCommerce Stock Manager) | Графический интерфейс, дополнительные функции аналитики | Часто платные, могут нагружать сайт, не всегда точно работают с кастомными статусами |