Проблема: почему нужно исключать товары с минимальным остатком
В интернет-магазинах на WooCommerce часто возникает ситуация, когда товар имеет очень маленький остаток (например, 1 или 0) и его нецелесообразно отображать в каталоге для покупателей. Это помогает избежать разочарований и уменьшить количество обращений в службу поддержки. Мы разберём, как автоматически исключать такие товары из каталога без удаления или деактивации.
Диагностика: как понять, что товар с минимальным остатком отображается
- Проверьте продукты с остатком 0 или 1 в WooCommerce > Товары.
- Перейдите на страницу каталога сайта в режиме гостя или инкогнито.
- Найдите и отметьте товары с небольшим остатком, которые видны для покупателей.
- Убедитесь, что в настройках WooCommerce > Товары > Запасы не включена опция автоматического скрытия товаров с нулевым остатком.
Пошаговое решение: исключение товаров с остатком меньше заданного порога
Реализуем решение через functions.php текущей темы или в отдельном плагине, добавив фильтр, который исключит из запроса товары с запасом меньше или равным заданному числу.
Код для исключения товаров с остатком меньше или равным 1:
add_action('pre_get_posts', 'exclude_low_stock_products_from_catalog');
function exclude_low_stock_products_from_catalog($query) {
if (is_admin() || !$query->is_main_query()) {
return;
}
// Применяем только к каталогу магазинов WooCommerce
if (is_shop() || is_product_taxonomy()) {
// Минимальный остаток для исключения
$min_stock = 1;
// Добавляем мета-запрос, чтобы исключить товары с низким остатком
$meta_query = $query->get('meta_query');
if (!is_array($meta_query)) {
$meta_query = [];
}
$meta_query[] = [
'key' => '_stock',
'value' => $min_stock,
'compare' => '>',
'type' => 'NUMERIC'
];
$query->set('meta_query', $meta_query);
}
}Объяснение:
- Функция подключается к хук
pre_get_posts— изменяет основной запрос WooCommerce. - Проверяется, что это фронтенд и основной запрос.
- Фильтруется запрос каталога и страниц таксономий товаров.
- Добавляется мета-запрос, который выбирает только товары с запасом больше 1.
Отдельно для вариаций
Если у вас вариации товаров, они хранятся как отдельные посты типа product_variation. По умолчанию WooCommerce показывает главные товары, но если по вариациям есть фильтры, стоит проверить отдельно. Для более точной фильтрации можно добавить условие по типу поста.
Проверка результата
- Очистите кеш сайта (если используете кэширование).
- Обновите страницу каталога и убедитесь, что товары с остатком 0 и 1 больше не отображаются.
- Проверьте, что товары с остатком, например, 2 и выше, остались в каталоге.
- Для проверки можете временно изменить
$min_stockна 5 и посмотреть, что изменится.
Частые ошибки и как их исправить
- Код не работает на страницах с AJAX-фильтрацией: если вы используете AJAX для фильтрации товаров, убедитесь, что скрипты подхватывают текущие настройки запроса. Иногда нужно добавлять фильтр в AJAX-запросы отдельно.
- Проверка остатка работает некорректно для вариаций: если у вас сложные вариации, учитывайте, что у вариаций свой мета-ключ
_stock. В таком случае возможно потребуется более сложный запрос с JOIN по вариациям. - Плагин кэширования мешает обновлению каталога: очистите кэш или временно отключите плагин кэширования.
Практические советы по безопасности и производительности
- Фильтрация через
pre_get_posts— наиболее оптимальный способ, так как меняет SQL-запрос без дополнительных запросов после загрузки. - Не используйте
WP_Queryвнутри фильтра для переработки запроса — это снизит производительность. - Если у вас большой каталог, рассмотрите добавление индексов для мета-ключа
_stockв базе данных для ускорения выборки. - Используйте средства мониторинга производительности (Query Monitor, Debug Bar) чтобы контролировать влияние фильтра на скорость загрузки.
Альтернативы: сравнение вариантов реализации
| Метод | Преимущества | Недостатки | Рекомендации |
|---|---|---|---|
| Фильтр pre_get_posts | Оптимально, интегрируется в запрос | Требует знаний WP Query | Лучший выбор для большинства |
| Удаление товаров вручную | Просто реализовать | Трудозатратно, не автоматизировано | Подходит для малого каталога |
| Плагин для скрытия товаров | Простота настройки | Зависимость от плагина, возможные конфликты | Использовать при отсутствии навыков кода |