Диагностика проблемы: почему товары без остатка показываются в каталоге
По умолчанию WooCommerce отображает в каталоге все товары, включая те, у которых количество на складе равно нулю или меньше. Это может привести к ухудшению пользовательского опыта, так как покупатели видят товары, которые нельзя заказать. Кроме того, подобные товары негативно влияют на конверсию и создают лишнюю нагрузку на сайт.
Чтобы убедиться, что проблема именно в отображении товаров без остатков, проверьте настройки WooCommerce в разделе WooCommerce > Настройки > Товары > Запасы. Там есть опция Скрывать товары без остатков из каталога. Если она неактивна или не работает корректно, потребуется программное решение.
Пошаговое решение: исключаем из каталога товары без остатков через код
1. Добавление фильтра для изменения основного запроса 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() && (is_shop() || is_product_category() || is_product_tag()) ) {
$meta_query = $query->get('meta_query');
if ( ! $meta_query) {
$meta_query = [];
}
$meta_query[] = [
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '!='
];
$query->set('meta_query', $meta_query);
}
}Этот фильтр изменяет WP_Query, который формирует каталог продуктов WooCommerce, добавляя условие, исключающее товары с мета-ключом _stock_status равным outofstock.
2. Проверка и очистка кэша
Если на сайте используется кэширование (плагины типа WP Super Cache, LiteSpeed Cache, Redis и т.п.), очистите кэш, чтобы изменения вступили в силу.
Проверка результата после внедрения
- Перейдите на страницу магазина и в категории товаров.
- Убедитесь, что товары с запасом 0 или отрицательным количеством НЕ отображаются.
- Проверьте, что товары с остатком отображаются корректно.
- Чтобы проверить, можно временно изменить количество у товара через админку и обновить страницу каталога.
Частые ошибки и как их исправить
- Ошибка: Товары без остатка всё равно видны.
Причина: Кэш страницы не очищен или фильтр не сработал из-за специфики темы.
Решение: Очистить кэш, проверить, что код добавлен именно в активную тему, и что нет конфликтов с другими плагинами. - Ошибка: Фильтр влияет на админку или другие запросы.
Причина: Отсутствие проверки контекста! is_admin() && $query->is_main_query().
Решение: Добавить эту проверку в код, чтобы фильтр применялся только к фронтенду и основному запросу. - Ошибка: Не исключаются товары с вариациями без остатка.
Причина: Для вариативных товаров нужно учитывать остатки вариаций.
Решение: Для сложных случаев используйте плагины или расширенный код с учетом вариаций.
Практические советы по оптимизации и безопасности
- Используйте дочернюю тему или собственный плагин для добавления кода, чтобы избежать потери изменений при обновлении.
- Проверяйте совместимость с используемой темой и WooCommerce, так как некоторые темы могут переопределять логику вывода товаров.
- При большом каталоге товаров убедитесь, что мета-запросы оптимизированы, чтобы не замедлять загрузку страниц.
- Используйте стандартные хуки WooCommerce и WordPress, чтобы минимизировать конфликты.
Сравнение способов исключения товаров без остатка
| Метод | Преимущества | Недостатки |
|---|---|---|
| Включение опции WooCommerce «Скрывать товары без остатков» | Простая настройка без кода | Не всегда работает корректно, зависит от темы |
Код с фильтром pre_get_posts | Гибко, контролируемо, работает на всех стандартных темах | Требует навыков разработки, может конфликтовать с кастомными темами |
| Использование плагинов (например, Clearfy Pro) | Дополнительные функции, удобный интерфейс | Платные решения, возможна избыточность |