Если в магазине WooCommerce вариация товара формально доступна, но по факту уже закончилась, покупатель всё равно может увидеть её в списке и попытаться добавить в корзину. Это типичная проблема для магазинов с небольшим остатком, ручным учетом склада или частыми синхронизациями с внешней системой. В итоге появляются лишние клики, ошибки на оформлении и вопросы в поддержку.
Ниже разберём рабочий сценарий: как автоматически скрывать или отключать вариации, у которых остаток равен нулю, без выдуманных хуков и без ломки стандартной логики WooCommerce.
Когда проблема действительно в настройках WooCommerce
Сначала стоит проверить, не решается ли задача штатными средствами. WooCommerce умеет управлять запасами на уровне товара и вариации, но поведение зависит от того, как именно у вас настроен каталог.
Что проверить в карточке вариативного товара
- Включено ли управление запасом на уровне вариации.
- Не стоит ли у вариации статус
В наличиивручную. - Не включён ли показ товаров, которых нет в наличии, в каталоге.
- Не используется ли сторонний плагин, который переопределяет вывод вариаций.
Если остаток ведётся на уровне родительского товара, а не вариации, WooCommerce не сможет корректно отключать конкретный размер, цвет или комплект. В таком случае сначала нужно перенести учет на вариации.
Диагностика: как понять, где ломается логика
Проблема обычно проявляется в одном из трёх мест: в выпадающем списке вариаций, в кнопке добавления в корзину или уже на этапе AJAX-обновления цены. Чтобы не гадать, проверьте поведение на чистом шаблоне и с отключенными плагинами, которые влияют на каталог.
Полезный порядок проверки такой:
- Откройте товар с 2–3 вариациями, у одной из них поставьте остаток
0. - Посмотрите, исчезла ли она из селектора вариаций.
- Попробуйте выбрать её вручную через URL или через сохранённый вариант в корзине.
- Проверьте, не возвращает ли тема старый HTML из кэша.
Если вариация видна, но при добавлении в корзину WooCommerce пишет, что товара нет в наличии, это уже не проблема склада, а проблема отображения. В этом случае лучше отключать вариацию до показа пользователю.
Сравнение подходов: настройка, код, плагин
| Подход | Когда подходит | Минусы |
|---|---|---|
| Штатные настройки WooCommerce | Если нужно просто скрыть товары без остатка в каталоге | Не всегда влияет именно на вариации |
| Код в теме или мини-плагине | Если нужна точная логика для вариаций | Нужно тестировать после обновлений |
| Плагин для управления каталогом | Если нужно больше правил и фильтров без разработки | Лишняя зависимость и риск конфликтов |
Для точечной задачи с вариациями чаще всего разумнее использовать код. Так вы контролируете именно тот участок логики, который нужен магазину.
Пошаговое решение через код
Ниже пример, который отключает вариацию, если у неё остаток равен нулю и включено управление запасом. Такой вариант не трогает обычные товары и не вмешивается в родительский продукт.
<?php
add_filter( 'woocommerce_variation_is_active', 'wprg_disable_out_of_stock_variations', 10, 2 );
function wprg_disable_out_of_stock_variations( $active, $variation ) {
if ( ! $variation instanceof WC_Product_Variation ) {
return $active;
}
if ( ! $variation->managing_stock() ) {
return $active;
}
$stock_quantity = $variation->get_stock_quantity();
if ( null !== $stock_quantity && (int) $stock_quantity <= 0 ) {
return false;
}
return $active;
}
Этот фильтр влияет на то, будет ли вариация считаться активной в интерфейсе выбора. Если тема корректно использует стандартные шаблоны WooCommerce, недоступная вариация станет невыбираемой.
Если нужно не только отключить, но и скрыть вариацию
Иногда недостаточно сделать вариант неактивным — его лучше вообще убрать из списка. Тогда можно дополнительно фильтровать доступные вариации перед выводом.
<?php
add_filter( 'woocommerce_available_variation', 'wprg_hide_out_of_stock_variation_data', 10, 3 );
function wprg_hide_out_of_stock_variation_data( $data, $product, $variation ) {
if ( ! $variation instanceof WC_Product_Variation ) {
return $data;
}
if ( $variation->managing_stock() ) {
$stock_quantity = $variation->get_stock_quantity();
if ( null !== $stock_quantity && (int) $stock_quantity <= 0 ) {
return false;
}
}
return $data;
}
Здесь важно не переусердствовать: если у вас есть предзаказы или товары с отрицательным остатком, такая логика может скрыть вариацию раньше времени. В этом случае условие нужно адаптировать под вашу модель склада.
Как внедрить без риска сломать сайт
Лучше не вставлять код прямо в functions.php активной темы, если магазин уже в работе. Практичнее добавить его в небольшой mu-plugin или в собственный мини-плагин. Тогда логика не исчезнет после смены темы.
Минимальный безопасный порядок:
- Сделайте резервную копию файлов и базы.
- Добавьте код в отдельный файл плагина.
- Проверьте один товар с вариациями на staging-версии.
- Очистите кэш страницы и кэш объекта, если он используется.
- Сравните поведение на мобильной и десктопной версии.
Если у вас стоит плагин оптимизации вроде Clearfy Pro, проверьте, не включены ли дополнительные настройки, которые меняют вывод WooCommerce или отключают часть скриптов каталога. Иногда проблема выглядит как ошибка вариаций, а на деле ломается JS-обновление формы.
Проверка результата после внедрения
После добавления кода не ограничивайтесь визуальной проверкой. Нужно убедиться, что вариация действительно недоступна в логике WooCommerce, а не просто скрыта стилями.
- Вариация с остатком
0не выбирается в селекторе. - Кнопка добавления в корзину не активируется для этой вариации.
- На странице товара не появляется цена и доступность для недоступного варианта.
- Если вариация была в корзине до изменения остатка, WooCommerce корректно сообщает о недоступности.
- Кэш страницы очищен, и вы видите актуальное состояние товара.
Отдельно проверьте, как ведёт себя фильтр вариаций в админке и на фронтенде. Иногда тема подменяет стандартный шаблон, и тогда код работает, но визуально ничего не меняется.
Частые ошибки и как их исправить
Остаток не учитывается, потому что включён режим «не управлять запасом»
Если у вариации выключено управление запасом, метод managing_stock() вернёт false, и код её не отключит. Решение простое: включить учет склада именно на уровне вариации.
Вариация скрывается, хотя должна быть доступна под заказ
Это означает, что логика слишком жёсткая. Для товаров с предзаказом нужно проверять не только остаток, но и статус допуска к покупке. Иначе вы отрежете рабочие сценарии продаж.
После обновления страницы вариация снова видна
Частая причина — кэш. Если страница товара или AJAX-ответ вариаций закэшированы, пользователь видит старые данные. Очистите серверный кэш, кэш плагина и, если нужно, CDN.
Кнопка «В корзину» остаётся активной
Значит, тема не использует стандартный шаблон вариаций или переопределяет JS. В таком случае нужно смотреть не только PHP-фильтры, но и шаблоны WooCommerce в теме.
Практические советы по безопасности и производительности
Если магазин большой, не стоит добавлять тяжёлые запросы к базе на каждом открытии карточки товара. Вариации уже загружаются WooCommerce, и дополнительная логика должна работать на готовых объектах, а не делать новые запросы без необходимости.
Несколько практичных правил:
- Не проверяйте остатки через прямой SQL, если можно использовать методы WooCommerce.
- Держите код в отдельном мини-плагине, чтобы не потерять его при обновлении темы.
- Тестируйте на товарах с разными типами учета: обычный остаток, предзаказ, отсутствие учета.
- Если используете внешнюю синхронизацию склада, проверьте, как часто обновляется meta-данные вариаций.
Если вам нужно не только отключать вариации, но и чистить сопутствующие данные каталога, имеет смысл разделить задачи: логика склада — в коде, SEO и дубли — отдельными инструментами. Для этого иногда используют Clearfy Pro, но только там, где его функции реально закрывают конкретную проблему, а не ради «универсального решения».
Когда лучше не писать код
Если у вас магазин без разработчика на поддержке и нужно быстро закрыть задачу без кастомизации, проще взять готовый плагин управления каталогом. Но как только появляются условия вроде «скрывать только в одной категории», «оставлять для опта» или «не скрывать при предзаказе», код становится надёжнее и предсказуемее.
Главный критерий простой: если правило можно описать одной-двумя проверками по данным вариации, его лучше реализовать через фильтр. Если правил много и они меняются каждый месяц, тогда уже стоит смотреть в сторону отдельного плагина или более сложной бизнес-логики.