Как вывести остаток товара на странице категории WooCommerce без лишней нагрузки

Сценарий знакомый: в каталоге WooCommerce нужно показать остаток товара прямо в карточке категории, чтобы покупатель видел, что размер или модель еще есть в наличии. На витрине это полезно, но если сделать вывод неаккуратно, можно получить лишние запросы, мусор в шаблоне или некорректные данные для вариативных товаров.

Ниже разберем рабочий вариант через хук WooCommerce, без правки шаблонов плагина и без тяжелых обходных решений. Подход подходит для простого каталога и для магазинов, где остаток нужен только в листинге категорий.

Когда это действительно нужно

Вывод остатка в категории полезен, если:

  • у товара часто меняется количество на складе и это влияет на решение о покупке;
  • нужно показать дефицитные позиции без перехода в карточку товара;
  • менеджеры хотят быстрее отлавливать товары с нулевым остатком в каталоге;
  • в магазине есть вариативные товары, но покупателю достаточно видеть общий статус наличия.

Если у вас большой каталог и остатки меняются часто, не стоит делать тяжелые SQL-запросы на каждый рендер страницы. В WooCommerce уже есть методы объекта товара, и их лучше использовать.

Диагностика проблемы перед внедрением

Сначала проверьте, что именно вы хотите вывести. Для простых товаров все обычно очевидно: есть число в stock_quantity. Для вариативных товаров ситуация сложнее: у родительского товара может не быть собственного остатка, а количество хранится у вариаций.

Что проверить в админке

  • включен ли учет остатков в WooCommerce → Настройки → Товары → Запасы;
  • заполнено ли поле остатка у конкретного товара;
  • не скрываются ли товары без остатка настройкой каталога;
  • не используется ли сторонний плагин, который переопределяет шаблон карточки товара.

Если остаток не отображается даже в самой карточке товара, сначала исправьте это. Вывод на странице категории не поможет, если данные не заполняются в товаре.

Рабочее решение через хук WooCommerce

Самый практичный вариант — добавить небольшую функцию в functions.php дочерней темы или в собственный мини-плагин. Для каталога удобен хук woocommerce_after_shop_loop_item_title: он срабатывает в карточке товара внутри списка и позволяет вывести дополнительную строку рядом с ценой или после нее.

add_action( 'woocommerce_after_shop_loop_item_title', 'wpkpi_show_stock_in_category_loop', 15 );

function wpkpi_show_stock_in_category_loop() {
    global $product;

    if ( ! $product instanceof WC_Product ) {
        return;
    }

    // Показываем только на страницах категорий и тегов товаров.
    if ( ! is_product_taxonomy() ) {
        return;
    }

    // Для товаров без учета остатков ничего не выводим.
    if ( ! $product->managing_stock() ) {
        return;
    }

    $qty = $product->get_stock_quantity();

    if ( null === $qty ) {
        return;
    }

    if ( $qty > 0 ) {
        echo '<div class="product-stock product-stock--in">В наличии: <strong>' . esc_html( $qty ) . '</strong></div>';
    } else {
        echo '<div class="product-stock product-stock--out">Нет в наличии</div>';
    }
}

Этот код не лезет в шаблоны WooCommerce и не меняет логику магазина. Он только добавляет строку в карточку товара на страницах таксономий товаров.

Почему здесь есть ограничения

Метод get_stock_quantity() корректно работает там, где WooCommerce действительно хранит число остатка. Но если товар вариативный, родительский товар может вернуть null. В этом случае лучше либо показывать только статус наличия, либо отдельно обрабатывать вариации.

Если товар вариативный: что показывать вместо числа

Для вариативных товаров в каталоге обычно безопаснее выводить не конкретное число, а статус: «В наличии», «Нет в наличии», «Под заказ». Иначе вы рискуете показать остаток родителя, которого на самом деле нет.

Ниже вариант, который выводит статус для простых и вариативных товаров, но не пытается угадать сумму по всем вариациям.

add_action( 'woocommerce_after_shop_loop_item_title', 'wpkpi_show_stock_status_loop', 16 );

function wpkpi_show_stock_status_loop() {
    global $product;

    if ( ! $product instanceof WC_Product ) {
        return;
    }

    if ( ! is_product_taxonomy() ) {
        return;
    }

    if ( $product->is_in_stock() ) {
        echo '<div class="product-stock product-stock--in">В наличии</div>';
    } else {
        echo '<div class="product-stock product-stock--out">Нет в наличии</div>';
    }
}

Такой вариант проще сопровождать и он меньше зависит от типа товара. Для каталога это часто лучше, чем пытаться вывести точное количество там, где оно не имеет смысла.

Сравнение подходов

ПодходПлюсыМинусыКогда выбирать
Хук в loop-карточкеБыстро, без правки шаблонов, легко отключитьНужно аккуратно фильтровать типы товаровПочти всегда для каталога
Правка шаблона WooCommerceПолный контроль над версткойСложнее обновлять, выше риск конфликтаЕсли нужен нестандартный дизайн карточки
Плагин для кастомизации каталогаБез кода, быстрее для редактораЛишняя зависимость, иногда тяжелее по производительностиЕсли нет доступа к коду или нужен быстрый тест

Если задача точечная, хук обычно выигрывает. Плагин имеет смысл только когда нужно менять каталог без участия разработчика и есть понятный контроль над качеством расширения.

Пошаговая настройка без ошибок

  1. Создайте резервную копию файла functions.php или подключите собственный мини-плагин.
  2. Добавьте код вывода остатка или статуса наличия.
  3. Проверьте, что код выполняется только на страницах категорий товаров через is_product_taxonomy().
  4. Откройте категорию с простым товаром, у которого включен учет остатков.
  5. Проверьте товар без остатка и вариативный товар.
  6. Если нужно, добавьте CSS для визуального разделения статуса.

Пример минимального CSS для аккуратного отображения:

.product-stock {
    margin-top: 6px;
    font-size: 14px;
    line-height: 1.4;
}

.product-stock--in {
    color: #1e7e34;
}

.product-stock--out {
    color: #b32d2e;
}

Как проверить, что решение сработало

Проверка должна быть не визуальной «на глаз», а по конкретным сценариям:

  • откройте страницу категории и убедитесь, что строка появляется только у товаров, где она нужна;
  • проверьте простой товар с остатком больше нуля — должно выводиться число или статус «В наличии»;
  • проверьте товар с нулевым остатком — должен быть корректный текст без PHP-ошибок;
  • проверьте вариативный товар — если число не выводится, это нормально для безопасного варианта;
  • посмотрите исходный HTML страницы и убедитесь, что блок не дублируется несколько раз.

Если у вас включен кэш страницы, очистите его после правки. Иначе можно решить, что код не работает, хотя на деле браузер или плагин кэширования показывает старую версию страницы.

Частые ошибки и как их исправить

1. Код вставили не туда

Если добавить функцию в файл темы, которая потом обновляется, код может исчезнуть. Для стабильности лучше использовать дочернюю тему или собственный мини-плагин.

2. Вывод идет на всех страницах сайта

Это обычно случается, если забыли проверку is_product_taxonomy(). Тогда блок может появиться в блоге, на главной или в других шаблонах, где глобальный $product ведет себя не так, как ожидается.

3. Пустой остаток у вариативных товаров

Для вариаций get_stock_quantity() на родителе часто не дает полезного значения. В таком случае используйте только is_in_stock() или выводите остаток внутри карточки товара, где можно выбрать конкретную вариацию.

4. Дублирование блока

Если тема или конструктор уже добавляет собственный вывод цены/наличия, ваш хук может сработать рядом с ним. Тогда нужно менять приоритет хука или убрать дублирующий вывод в теме.

5. Неправильная локализация текста

Если магазин мультиязычный, текст «В наличии» лучше оборачивать в функции перевода, а не оставлять жестко в коде. Иначе на второй языковой версии появится русский текст.

Практические советы по безопасности и производительности

Не делайте отдельный запрос к базе ради каждого товара в категории. У объекта WC_Product уже есть нужные методы, и их достаточно для стандартного сценария.

Если вы выводите остаток в публичном каталоге, подумайте, нужно ли показывать точное число. Для некоторых магазинов безопаснее ограничиться статусом наличия, чтобы не раскрывать складские данные конкурентам и не создавать лишние ожидания у покупателей.

Если на сайте используется кэширование страниц, обязательно проверьте поведение после обновления остатков. Иногда кэш нужно очищать не только вручную, но и через настройки плагина кэша или CDN.

Для магазинов, где каталог сильно кастомизирован, полезно сначала протестировать код на staging-копии. Это особенно важно, если тема уже переопределяет шаблоны WooCommerce и есть риск сломать карточку товара в списке.

Если вам нужен не только вывод остатка, но и более гибкая логика для каталога, иногда проще вынести часть задач в отдельный плагин для админских настроек. Но для точечного сценария с остатками код через хук остается самым предсказуемым вариантом.

Как создать динамическую таблицу в WordPress с AJAX и методами оптимизации
23.12.2025
WooCommerce: автоматическое удаление заказов по истечении срока
07.05.2026
Как избежать конфликтов между плагинами WordPress: практические решения
06.12.2025
Создание собственного шорткода в WordPress с плагином WPKPI
07.11.2025
Как избежать проблем с подключением стилей и скриптов в WordPress
27.01.2026