Диагностика проблемы: почему товары без остатка отображаются в каталоге
По умолчанию WooCommerce отображает в каталоге все товары, даже если их количество на складе равно нулю или товар отсутствует. Это приводит к негативному UX — посетители видят товары, которые невозможно купить. В некоторых случаях это снижает конверсию и создает лишнюю нагрузку на сервер.
Чтобы проверить, попадают ли товары без остатка в каталог, зайдите в админку WooCommerce → Товары и откройте страницу магазина как пользователь. Если товары с нулевым количеством видны, значит, задача актуальна.
Как автоматически скрывать товары без остатка из каталога WooCommerce
Вариант 1: Настройка через параметры WooCommerce
WooCommerce умеет скрывать товары без наличия на складе, но эта опция может быть отключена. Чтобы проверить и включить её:
- Перейдите в WooCommerce → Настройки → Товары → Запасы;
- Найдите опцию
Скрывать товары без остатка из каталогаи поставьте галочку; - Сохраните изменения и очистите кэш, если он есть.
Этот способ самый простой, но подходит только если вы используете стандартное управление запасами WooCommerce.
Вариант 2: Автоматическое исключение товаров без остатка через код
Если по каким-то причинам стандартная опция не работает или вам нужно более тонкое управление, можно добавить фильтр, который исключит товары с нулевым количеством из каталога.
add_action('pre_get_posts', function($query) {
if (is_admin() || !$query->is_main_query()) {
return;
}
if (is_shop() || is_product_category() || is_product_tag()) {
$meta_query = $query->get('meta_query') ?: [];
$meta_query[] = [
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '!='
];
$query->set('meta_query', $meta_query);
}
});Этот код добавляет условие к основному запросу каталога, исключая товары со статусом outofstock. Разместите его в файле functions.php вашей дочерней темы или в собственном плагине.
Проверка результата после внедрения решения
Чтобы убедиться, что товары без остатка не отображаются:
- Перейдите на страницу магазина и категорий;
- Убедитесь, что товары со статусом «Нет в наличии» отсутствуют в списках;
- В админке измените количество товара на 0 и обновите страницу магазина;
- Если товар исчез, решение работает корректно.
Частые ошибки и как их исправить
- Опция скрытия товаров без остатка не включена в настройках WooCommerce. Решение: проверьте и активируйте ее.
- Кэширование страницы мешает обновлению каталога. Решение: очистите кэш браузера, кэш плагина или серверный кэш.
- Код добавлен в файл, который не подключается. Решение: убедитесь, что код находится в
functions.phpактивной темы или в загружаемом плагине. - Конфликт с другими плагинами, которые управляют каталогом. Решение: временно отключите плагины, чтобы проверить конфликт, и адаптируйте код.
Практические советы по безопасности и производительности
- Избегайте дублирования фильтров
pre_get_posts— они должны быть максимально узкими, чтобы не влиять на административные запросы. - Если у вас большой каталог — используйте индексацию мета-полей для ускорения запросов.
- Не храните чувствительные данные в мета-полях, используемых для фильтрации, без шифрования.
- Регулярно тестируйте работу каталога после обновлений WooCommerce и тем.
Сравнение вариантов решения
| Метод | Плюсы | Минусы | Сложность |
|---|---|---|---|
| Встроенная опция WooCommerce | Простота настройки, не требует кода | Работает только с базовым управлением запасами | Низкая |
| Фильтр pre_get_posts | Гибкость, работает с кастомными сценариями | Требует навыков программирования, возможны конфликты | Средняя |
| Использование сторонних плагинов | Дополнительные функции, поддержка | Нагрузка на сайт, возможные конфликты | Средняя |