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

В чем суть проблемы с наличием товаров в 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);

Проверка результата после внедрения

Чтобы убедиться, что всё работает, выполните следующие шаги:

  1. Создайте заказ с товаром, у которого ограниченный запас (например, 5 штук).
  2. Подтвердите заказ и убедитесь, что запас уменьшился (например, стал 4).
  3. Отмените или сделайте возврат заказа.
  4. Проверьте в карточке товара наличие: оно должно вернуться к исходному количеству (5).
  5. Также убедитесь, что в WooCommerce логи не появляются ошибки, связанные с запасами.

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

  • Запас не обновляется: Проверьте, что у продукта включено управление запасами (manage_stock = true). Если выключено, код не сработает.
  • Код не срабатывает на кастомных статусах: Добавьте хук для вашего статуса отмены, как показано выше.
  • Конфликты с плагинами управления запасами: Отключите сторонние плагины для тестирования, чтобы убедиться, что они не блокируют изменение запасов.
  • Изменение запасов происходит несколько раз: Проверьте, что событие обрабатывается только один раз для каждого заказа, избегайте дублирующих хуков.

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

  • Используйте дочернюю тему или отдельный плагин для добавления кода, чтобы избежать потери изменений при обновлении темы.
  • Не используйте тяжелые запросы в хуках обработки статусов, чтобы не замедлять процесс оформления заказа.
  • Резервируйте базу данных перед внесением изменений, если работаете на живом сайте.
  • Для больших магазинов с большим количеством заказов рассмотрите использование фоновых задач (wp-cron) для обновления запасов, если возникает нагрузка.

Сравнение вариантов решения

МетодПлюсыМинусыКогда использовать
Встроенный WooCommerce (без кода)Простота, встроенная поддержкаИногда не корректно обрабатывает отмены, зависит от статусовМаленькие магазины с базовыми статусами
Код на хуках (как в статье)Гибкость, точный контроль, работает с кастомными статусамиТребует навыков разработки, нужно тестироватьМагазины с кастомными статусами и сложной логикой
Сторонние плагины управления запасамиРасширенный функционал, готовые решенияДополнительная нагрузка, возможны конфликтыКрупные магазины, требующие комплексного управления
WooCommerce: автоматическое изменение стоимости и наличия товара при оформлении заказа
29.05.2026
Как избежать конфликтов между плагинами WordPress: практические советы и кодовые примеры
04.03.2026
WooCommerce: автоматическое изменение стоимости и наличия товара при оформлении заказа
12.07.2026
WooCommerce: автоматическое изменение стоимости и наличия товара после оформления заказа
01.06.2026
WooCommerce: автоматическое удаление товаров без наличия через AJAX без перезагрузки страницы
05.07.2026

На оформлении, скоро здесь появится полноценный ресурс