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

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

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

Проверить, есть ли такая проблема, просто:

  • Откройте страницу товара с нулевым запасом.
  • Попробуйте добавить товар или вариацию в корзину.
  • Если это возможно — значит, автоматическое отключение не настроено.

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

1. Отключение товаров с нулевым запасом через код

Добавьте в functions.php вашей активной темы или в кастомный плагин следующий код. Он проверяет наличие и при нулевом остатке меняет статус товара на «черновик», скрывая его с фронтенда.

add_action('woocommerce_product_set_stock_status', 'auto_disable_out_of_stock_products', 10, 3);
function auto_disable_out_of_stock_products($product_id, $stock_status, $product) {
    if ($stock_status === 'outofstock') {
        // Меняем статус товара на черновик
        wp_update_post(array(
            'ID' => $product_id,
            'post_status' => 'draft'
        ));
    } else {
        // Если товар снова в наличии, возвращаем статус 'publish'
        $post = get_post($product_id);
        if ($post->post_status === 'draft') {
            wp_update_post(array(
                'ID' => $product_id,
                'post_status' => 'publish'
            ));
        }
    }
}

Этот подход гарантирует, что товары полностью исчезают из каталога при отсутствии запаса. Но стоит помнить, что это меняет статус поста и может повлиять на SEO.

2. Отключение вариантов товара с нулевым запасом

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

add_filter('woocommerce_variation_is_active', 'disable_out_of_stock_variations', 10, 2);
function disable_out_of_stock_variations($is_active, $variation) {
    if (!$variation->is_in_stock()) {
        return false; // Отключаем вариант если нет на складе
    }
    return $is_active;
}

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

Пошаговая инструкция по внедрению

  1. Создайте резервную копию сайта и базы данных.
  2. Откройте файл functions.php вашей темы или создайте кастомный плагин для пользовательских функций.
  3. Вставьте код для автоматического отключения товаров с нулевым запасом.
  4. Вставьте фильтр для отключения вариантов без запаса.
  5. Очистите кэш сайта и браузера.
  6. Проверьте работу на продуктах с разным запасом.

Как проверить, что решение работает

  • Создайте тестовый товар с запасом 1 и проверьте, что он отображается и доступен для покупки.
  • Уменьшите запас товара до 0 через админку или вручную.
  • Обновите страницу товара на фронтенде: товар должен исчезнуть (если статус черновик) или вариант должен стать недоступным.
  • Попытайтесь добавить товар или вариант с нулевым запасом в корзину — опция должна быть недоступна.

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

  • Код не работает после добавления в functions.php — возможно, тема кеширует файлы или есть синтаксическая ошибка. Проверьте логи PHP и деактивируйте кэширование.
  • Товар не меняет статус на «черновик» — проверьте, что функция wp_update_post вызывается с правильным ID и что нет конфликтов с плагинами.
  • Варианты с нулевым запасом отображаются — убедитесь, что фильтр подключен корректно и что вариации обновлены с правильным статусом запаса.
  • SEO-проблемы из-за изменения статуса товара — в этом случае можно вместо смены статуса использовать фильтр для скрытия товара из каталогов, например pre_get_posts.

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

  • Добавляйте проверку nonce или capability, если планируете расширять функционал для админки.
  • Избегайте тяжелых запросов в хуках, вызываемых часто, чтобы не замедлять сайт.
  • Кэшируйте результаты проверки запаса, если используете в большом количестве.
  • Тестируйте изменения на staging-сайте, чтобы избежать простоев в работе магазина.

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

МетодОписаниеПлюсыМинусы
Изменение статуса поста (на draft)Меняет статус товара на «черновик» при отсутствии запасаПолностью скрывает товар, исключает из поиска и каталогаВлияет на SEO, может сбивать аналитику
Фильтр вариаций (woocommerce_variation_is_active)Отключает варианты без запаса, скрывая их из выбораПростой, не меняет статус товараТовар видим, но варианты скрыты — может запутать клиентов
Фильтр pre_get_posts с исключением outofstockСкрывает товары из каталога без изменения статусаSEO сохраняется, товар не удаляетсяТовар доступен по прямой ссылке, возможен дублированный контент
Как удалить из поиска и индексации страницы авторизации и регистрации в WordPress
15.08.2026
Исключение товаров и вариантов WooCommerce по атрибуту из корзины и оформления заказа
10.06.2026
Автоматическое отключение вариантов товаров WooCommerce при отсутствии запаса
22.07.2026
Как использовать WPReg_cron для автоматизации задач в WordPress
11.04.2026
WooCommerce: как автоматически отключать варианты товара при нулевом запасе
08.08.2026