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

Диагностика проблемы: почему статус наличия товара не обновляется автоматически

В стандартной установке WooCommerce для каждого товара и вариации есть поле «наличие» (stock status), которое может принимать значения: «в наличии» (instock), «нет в наличии» (outofstock) или «по предзаказу» (onbackorder). Однако при изменении количества товара вручную через админку или программно, статус не всегда корректно обновляется автоматически, что приводит к неправильному отображению наличия на сайте и в корзине.

Основные причины проблемы:

  • отключено управление запасами на уровне товара;
  • изменение количества происходит напрямую в базе без вызова нужных хуков;
  • кастомные скрипты изменяют количество, но не обновляют статус;
  • кэширование блокирует обновление данных.

Как настроить автоматическое изменение статуса наличия при изменении количества

1. Включение управления запасами на уровне товара

Для начала необходимо убедиться, что у товара включено управление запасами. Без этого WooCommerce не будет менять статус наличия автоматически.

update_post_meta( $product_id, '_manage_stock', 'yes' );

Можно проверить в админке товара, во вкладке «Инвентарь» должна быть активна опция «Управлять запасами?»

2. Использование стандартных методов WooCommerce для обновления количества и статуса

При программном изменении количества товара лучше использовать методы класса WC_Product, которые корректно обновляют и статус:

$product = wc_get_product( $product_id );

// Задаём новое количество
$product->set_stock_quantity( $new_quantity );

// Автоматически обновляем статус наличия
if ( $new_quantity > 0 ) {
    $product->set_stock_status('instock');
} else {
    $product->set_stock_status('outofstock');
}

$product->save();

Для вариаций аналогично:

$variation = wc_get_product( $variation_id );
$variation->set_stock_quantity( $new_quantity );
$variation->set_stock_status( $new_quantity > 0 ? 'instock' : 'outofstock' );
$variation->save();

3. Автоматизация обновления статуса через хук при изменении количества вручную

Иногда полезно добавить проверку и обновление статуса при сохранении товара через админку. Для этого можно использовать хук save_post_product:

add_action( 'save_post_product', 'auto_update_stock_status', 20, 1 );
function auto_update_stock_status( $post_id ) {
    $product = wc_get_product( $post_id );
    if ( ! $product ) {
        return;
    }
    if ( $product->managing_stock() ) {
        $qty = $product->get_stock_quantity();
        $status = ( $qty > 0 ) ? 'instock' : 'outofstock';
        if ( $product->get_stock_status() !== $status ) {
            $product->set_stock_status( $status );
            $product->save();
        }
    }
}

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

  • Измените количество товара через админку и сохраните.
  • Перейдите на страницу товара на фронтенде и убедитесь, что статус «В наличии» или «Нет в наличии» отображается корректно.
  • Для проверки программного изменения можно добавить тестовый скрипт или вызвать функцию из консоли WP-CLI.
  • Проверьте, что в корзине и на страницах архива товара статус отображается верно.

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

  • Не включено управление запасами: без включенной опции WooCommerce не обновит статус. Проверьте параметр _manage_stock в метаданных товара.
  • Изменение количества без вызова метода save(): при прямом изменении мета-поля _stock статус не обновится. Используйте методы WC_Product.
  • Кэширование: кеш плагинов или серверный кеш могут показывать старый статус. Очистите кеш после изменений.
  • Хуки не срабатывают: при массовом импорте данных возможно отключение хуков, используйте WP-CLI или кастомные скрипты с вызовом методов сохранения.

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

  • Избегайте прямого изменения данных в базе без использования WC_Product, чтобы не сломать бизнес-логику WooCommerce.
  • Для массовых обновлений используйте WP-CLI скрипты, чтобы избежать таймаутов и проблем с нагрузкой.
  • При большом количестве товаров и вариаций кешируйте данные с помощью transient API, но очищайте кеш после изменений.
  • Добавьте логирование изменений запасов для аудита и отката проблемных изменений.

Сравнение вариантов обновления статуса наличия товара

МетодПодходит дляПлюсыМинусы
Прямое изменение мета-полейРедкие ручные правкиПростота реализацииНе обновляет статус, риск ошибок
Использование WC_Product и методов set_stock_quantity(), set_stock_status()Программные изменения, плагиныКорректное обновление статуса и событийТребует знания API
Автоматизация через хук save_post_productОбновления через админкуГарантированное обновление статусаМожет влиять на производительность при большом объёме
Как установить и настроить подключение к внешней базе данных в WordPress
20.04.2026
WooCommerce: автоматическое удаление неактивных вариаций товаров
16.07.2026
Как настроить автоматическое удаление неиспользуемых вариаций товаров в WooCommerce
27.04.2026
Как добавить автоматическое удаление старого контента в WordPress
01.04.2026
Как добавить автоматический гео-таргетинг в WordPress
12.01.2026