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

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

Частая проблема в интернет-магазинах на WooCommerce — некорректное отображение товаров с нулевым остатком. Такие товары продолжают отображаться, их можно заказать, что приводит к ошибкам в заказах и ухудшению пользовательского опыта. Также часто возникает задача автоматически изменять цену товара при достижении определённых условий, например, при снижении остатка.

Для диагностики используйте следующие шаги:

  • Проверьте в админке WooCommerce наличие товаров с остатком 0.
  • Проверьте настройки WooCommerce: WooCommerce > Настройки > Продукты > Запасы — включена ли опция Управлять запасами и Скрывать товары при отсутствии на складе.
  • Посмотрите, не переопределяет ли тема или плагины отображение товаров с нулевым остатком.
  • Используйте плагин Query Monitor для проверки SQL-запросов, чтобы убедиться, что товары с нулевым остатком действительно исключаются из запросов.

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

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

В админке WooCommerce перейдите в WooCommerce > Настройки > Продукты > Запасы и убедитесь, что включена опция Управлять запасами.

Шаг 2. Скрытие товаров с нулевым остатком

В той же вкладке активируйте опцию Скрывать товары при отсутствии на складе. Это базовое решение.

Шаг 3. Автоматическое изменение цены для товаров с низким остатком

Добавьте следующий код в файл functions.php активной темы или в плагин для кастомных функций:

add_action('woocommerce_before_calculate_totals', 'wpexperts_adjust_price_low_stock', 10, 1);
function wpexperts_adjust_price_low_stock( $cart ) {
    if ( is_admin() && ! defined('DOING_AJAX') ) return;

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = $cart_item['data'];
        $stock_quantity = $product->get_stock_quantity();
        if ( $stock_quantity !== null && $stock_quantity <= 5 && $stock_quantity > 0 ) {
            // Снижаем цену на 10% при остатке 5 и меньше
            $regular_price = $product->get_regular_price();
            $new_price = $regular_price * 0.9;
            $product->set_price( $new_price );
        }
    }
}

Этот код автоматически снижает цену в корзине для товаров, у которых остаток 5 и меньше. Можно подстроить условие под свои нужды.

Шаг 4. Автоматическое отключение товаров с нулевым остатком (в админке и на фронтенде)

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

add_action( 'woocommerce_product_set_stock_status', 'wpexperts_disable_product_on_zero_stock', 10, 3 );
function wpexperts_disable_product_on_zero_stock( $product_id, $stock_status, $product ) {
    if ( $stock_status === 'outofstock' ) {
        // Меняем статус продукта на 'черновик', чтобы скрыть его
        wp_update_post( array(
            'ID' => $product_id,
            'post_status' => 'draft',
        ) );
    } elseif ( $stock_status === 'instock' ) {
        // Восстанавливаем статус 'опубликовано' при появлении товара
        $post = get_post( $product_id );
        if ( $post->post_status === 'draft' ) {
            wp_update_post( array(
                'ID' => $product_id,
                'post_status' => 'publish',
            ) );
        }
    }
}

Этот код при обновлении статуса запаса автоматически переводит товар в черновик, если остаток 0, и возвращает в опубликованные при появлении товара.

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

Для проверки выполните:

  • Создайте тестовый товар с остатком 0 и убедитесь, что он скрыт на сайте и в каталоге.
  • Создайте товар с остатком 5 или меньше и добавьте его в корзину, проверьте, что цена снижается на 10%.
  • Измените остаток товара через админку, проверьте, что статус товара меняется корректно.

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

  • Опция «Скрывать товары при отсутствии на складе» не работает: проверьте, не переопределяет ли тема шаблон вывода каталога. Для теста переключитесь на стандартную тему Storefront.
  • Автоматическое изменение цены не срабатывает в корзине: убедитесь, что хук woocommerce_before_calculate_totals добавлен без ошибок и что условия внутри функции корректны.
  • Товары с нулевым остатком не переводятся в черновик: проверьте, что хук woocommerce_product_set_stock_status срабатывает, и нет конфликтов с другими плагинами, которые меняют статус товара.
  • Изменения цен не отображаются в мини-корзине: вызовите WC()->cart->calculate_totals(); после установки цены, если нужно обновить корзину принудительно.

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

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

Сравнение способов решения

МетодПлюсыМинусыРекомендуется для
Опция WooCommerce «Скрывать товары при отсутствии»Простота, не требует кодаМожет не работать с кастомными темамиМалые магазины без кастомного вывода
Код для изменения статуса товара (draft)Полное скрытие товара, автоматизацияМожет влиять на SEO, требует тестированияСредние и крупные магазины с контролем статусов
Автоматическое изменение цены через хук корзиныГибкость, легко настроить условияНе влияет на цену в каталоге, только в корзинеМагазины с динамическими скидками
WooCommerce: как автоматически удалять товары с нулевым остатком на складе
23.04.2026
Оценка производительности WordPress с помощью Query Monitor
09.04.2026
WooCommerce: как автоматически удалять товары с нулевым остатком на складе без плагинов
17.05.2026
Как создать выставку новостей с AJAX в WordPress
22.01.2026
WooCommerce: как автоматически удалять товары с нулевым остатком на складе без плагинов
04.06.2026