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

Проблема: как автоматически скрывать товары без наличия и возвращать их в продажу

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

Задача состоит в том, чтобы при достижении остатка товара 0 или меньше он автоматически становился «выключенным» (статус товара draft или private), а при появлении остатков — снова становился опубликованным.

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

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

  • Проверить настройки WooCommerce: в разделе Настройки → Товары → Запасы включена ли опция Включить управление запасами, и как настроены параметры Разрешить продажи при отсутствии товара и Отображать отсутствующие товары.
  • Проверить, что при уменьшении остатка товара до 0 он не скрывается автоматически.
  • Проверить, что при увеличении остатка товара с 0 товар не появляется автоматически.

Если пункты 2 или 3 не выполняются, значит нужна кастомизация.

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

Реализуем эту логику через хук woocommerce_product_set_stock, который срабатывает при обновлении остатков товара. В функции будем менять статус публикации товара в зависимости от наличия.

add_action('woocommerce_product_set_stock', 'auto_toggle_product_visibility_by_stock', 10, 1);
function auto_toggle_product_visibility_by_stock($product) {
    if (!$product instanceof WC_Product) {
        return;
    }

    $stock_quantity = $product->get_stock_quantity();
    $post_status = $product->get_status();

    // Если запас 0 или меньше и товар опубликован, меняем на черновик
    if ($stock_quantity <= 0 && $post_status === 'publish') {
        $product->set_status('draft');
        $product->save();
    }

    // Если запас больше 0 и товар в статусе draft, публикуем
    if ($stock_quantity > 0 && $post_status === 'draft') {
        $product->set_status('publish');
        $product->save();
    }
}

Этот код автоматически переключает статус товара между publish и draft в зависимости от наличия.

Поддержка вариативных товаров

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

add_action('woocommerce_variation_set_stock', 'auto_toggle_variation_visibility_by_stock', 10, 1);
function auto_toggle_variation_visibility_by_stock($variation) {
    if (!$variation instanceof WC_Product_Variation) {
        return;
    }

    $stock_quantity = $variation->get_stock_quantity();
    $post_status = $variation->get_status();

    if ($stock_quantity <= 0 && $post_status === 'publish') {
        $variation->set_status('draft');
        $variation->save();
    }

    if ($stock_quantity > 0 && $post_status === 'draft') {
        $variation->set_status('publish');
        $variation->save();
    }
}

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

  • Обновите остаток товара вручную через админку — установите 0 и сохраните. Товар должен автоматически сменить статус на «черновик» и исчезнуть из каталога.
  • Установите остаток больше 0 — товар должен стать опубликованным и появиться в каталоге.
  • Для вариаций повторите то же: измените остаток вариации и проверьте, отражается ли это на видимости.
  • Проверьте фронтенд сайта в режиме гостя и кэш браузера, чтобы убедиться, что изменения видны пользователям.

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

  • Статусы не меняются: возможно, функции не подключены или кеширование блокирует обновление. Проверьте, что код добавлен в файл functions.php дочерней темы или в отдельный плагин, а также очистите кеш сайта и браузера.
  • Изменения статуса вызывают проблемы с SEO: переключение между publish и draft влияет на индексацию. Чтобы избежать потери трафика, можно вместо draft использовать статус private или скрывать товары через мета-поля и фильтры.
  • Вариации не обновляются: убедитесь, что добавлена отдельная функция на хук woocommerce_variation_set_stock, так как вариации — отдельные посты.
  • Конфликты с другими плагинами: некоторые плагины управления запасами или кэширования могут блокировать сохранение или обновление статусов. Временно отключите их для диагностики.

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

  • Добавьте проверку nonce и прав доступа, если будете расширять функционал для административных интерфейсов.
  • Ограничьте частоту срабатывания функции, если у вас большой каталог, чтобы избежать нагрузки на сервер. Например, используйте WP-Cron для пакетной обработки.
  • Для SEO лучше использовать плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpelementor.ru&utm_medium=article&utm_campaign=woocommerce-kak-otklyuchit-tovar-pri-otsutstvii-nalichiya-i-razreshit-avtomaticheskoe-vosstanovlenie), который позволяет управлять статусами и индексированием без потери позиций.

Сравнение вариантов реализации автоматического скрытия товаров по наличию

ПодходОписаниеПреимуществаНедостатки
Код на хуках WooCommerceИспользование хуков woocommerce_product_set_stock и woocommerce_variation_set_stock для смены статуса товараПолный контроль, не требует сторонних плагинов, гибкостьНужны знания PHP, возможны ошибки при обновлениях, требует тестирования
Плагины управления запасамиГотовые решения, которые могут скрывать товары при отсутствииПростота установки, дополнительные функции управления запасамиМогут быть платными, конфликтовать с другими плагинами, не всегда гибкие
Скрытие через CSS/JSПросто скрыть товар визуально на фронтендеПростота реализацииТовар остается в базе и доступен по прямой ссылке, плохой UX
Как добавить динамические классы в Elementor с помощью кода
10.04.2026
Как добавить собственный CSS в Elementor без потери при обновлении
12.12.2025
Как установить и настроить WooCommerce для продажи цифровых товаров в WordPress
22.04.2026
Создать динамические формы в Elementor с помощью WPForms
25.12.2025
WooCommerce: как изменить количество отображаемых вариантов товара в Elementor
05.05.2026