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

Почему важно автоматически отключать товары с нулевым остатком

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

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

Проверьте, отображается ли кнопка В корзину для товаров, у которых на складе 0. Иногда темы или плагины могут влиять на отображение статуса товара, поэтому важно проверить:

  • Стандартное поведение WooCommerce: при включённом управлении запасами товары с 0 на складе должны быть автоматически помечены как «нет в наличии» и недоступны для покупки.
  • Настройки в WooCommerce > Настройки > Товары > Запасы, где должна быть активирована опция управления запасами и отключена возможность покупки товаров с нулевым остатком.
  • Отсутствие кастомного кода или плагинов, которые изменяют это поведение.

Проверка статуса товара через код

global $product;
if ( ! $product->is_in_stock() ) {
    // Товар недоступен для заказа
}

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

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

Чтобы автоматизировать отключение товаров с 0 на складе, добавим в файл functions.php темы или в кастомный плагин следующий код.

1. Проверка и смена статуса товара при обновлении остатков

add_action( 'woocommerce_update_product', 'auto_disable_out_of_stock_products' );
function auto_disable_out_of_stock_products( $product_id ) {
    $product = wc_get_product( $product_id );
    if ( ! $product ) {
        return;
    }

    if ( $product->managing_stock() ) {
        $stock_quantity = $product->get_stock_quantity();

        if ( $stock_quantity <= 0 ) {
            // Отключаем товар
            $product->set_catalog_visibility( 'hidden' );
            $product->set_status( 'draft' ); // снимает с публикации
            $product->save();
        } else {
            // Включаем товар обратно
            if ( $product->get_status() === 'draft' ) {
                $product->set_status( 'publish' );
                $product->set_catalog_visibility( 'visible' );
                $product->save();
            }
        }
    }
}

2. Автоматический запуск проверки для всех товаров (например, при кроне)

function auto_disable_all_out_of_stock() {
    $args = [
        'limit' => -1,
        'status' => ['publish', 'draft'],
    ];
    $products = wc_get_products( $args );

    foreach ( $products as $product ) {
        if ( $product->managing_stock() ) {
            $stock_quantity = $product->get_stock_quantity();
            if ( $stock_quantity <= 0 && $product->get_status() === 'publish' ) {
                $product->set_status( 'draft' );
                $product->set_catalog_visibility( 'hidden' );
                $product->save();
            } elseif ( $stock_quantity > 0 && $product->get_status() === 'draft' ) {
                $product->set_status( 'publish' );
                $product->set_catalog_visibility( 'visible' );
                $product->save();
            }
        }
    }
}
// Для запуска вручную
// auto_disable_all_out_of_stock();

Для автоматизации можно подключить вызов этой функции в крон WordPress или системный cron.

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

Для проверки:

  • Обновите остаток товара до 0 в админке WooCommerce.
  • Проверьте, что товар сменил статус на Черновик (draft) и не отображается в каталоге.
  • Попробуйте найти товар по URL — он должен быть недоступен.
  • Восстановите остаток > 0, убедитесь, что товар возвращается в публикацию и виден в каталоге.

Также можно добавить логирование для контроля, например:

error_log( "Product {$product_id} status changed to {$product->get_status()}" );

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

  • Код не срабатывает при обновлении товара через импорт или массовое редактирование: хук woocommerce_update_product срабатывает не всегда; используйте WP_Cron для периодической проверки.
  • Товар виден несмотря на статус «черновик»: тема или кеш могут показывать устаревшую версию — очистите кеш сайта и браузера.
  • Проблемы с видимостью товара после переключения статуса: убедитесь, что у товара выставлен параметр catalog_visibility в hidden, иначе он может отображаться в поиске.
  • Ошибка при попытке сохранить товар через код: проверьте, что пользователь или процесс имеет права на редактирование товара.

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

  • Не запускайте массовую проверку всех товаров слишком часто — это может замедлить сайт. Оптимально 1 раз в сутки через WP_Cron.
  • Используйте транзиенты или кеширование для хранения результатов проверки, чтобы избежать повторных запросов.
  • При использовании кода в functions.php — сделайте резервную копию сайта и тестируйте на локальной копии.
  • Для безопасного управления статусами товаров используйте нативные функции WooCommerce, чтобы избежать конфликтов с другими плагинами.

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

МетодПлюсыМинусыКогда использовать
Кастомный код в functions.phpПолный контроль, нет зависимости от плагиновТребует навыков программирования, возможны ошибки при обновленияхЕсли вы разработчик и хотите точечное решение
Плагины автоматического управления запасамиПростота установки, готовые функцииМогут влиять на производительность, конфликтовать с другими плагинамиДля быстрого внедрения без кода
Ручное управление статусамиНе требует кодаТрудозатратно, риск ошибокДля небольших магазинов с малым количеством товаров
WooCommerce: автоматическое отключение товаров с нулевым остатком без плагинов
16.06.2026
WooCommerce: как автоматически удалять товары с нулевым остатком на складе
08.05.2026
Как использовать хук pre_get_posts для фильтрации запросов в WordPress
19.12.2025
WooCommerce: автоматическое отключение товаров с нулевым остатком без плагинов
09.06.2026
Создаем собственный виджет WordPress с примером кода
15.11.2025