Что значит «неактивный» вариант товара в WooCommerce?
В WooCommerce вариант товара (variation) может быть неактивен, если у него нулевой остаток на складе, отсутствует цена или он снят с публикации. Часто бывает нужно автоматически отключать такие варианты, чтобы покупатели не могли их выбрать и оформить заказ.
Диагностика проблемы: как понять, что у вас есть неактивные варианты?
Если на странице товара видны варианты без цены, с нулевым запасом или с другими проблемами, значит, они не отключены корректно. Проверьте это так:
- В админке WooCommerce перейдите в Товары → Вариации и проверьте статусы и наличие цены у каждой вариации.
- Проверьте фронтенд: доступны ли покупателям варианты с нулевым запасом или без цены.
- Включите режим отладки WordPress (
define('WP_DEBUG', true);) и проверьте, нет ли ошибок, связанных с вариациями.
Пошаговое решение: как автоматически отключать неактивные варианты
Самый надежный способ — использовать хук woocommerce_variation_is_active, который управляет доступностью варианта на витрине.
Добавьте следующий код в functions.php вашей дочерней темы или в кастомный плагин:
add_filter('woocommerce_variation_is_active', 'disable_inactive_variations', 10, 2);
function disable_inactive_variations($active, $variation) {
// Получаем ID вариации
$variation_id = $variation->get_id();
// Проверяем цену вариации
$price = $variation->get_price();
if (empty($price) || $price === '') {
return false; // Отключить вариант без цены
}
// Проверяем наличие на складе
if ($variation->managing_stock() && $variation->get_stock_quantity() <= 0) {
return false; // Отключить вариант с нулевым запасом
}
// Проверяем статус публикации вариации
if ($variation->get_status() !== 'publish') {
return false; // Отключить непубликованные варианты
}
return $active;
}Этот фильтр отключит варианты, если у них нет цены, если они не опубликованы или если на складе 0 и ведется складской учет.
Дополнительная фильтрация по кастомным метаполям
Если у вас есть собственные признаки неактивности, например, пользовательское поле _disable_variation, добавьте проверку:
$disable_flag = get_post_meta($variation_id, '_disable_variation', true);
if ($disable_flag === 'yes') {
return false;
}Проверка результата после внедрения
- Очистите кэш сайта и браузера.
- Перейдите на страницу товара с вариациями, которые должны быть отключены.
- Проверьте, что они не отображаются в списке доступных вариантов.
- Если вариант неактивен, он должен быть серым или отсутствовать в селекторе.
- Попробуйте оформить заказ с отключенным вариантом — он должен быть недоступен.
Частые ошибки и как их исправить
- Варианты не отключаются: убедитесь, что код добавлен именно в рабочий файл (functions.php дочерней темы или плагин), и что нет конфликтов с другими плагинами, которые могут переопределять фильтр.
- Варианты видны, но нельзя добавить в корзину: лучше отключать варианты на уровне отображения, а не только на добавление в корзину. Фильтр
woocommerce_variation_is_activeименно для этого. - Проблемы с кэшированием: если используете кэш-плагины или CDN, очистите кэш после внесения изменений.
- Ошибки PHP: проверьте логи сервера, чтобы исключить синтаксические ошибки в коде.
Практические советы по производительности и безопасности
- Не добавляйте тяжелые запросы или циклы в фильтр
woocommerce_variation_is_active, он вызывается часто. - Используйте внутренние методы WooCommerce для получения данных вариаций (
$variation->get_price(),$variation->get_stock_quantity()), чтобы избежать прямых SQL-запросов. - При большом каталоге товаров рассмотрите внедрение кэширования для метаданных вариаций.
Сравнение решений для отключения неактивных вариантов
| Метод | Плюсы | Минусы |
|---|---|---|
Фильтр woocommerce_variation_is_active | Простота, надежность, не требует плагинов | Требует базовых знаний PHP, нужно тестировать на конфликты |
| Плагины управления вариациями | Готовые решения с настройками | Могут замедлить сайт, не всегда гибкие |
| Прямая модификация шаблонов | Полный контроль отображения | Сложно поддерживать, риск ошибок |