WooCommerce: автоматическое возврат и снятие резервов товаров при отмене заказов

Диагностика проблемы с остатками при отмене заказов в WooCommerce

В стандартной настройке WooCommerce при отмене заказа запас товаров не всегда корректно возвращается на склад. Это приводит к расхождениям между реальным и отображаемым количеством товара, что негативно влияет на управление запасами и продажи.

Проверить проблему можно так:

  • Создайте тестовый заказ с резервированным товаром.
  • Отмените заказ через админку WooCommerce.
  • Проверьте наличие товара на складе в карточке товара.

Если количество товара не увеличилось, значит возврат не сработал, и требуется автоматизация процесса.

Пошаговое решение: добавляем автоматический возврат запасов и снятие резервов

1. Использование хука 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');
    }
}

2. Обработка возврата резервов при отмене заказов

Если вы используете плагины или кастомные решения для резервирования товара, нужно дополнительно интегрировать их с этим хуком. Например, если резервирование идёт через мета-данные заказа, то нужно очищать эти поля при отмене.

add_action('woocommerce_order_status_cancelled', 'custom_clear_reserves_on_cancelled_order', 20, 1);
function custom_clear_reserves_on_cancelled_order($order_id) {
    $order = wc_get_order($order_id);
    if (!$order) return;

    // Пример очистки пользовательского мета для резерва
    $order->delete_meta_data('_reserved_stock');
    $order->save();
}

Как проверить, что автоматический возврат работает

  • Создайте тестовый заказ с товаром, который управляется по запасам.
  • Отмените заказ через админ-панель WooCommerce.
  • Обновите страницу товара и посмотрите количество на складе – оно должно увеличиться на количество отменённых товаров.
  • Проверьте, что мета-данные резерва очищены, если используется кастомное резервирование.

Частые ошибки и как их исправить

  • Функция не срабатывает при смене статуса. Проверьте, что хук woocommerce_order_status_cancelled корректно добавлен и подключён в functions.php или в вашем плагине.
  • Запас не обновляется у товаров с вариациями. В этом случае нужно дополнительно проверить, что $product в цикле — это вариация, и обновлять запас именно у вариации.
  • Конфликты с другими плагинами по управлению запасами. Выполните тест с отключением сторонних плагинов, чтобы локализовать проблему, и при необходимости доработайте интеграцию.
  • Резервы не снимаются. Убедитесь, что очистка мета-данных соответствует вашей логике резервирования.

Практические советы по безопасности и производительности

  • Внимательно тестируйте функции на staging-сайте, чтобы избежать некорректного изменения запасов.
  • Используйте wc_get_order() вместо прямого обращения к базе для лучшей совместимости.
  • Если у вас большой магазин, добавьте логирование действий по обновлению запасов для аудита и отладки.
  • Оптимизируйте вызовы функций, чтобы не перегружать сайт при массовых отменах заказов.

Сравнение вариантов реализации возврата запасов

МетодПлюсыМинусыПодходит для
Стандартный хук woocommerce_order_status_cancelledПростая реализация, без плагиновНе учитывает кастомные резервыМаленькие и средние магазины с базовой логикой
Интеграция с плагинами резервированияКорректно снимает резервыСложнее в настройке, требуется тестированиеМагазины с расширенным управлением запасами
Использование сторонних плагинов для управления возвратамиГотовое решение, поддержкаЗависимость от стороннего кода, затратыКрупные магазины с бюджетом на поддержку
Как использовать WPExperts Clearfy Pro для укрепления безопасности WordPress
31.03.2026
WooCommerce: как автоматически удалять товары с нулевым остатком на складе
01.05.2026
Как создать динамические виджеты в WordPress с AJAX
16.01.2026
Как создать выставку новостей с AJAX в WordPress
22.01.2026
Запрет на удаление главной страницы в WordPress
14.04.2026