Проблема отсутствующих вариантов товаров в WooCommerce
В интернет-магазинах на WooCommerce часто возникает ситуация, когда у вариативного товара остаются варианты, которых нет в наличии. Покупатели видят эти варианты, но попытка их выбрать приводит к ошибкам или невозможности оформить заказ. Ручное отключение каждого варианта неудобно при большом ассортименте.
Диагностика проблемы
Чтобы убедиться, что именно варианты без наличия отображаются и создают неудобства, проверьте:
- В карточке товара отображаются варианты, которых нет в наличии;
- При попытке выбора такого варианта пользователь видит сообщение "нет в наличии" или "недоступно";
- В админке WooCommerce в списке вариаций у таких вариантов статус "нет в наличии" или "отключено" не установлен.
Добавьте в файл functions.php вашей темы этот код для вывода в админке статуса наличия вариантов:
add_filter('woocommerce_variation_is_active', 'check_variation_stock_status', 10, 2);
function check_variation_stock_status($active, $variation) {
$stock = $variation->get_stock_quantity();
$in_stock = $variation->is_in_stock();
error_log('Вариация ID ' . $variation->get_id() . ' - в наличии: ' . ($in_stock ? 'да' : 'нет') . ', кол-во: ' . $stock);
return $active;
}После этого проверьте логи, чтобы понять, какие варианты фактически отсутствуют.
Пошаговое решение: автоматическое отключение отсутствующих вариантов
Задача — чтобы WooCommerce автоматически снимал с продажи варианты товаров, которых нет в наличии, скрывая их из выбора на фронтенде.
Шаг 1. Добавьте функцию для фильтрации вариантов
Вставьте следующий код в 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->is_in_stock()) {
return false; // Отключаем вариант, если нет в наличии
}
return $active;
}Этот фильтр отключит варианты, если они отсутствуют на складе (stock quantity <= 0 или статус "нет в наличии").
Шаг 2. Очистка кэша и обновление атрибутов
После добавления кода очистите кэш сайта и браузера, чтобы изменения вступили в силу. Также рекомендуется пересохранить вариативные товары в админке, чтобы WooCommerce обновил внутренние данные.
Шаг 3. Тестирование на фронтенде
Откройте страницу вариативного товара и проверьте список вариантов. Варианты без наличия должны исчезнуть из выпадающих списков выбора.
Проверка результата
- Варианты с нулевым или отрицательным количеством отсутствуют в селекторах на странице товара;
- В админке вариации с нулевым stock остаются, но не активны для клиентов;
- Попытка доступа к URL варианта без наличия ведёт к перенаправлению на основной товар или 404.
Частые ошибки и их исправление
Ошибка 1: Варианты с нулевым запасом видны покупателям
Причина: в настройках WooCommerce отключена опция "Скрывать отсутствующие товары" или используется кэш, не обновлённый после изменения.
Решение: Проверьте в WooCommerce > Настройки > Товары > Запасы, чтобы включить скрытие отсутствующих товаров. Очистите кэш.
Ошибка 2: Фильтр не работает для некоторых вариантов
Причина: нестандартные способы управления запасами (например, сторонние плагины или кастомные поля).
Решение: Удостоверьтесь, что в $variation->is_in_stock() возвращается корректное значение. Возможно, потребуется доработать фильтр с учётом специфики плагинов.
Ошибка 3: Варианты отображаются, но недоступны для выбора
Это штатное поведение WooCommerce, если вариант отключён не полностью. Наш фильтр решает эту проблему.
Практические советы по производительности и безопасности
- Добавляйте фильтры и кастомный код в дочернюю тему или плагин, чтобы не потерять изменения при обновлении;
- Проверяйте совместимость с плагинами кэширования: иногда кэш может показывать устаревшие данные о вариантах;
- Регулярно обновляйте WooCommerce и PHP до последних стабильных версий для безопасности и производительности;
- Используйте логи и дебаг для выявления проблем с наличием товаров;
- Для крупных магазинов с тысячами товаров рассмотрите использование специализированных решений для управления запасами и загрузкой (например, ElasticPress).
Сравнение вариантов решения
| Метод | Плюсы | Минусы |
|---|---|---|
| Встроенная настройка WooCommerce "Скрывать отсутствующие товары" | Простота, не требует кода | Не всегда скрывает варианты, только товары |
Кастомный фильтр woocommerce_variation_is_active | Точный контроль, скрывает именно варианты | Требует правок в коде, возможны конфликты |
| Использование плагинов для управления запасами | Дополнительный функционал, удобство | Дополнительная нагрузка, зависимость от плагинов |