Диагностика проблемы: почему товары без наличия остаются в каталоге
По умолчанию WooCommerce продолжает отображать товары даже при нулевом или отрицательном запасе, если не настроено явное скрытие. Это приводит к неудобствам для пользователей и снижает конверсию. Нужно быстро и надежно исключать из видимости товары с отсутствующим на складе запасом.
Пошаговое решение: автоматическое исключение товаров с нулевым запасом из каталога WooCommerce
1. Включение управления запасами
Убедитесь, что в WooCommerce включено управление запасами. Это необходимо для отслеживания остатков товаров.
WooCommerce > Настройки > Товары > Запасы > Управлять запасами: Включено2. Добавление фильтра для исключения товаров без остатков из каталога
Добавьте следующий код в файл 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 (!is_array($meta_query)) {
$meta_query = [];
}
$meta_query[] = [
'key' => '_stock_status',
'value' => 'instock',
'compare' => '=',
];
$query->set('meta_query', $meta_query);
}
}Этот код добавляет фильтрацию товаров по мета-полю _stock_status, оставляя только товары со статусом instock.
3. Настройка отображения отсутствующих товаров на страницах поиска и виджетах
Для исключения товаров с нулевым остатком из любых списков и виджетов дополнительно проверьте, что в них используется основной запрос WordPress. Если используются нестандартные WP_Query, примените аналогичные фильтры.
Проверка результата после внедрения
- Добавьте в каталог тестовый товар с нулевым запасом.
- Обновите страницу магазина и категорий — товар должен исчезнуть из списка.
- Проверьте поиск по сайту — отсутствующий товар не должен появляться.
- В административной панели в списке товаров товар с нулевым запасом должен отображаться, но на фронте — нет.
Частые ошибки и как их исправить
- Код не работает, товары с нулевым запасом видны — возможно, кэширование страницы. Очистите кэш плагинов и браузера.
- Фильтр влияет на административную панель — убедитесь, что условие
!is_admin()стоит и работает корректно. - Пользовательский WP_Query не учитывает фильтр — добавьте фильтр вручную в параметры запроса.
- Проблемы с совместимостью с плагинами кеширования — исключите страницы каталога из кеша или настройте кеширование с учетом динамических условий.
Практические советы по производительности и безопасности
- Используйте
meta_queryаккуратно: большое количество условий снижает скорость запросов к базе. - Для крупных магазинов рассмотрите использование плагинов кеширования с поддержкой WooCommerce, например, WP Rocket с отключением кеша для корзины и страниц аккаунта.
- Обновляйте WooCommerce и темы, чтобы избежать проблем с API и мета-данными.
- Для более сложных сценариев фильтрации товаров по запасу используйте кастомные индексы в базе данных.
Сравнение способов реализации исключения товаров по наличию
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Добавление фильтра в pre_get_posts | Простой и легкий в реализации, не требует плагинов | Может не работать с кастомными запросами, требует проверки кэширования | Небольшие и средние магазины без сложных запросов |
| Использование плагинов для управления запасом | Готовые решения с настройками и поддержкой | Дополнительная нагрузка на сайт, возможные конфликты | Для крупных магазинов с расширенными требованиями |
| Кастомные запросы через WP_Query с параметрами | Гибкий контроль, можно фильтровать везде | Требует разработки и поддержки | Проекты с нестандартным отображением товаров |