Сценарий знакомый: в каталоге 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 | Полный контроль над версткой | Сложнее обновлять, выше риск конфликта | Если нужен нестандартный дизайн карточки |
| Плагин для кастомизации каталога | Без кода, быстрее для редактора | Лишняя зависимость, иногда тяжелее по производительности | Если нет доступа к коду или нужен быстрый тест |
Если задача точечная, хук обычно выигрывает. Плагин имеет смысл только когда нужно менять каталог без участия разработчика и есть понятный контроль над качеством расширения.
Пошаговая настройка без ошибок
- Создайте резервную копию файла
functions.phpили подключите собственный мини-плагин. - Добавьте код вывода остатка или статуса наличия.
- Проверьте, что код выполняется только на страницах категорий товаров через
is_product_taxonomy(). - Откройте категорию с простым товаром, у которого включен учет остатков.
- Проверьте товар без остатка и вариативный товар.
- Если нужно, добавьте 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 и есть риск сломать карточку товара в списке.
Если вам нужен не только вывод остатка, но и более гибкая логика для каталога, иногда проще вынести часть задач в отдельный плагин для админских настроек. Но для точечного сценария с остатками код через хук остается самым предсказуемым вариантом.