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