Диагностика проблемы: почему товары без остатка остаются в каталоге
В стандартной установке WooCommerce товары с нулевым остатком продолжают отображаться в каталоге, если не включена опция скрытия таких товаров. Это приводит к снижению удобства для пользователей, которые видят недоступные товары и могут попытаться их заказать. В панели WooCommerce есть настройка «Скрывать товары без наличия», но она работает не всегда корректно, особенно если используются сторонние темы или кастомные шаблоны.
Проверка текущих настроек WooCommerce
- Перейдите в WooCommerce → Настройки → Товары → Запасы.
- Убедитесь, что включена опция
Отключить показ товаров без наличия. - Если опция включена, но товары без остатков все равно показываются, значит тема или плагины переопределяют логику.
Пошаговое решение: программное исключение товаров без остатка из каталога
Чтобы гарантированно скрывать товары без остатков из каталога и поиска, добавим фильтр на уровень запроса WooCommerce. Это решит проблему даже при кастомных темах и плагинах.
Шаг 1. Добавьте следующий код в файл 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() || is_search()) && !current_user_can('manage_woocommerce')) {
$meta_query = $query->get('meta_query') ?: array();
$meta_query[] = array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '!='
);
$query->set('meta_query', $meta_query);
}
}Объяснение:
- Функция срабатывает только для главного пользовательского запроса на страницах магазина, категорий, тегов и поиска.
- Исключаем товары с мета-ключом
_stock_statusравнымoutofstock. - Администраторам товары без остатка по-прежнему видны для управления.
Шаг 2. Очистите кэш сайта и браузера
Если используете плагин кэширования (например, WP Rocket, W3 Total Cache), очистите весь кэш, чтобы изменения отобразились корректно.
Проверка результата после внедрения
- Зайдите на страницу магазина или категорий и убедитесь, что товары с нулевым остатком отсутствуют.
- Попробуйте перейти на страницу товара с нулевым остатком напрямую — он должен отображаться (для SEO и ссылок) или можно дополнительно скрыть и страницу товара, если нужно.
- Авторизуйтесь как администратор и проверьте, что товары без остатков отображаются в панели управления.
Частые ошибки при реализации и их исправление
- Код не работает, товары без остатков все еще в каталоге. Проверьте, что фильтр добавлен правильно и не конфликтует с другими плагинами. Попробуйте временно отключить сторонние плагины, которые могут менять запросы WooCommerce.
- В каталоге пропали все товары. Возможно, в запрос добавлен неправильный мета-запрос. Убедитесь, что
meta_queryформируется корректно и не перезаписывает существующие условия. - Фильтр срабатывает в админке. Обязательно проверяйте
is_admin()чтобы не влиять на административные запросы.
Практические советы по производительности и безопасности
- Добавляйте фильтры запросов только для главного запроса, чтобы избежать лишней нагрузки.
- Избегайте повторного добавления мета-запросов — если ваша тема или плагины уже фильтруют по наличию, может быть конфликт.
- Регулярно обновляйте WooCommerce и темы — иногда встроенные функции скрытия товаров без остатков улучшаются.
- Если у вас большой каталог, рассмотрите индексацию мета-полей для ускорения запросов.
Сравнение подходов для скрытия товаров без остатков
| Метод | Плюсы | Минусы | Пример кода или плагин |
|---|---|---|---|
| Включение опции WooCommerce | Простота, нет кода | Не всегда работает с кастомными темами | WooCommerce → Настройки → Запасы |
Кодовый фильтр pre_get_posts |
Гибкость, работает с любой темой | Требует базовых знаний PHP, возможны конфликты | Пример из статьи выше |
| Плагины (например, "WooCommerce Hide Out of Stock") | Удобство, дополнительные функции | Дополнительная нагрузка, платные функции | Плагин WooCommerce Hide Out of Stock |