WooCommerce: как автоматически исключать товары с минимальным остатком из каталога

Проблема: почему нужно исключать товары с минимальным остатком

В интернет-магазинах на 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Лучший выбор для большинства
Удаление товаров вручнуюПросто реализоватьТрудозатратно, не автоматизированоПодходит для малого каталога
Плагин для скрытия товаровПростота настройкиЗависимость от плагина, возможные конфликтыИспользовать при отсутствии навыков кода
Как правильно настроить переадресацию после смены домена в WordPress
24.04.2026
Запрет доступа к WooCommerce REST API для неавторизованных пользователей
11.01.2026
Как автоматически удалять старые неиспользуемые изображения в WordPress
07.07.2026
Как создать выбор по дате в админке WordPress с примерами кода
21.02.2026
WooCommerce: как автоматически исключать товары с минимальным остатком из каталога
14.07.2026