Проблема: почему нужно автоматически отключать неактивные варианты товаров
В 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;
}Этот код отключит варианты с нулевым или отрицательным запасом, если управление запасом включено и бэко́рдеры запрещены.
Дополнительно: отключение вариаций в админке
Если нужно, чтобы неактивные варианты не отображались и в админке, можно добавить проверку при загрузке страницы редактирования товара, однако это сложнее и чаще не требуется.
Проверка результата
- Добавьте код в functions.php или плагин.
- Очистите кеш сайта (если используется кеширование).
- Перейдите на страницу вариативного товара, где есть варианты с запасом 0 и без.
- Убедитесь, что варианты с нулевым запасом не отображаются в селекторе вариаций.
- Проверьте, что варианты с запасом больше 0 или разрешённым бэко́рдером отображаются.
Частые ошибки и как их исправлять
- Вариации не скрываются: Проверьте, что управление запасом включено на уровне вариации. Если выключено, фильтр не сработает.
- Вариации отображаются, хотя запас 0: Возможно, включены бэко́рдеры. Логика фильтра их пропускает.
- Фильтр не применяется: Убедитесь, что код добавлен в активную тему или плагин и нет конфликтов с другими плагинами, изменяющими вывод вариаций.
- Появились ошибки PHP: Проверьте правильность синтаксиса, используйте отладчик или WP_DEBUG.
Практические советы по безопасности и производительности
- Код не вызывает дополнительных запросов к базе, использует уже загруженные объекты вариаций.
- Внедряйте код через дочернюю тему или отдельный плагин, чтобы не потерять изменения при обновлении.
- Тестируйте изменения на staging-среде, чтобы избежать сбоев на рабочем сайте.
- Не отключайте варианты через JavaScript или CSS — это не безопасно и может запутать покупателей.
Сравнение способов отключения неактивных вариаций
| Метод | Плюсы | Минусы |
|---|---|---|
Фильтр woocommerce_variation_is_active | Нативное отключение, не требует плагинов, быстрое | Работает только на фронтенде, не меняет статус вариаций в базе |
| Ручное отключение в админке | Полный контроль, можно настраивать вручную | Трудозатратно при большом количестве вариаций |
| Плагины для управления запасами | Удобный интерфейс, дополнительные возможности | Нагрузка на сайт, возможны конфликты |