WooCommerce: автоматическое отключение неактивных вариантов товаров

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

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

Ручное отключение вариантов при каждой смене остатков неудобно и неэффективно. Решение — автоматизация через код, чтобы варианты автоматически становились недоступными (disabled) или скрывались при отсутствии запасов.

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

Основной признак неактивного варианта — его запас (stock_quantity) равен нулю или меньше, и при этом управление запасами включено.

  • Проверяем, включено ли управление запасами у вариации: $variation->managing_stock()
  • Проверяем запас: $variation->get_stock_quantity()
  • Учитываем, что вариант может быть помечен как backorders_allowed(), тогда отключать его не нужно

Для диагностики используйте следующий код, который выводит список вариантов с их запасами и статусом:

function debug_variation_stock_status( $product_id ) {
    $product = wc_get_product( $product_id );
    if ( ! $product || ! $product->is_type( 'variable' ) ) {
        echo 'Товар не вариативный';
        return;
    }
    $variations = $product->get_children();
    foreach ( $variations as $variation_id ) {
        $variation = wc_get_product( $variation_id );
        $stock = $variation->get_stock_quantity();
        $managing_stock = $variation->managing_stock() ? 'Да' : 'Нет';
        $backorders = $variation->backorders_allowed() ? 'Да' : 'Нет';
        echo "Вариация ID $variation_id: Запас = $stock, Управление запасом = $managing_stock, Разрешены бэко́рдеры = $backorders<br>";
    }
}

Вызовите debug_variation_stock_status(123) в шаблоне или через WP CLI, заменив 123 на ID товара.

Решение: как автоматически отключать варианты без запаса

Реализуем фильтр woocommerce_variation_is_active, который отвечает за отображение вариации в выборе на странице товара. Если вариация неактивна, она не отображается.

Пример кода для functions.php вашей темы или в собственном плагине:

add_filter( 'woocommerce_variation_is_active', 'disable_out_of_stock_variations', 10, 2 );
function disable_out_of_stock_variations( $active, $variation ) {
    if ( ! $variation->managing_stock() ) {
        return $active; // Если управление запасом не включено, не меняем
    }
    if ( $variation->backorders_allowed() ) {
        return $active; // Бэко́рдеры разрешены, вариант доступен
    }
    $stock_quantity = $variation->get_stock_quantity();
    if ( $stock_quantity <= 0 ) {
        return false; // Отключаем вариант без запаса
    }
    return $active;
}

Этот код отключит варианты с нулевым или отрицательным запасом, если управление запасом включено и бэко́рдеры запрещены.

Дополнительно: отключение вариаций в админке

Если нужно, чтобы неактивные варианты не отображались и в админке, можно добавить проверку при загрузке страницы редактирования товара, однако это сложнее и чаще не требуется.

Проверка результата

  1. Добавьте код в functions.php или плагин.
  2. Очистите кеш сайта (если используется кеширование).
  3. Перейдите на страницу вариативного товара, где есть варианты с запасом 0 и без.
  4. Убедитесь, что варианты с нулевым запасом не отображаются в селекторе вариаций.
  5. Проверьте, что варианты с запасом больше 0 или разрешённым бэко́рдером отображаются.

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

  • Вариации не скрываются: Проверьте, что управление запасом включено на уровне вариации. Если выключено, фильтр не сработает.
  • Вариации отображаются, хотя запас 0: Возможно, включены бэко́рдеры. Логика фильтра их пропускает.
  • Фильтр не применяется: Убедитесь, что код добавлен в активную тему или плагин и нет конфликтов с другими плагинами, изменяющими вывод вариаций.
  • Появились ошибки PHP: Проверьте правильность синтаксиса, используйте отладчик или WP_DEBUG.

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

  • Код не вызывает дополнительных запросов к базе, использует уже загруженные объекты вариаций.
  • Внедряйте код через дочернюю тему или отдельный плагин, чтобы не потерять изменения при обновлении.
  • Тестируйте изменения на staging-среде, чтобы избежать сбоев на рабочем сайте.
  • Не отключайте варианты через JavaScript или CSS — это не безопасно и может запутать покупателей.

Сравнение способов отключения неактивных вариаций

МетодПлюсыМинусы
Фильтр woocommerce_variation_is_activeНативное отключение, не требует плагинов, быстроеРаботает только на фронтенде, не меняет статус вариаций в базе
Ручное отключение в админкеПолный контроль, можно настраивать вручнуюТрудозатратно при большом количестве вариаций
Плагины для управления запасамиУдобный интерфейс, дополнительные возможностиНагрузка на сайт, возможны конфликты
Как удалить пустые категории в WordPress с помощью кода
21.03.2026
WooCommerce: не отображается кнопка «Добавить в корзину» при использовании кастомных шаблонов — как исправить
31.05.2026
Оптимизация базы данных WordPress: удаление старых записей и оптимальная структура
03.04.2026
Как использовать плагин CPT UI для создания собственных типов записей в WordPress
09.12.2025
WooCommerce: невозможно изменить складские запасы через админку — как исправить
21.04.2026