Диагностика проблемы: зачем исключать товары без остатка из каталога
В стандартной настройке 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() && (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' => 'outofstock',
'compare' => '!='
];
$query->set('meta_query', $meta_query);
}
}Этот код исключает из выборки товары со статусом outofstock, то есть без запаса.
2. Проверка работы фильтра
- Очистите кэш сайта и браузера.
- Перейдите на страницу магазина и категории товаров.
- Убедитесь, что товары с нулевым запасом не отображаются.
- Проверьте, что товары с запасом отображаются корректно.
Как дополнительно скрыть товары без запаса из поиска WordPress
Для включения фильтра и в поисковой выдаче добавьте в код условие is_search():
if (!is_admin() && $query->is_main_query() && (is_shop() || is_product_category() || is_product_tag() || is_search())) {
// фильтр как выше
}Частые ошибки и как их исправить
- Фильтр не работает на страницах магазина
Проверьте, что условие$query->is_main_query()не конфликтует с плагинами кэширования или оптимизации. Попробуйте временно отключить кэш и проверить снова. - Некорректно скрываются вариации товаров
Для вариативных товаров статус запаса хранится в родительском товаре. Убедитесь, что индексы и мета-поля правильно настроены. При необходимости доработайте запрос для учета вариаций. - Товары остаются в выдаче, хотя запас есть
Проверьте, что у товара корректно обновлен мета-поле_stock_status. Можно вручную проверить через phpMyAdmin или WP CLI.
Практические советы по оптимизации и безопасности
- Добавляйте код в дочернюю тему или кастомный плагин, чтобы избежать потери изменений при обновлении.
- Перед внесением изменений сделайте резервную копию сайта и базы данных.
- Если у магазина большой каталог, учитывайте нагрузку на запросы с meta_query. При необходимости используйте индексацию базы данных.
- Тестируйте изменения на тестовом стенде, а не на живом сайте.
Сравнение способов скрытия товаров без запаса
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Настройка WooCommerce | Включить опцию "Скрывать отсутствующие товары" в настройках WooCommerce | Простой способ без кода | Не всегда учитывает сложные сценарии с вариациями |
| Код на hooks (приведённый выше) | Исключение товаров через фильтр pre_get_posts | Гибко, можно тонко настроить выборку | Нужны навыки программирования, возможность конфликтов с другими плагинами |
| Плагины для управления запасами | Специализированные решения типа "WooCommerce Hide Out of Stock Products" | Дополнительные функции, удобство | Может влиять на производительность, требует обновлений |
Дополнительный пример: автоматическое обновление статуса запаса через WP CLI
Для больших магазинов полезно периодически синхронизировать статус запасов. Пример команды для WP CLI:
wp wc product update 123 --stock_status=instockГде 123 - ID товара, а --stock_status принимает значения instock, outofstock и т.д.
Это помогает избежать ошибки с отображением товаров, если данные о запасах меняются вне WooCommerce.