WooCommerce: как автоматически изменять наличие товаров и отключать оформление заказа при отсутствии товара

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

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

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

  • Статус запасов товара не меняется при уменьшении количества до нуля;
  • На странице товара не отображается информация «Нет в наличии»;
  • Покупатели могут оформить заказ на товары с нулевым остатком;
  • Нет автоматического закрытия оформления заказа при отсутствии товара в корзине.

Если хотя бы один пункт верен — требуется автоматизация управления статусом наличия и блокировка оформления.

Автоматическое обновление статуса наличия товара

WooCommerce по умолчанию умеет менять статус наличия при правильной настройке. Проверьте, что в настройках товаров включён учёт складских запасов:

  1. В админ-панели перейдите в WooCommerce → Настройки → Товары → Запасы;
  2. Включите опцию Включить управление запасами на складе;
  3. Убедитесь, что параметр Разрешить заказы при отсутствии товара выключен.

Для автоматического обновления статуса при изменении количества можно добавить следующий код в functions.php вашей темы или создать небольшой плагин:

add_action('woocommerce_reduce_order_stock', 'auto_update_product_stock_status', 10, 1);function auto_update_product_stock_status($order) {    if (! $order instanceof WC_Order) {        return;    }    foreach ($order->get_items() as $item) {        $product = $item->get_product();        if ($product && $product->managing_stock()) {            $stock_quantity = $product->get_stock_quantity();            if ($stock_quantity !== null && $stock_quantity <= 0) {                $product->set_stock_status('outofstock');                $product->save();            }        }    }}

Этот код срабатывает при списании товара со склада после оформления заказа и автоматически ставит товар в статус «Нет в наличии», если остаток меньше или равен нулю.

Автоматическое отключение оформления заказа при отсутствии товаров в корзине

Даже если товар в корзине отсутствует или его количество превышает остаток, оформление заказа должно быть заблокировано. Добавьте проверку перед загрузкой страницы оформления:

add_action('template_redirect', 'block_checkout_if_out_of_stock');function block_checkout_if_out_of_stock() {    if (is_checkout() && ! is_wc_endpoint_url()) {        foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {            $product = $cart_item['data'];            $quantity = $cart_item['quantity'];            if ($product->managing_stock()) {                $stock_quantity = $product->get_stock_quantity();                if ($stock_quantity === null || $stock_quantity < $quantity) {                    wc_add_notice(sprintf('Товар «%s» недоступен в нужном количестве.', $product->get_name()), 'error');                    wp_safe_redirect(wc_get_cart_url());                    exit;                }            }        }    }}

Этот код проверяет каждый товар при попытке оформить заказ и перенаправляет пользователя обратно в корзину с ошибкой, если товара недостаточно.

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

Для тестирования:

  1. Создайте товар с ограниченным запасом, например, 2 шт.;
  2. Добавьте товар в корзину в количестве, превышающем запас (например, 3 шт.);
  3. Попробуйте перейти к оформлению заказа;
  4. Должно появиться сообщение об ошибке, и пользователь будет возвращён в корзину;
  5. Сделайте заказ на весь запас, после оформления проверьте, что статус товара изменился на «Нет в наличии»;
  6. Попробуйте снова добавить товар в корзину — должно появиться предупреждение или товар будет недоступен.

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

  • Неправильные настройки складских запасов — не включено управление запасами в настройках WooCommerce. Решение: включить в WooCommerce → Настройки → Товары → Запасы.
  • Конфликты с плагинами кэширования — страницы корзины и оформления заказа кэшируются, из-за чего статус товара не обновляется. Решение: добавить исключения для страниц корзины и оформления заказа в настройках плагина кэширования.
  • Код не срабатывает из-за кеширования объекта продукта. Решение: использовать методы работы с объектами WooCommerce, обновлять объект после изменения статуса.
  • Отсутствие проверки на управление запасами — код влияет на товары без учета остатков. Решение: добавлять проверки $product->managing_stock().

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

  • Код лучше размещать в дочерней теме или собственном небольшом плагине, чтобы не потерять изменения при обновлении.
  • Избегайте выполнения лишних запросов к базе данных, кешируйте результаты при необходимости.
  • Обязательно тестируйте изменения на тестовом сайте перед запуском на реальном, особенно если у вас большой ассортимент и много заказов.
  • При использовании сторонних плагинов для управления запасами проверяйте совместимость с вашим кодом.

Сравнение вариантов решения задачи

МетодОписаниеПлюсыМинусы
Встроенные настройки WooCommerceВключить управление запасами и запрет оформления при отсутствии товараПростота, без кода, стабильностьНе всегда учитывает сложные сценарии и кастомизацию
Код в functions.phpАвтоматическое обновление статуса и блокировка оформления через хукиГибкость, контроль, автоматизацияТребует навыков, возможны ошибки без тестирования
Плагины сторонних разработчиковПлагин для управления запасами и логикой оформленияДополнительные функции, удобный интерфейсНагрузка, возможные конфликты, платные решения
Динамический фильтрованный список записей WordPress с WP_Query и AJAX
11.12.2025
Как автоматизировать управление пользовательскими ролями в WordPress: практические решения
15.03.2026
WooCommerce: как автоматически изменять цены товаров при скидках через код
22.04.2026
Как сделать защищённый доступ к страницам WordPress
14.04.2026
Как автоматизировать создание и удаление черновиков в WordPress
24.02.2026