В WooCommerce остаток товара часто нужен не только покупателю, но и менеджеру: чтобы сразу видеть, что товар заканчивается, не лезть в админку и не держать в голове ручной учет. На практике задача обычно сводится к двум сценариям: показать количество на странице товара и аккуратно вывести статус в каталоге или карточке в списке.
Проблема в том, что стандартное отображение остатка включено не всегда, а для вариативных товаров и товаров с включенным управлением запасами поведение отличается. Если просто вставить готовый код без проверки настроек, легко получить пустую строку, дублирование текста или некорректный вывод для вариаций.
Когда стандартного вывода недостаточно
WooCommerce умеет показывать наличие товара, но не всегда показывает именно число единиц. Кроме того, в некоторых темах блок наличия стилизован так, что его почти не видно, а в каталоге он может вообще отсутствовать. Если нужен понятный и контролируемый вывод, лучше добавить его через хуки и явно задать, где именно он должен появляться.
Типичные симптомы
- на странице товара видно только «В наличии», но не количество;
- для вариативного товара остаток не показывается у выбранной вариации;
- в каталоге остаток не нужен для всех товаров, а только для товаров с малым запасом;
- тема переопределяет стандартный шаблон и скрывает блок stock.
Диагностика перед правкой кода
Прежде чем писать фильтры, проверьте настройки самого товара и магазина. Это экономит время: если у товара не включено управление запасами, WooCommerce не сможет показать число, потому что его просто нет в метаданных.
- Откройте товар в админке WooCommerce.
- Перейдите во вкладку «Запасы».
- Проверьте, включено ли
Управление запасами?. - Убедитесь, что заполнено поле
Количество на складе. - Если товар вариативный, проверьте эти же настройки у каждой вариации.
Если количество есть, но на фронтенде его не видно, посмотрите, не отключен ли стандартный вывод в теме или через плагин оптимизации. Иногда блок есть в HTML, но скрыт CSS-правилом вроде .stock { display:none; }.
Как вывести остаток товара через код
Самый надежный вариант — добавить вывод через хук woocommerce_single_product_summary на странице товара и отдельно обработать каталог, если это действительно нужно. Ниже пример, который показывает количество только для товаров, у которых включено управление запасами.
<?php
add_action( 'woocommerce_single_product_summary', 'wptem_show_stock_quantity', 25 );
function wptem_show_stock_quantity() {
global $product;
if ( ! $product instanceof WC_Product ) {
return;
}
if ( ! $product->managing_stock() ) {
return;
}
$qty = $product->get_stock_quantity();
if ( $qty === null ) {
return;
}
echo '<p class="product-stock-qty">Остаток на складе: <strong>' . esc_html( $qty ) . '</strong></p>';
}
Этот вариант не ломает стандартную логику WooCommerce: если товар не ведется по складу, блок просто не выводится. Для магазина это обычно безопаснее, чем пытаться показывать «0» везде подряд.
Если нужен вывод в каталоге
В списке товаров лучше не показывать точное количество для всех позиций. Чаще достаточно подсветить только товары с малым остатком. Для этого можно использовать фильтр woocommerce_get_availability_text или отдельный хук в карточке товара в архиве.
<?php
add_action( 'woocommerce_after_shop_loop_item_title', 'wptem_show_low_stock_badge', 11 );
function wptem_show_low_stock_badge() {
global $product;
if ( ! $product instanceof WC_Product ) {
return;
}
if ( ! $product->managing_stock() ) {
return;
}
$qty = $product->get_stock_quantity();
if ( $qty === null ) {
return;
}
if ( $qty <= 5 && $qty > 0 ) {
echo '<p class="stock low-stock">Осталось ' . esc_html( $qty ) . ' шт.</p>';
}
}
Здесь порог 5 — это не универсальное правило, а рабочий пример. В реальном проекте его лучше вынести в настройку темы или хотя бы в константу, чтобы не править код при каждом изменении политики магазина.
Что делать с вариативными товарами
У вариативных товаров остаток хранится на уровне вариации, а не родительского товара. Поэтому если вывести только данные родителя, вы получите пустой или вводящий в заблуждение результат. Для таких товаров важно проверять именно выбранную вариацию.
Если задача — показать остаток после выбора вариации, стандартный WooCommerce уже отправляет данные о наличии через AJAX-обновление. Но тема может не выводить этот блок. В таком случае можно использовать шаблонный хук, который срабатывает в области сведений о товаре, и не пытаться собирать остаток вручную через JavaScript.
Если же нужен кастомный текст вроде «На складе 2 штуки», а не стандартное «В наличии», можно отфильтровать текст доступности:
<?php
add_filter( 'woocommerce_get_availability_text', 'wptem_custom_availability_text', 10, 2 );
function wptem_custom_availability_text( $text, $product ) {
if ( ! $product instanceof WC_Product ) {
return $text;
}
if ( ! $product->managing_stock() ) {
return $text;
}
$qty = $product->get_stock_quantity();
if ( $qty === null ) {
return $text;
}
if ( $qty > 0 && $qty <= 5 ) {
return 'Осталось ' . $qty . ' шт.';
}
return $text;
}
Этот фильтр влияет и на страницу товара, и на некоторые элементы каталога. Поэтому перед публикацией обязательно проверьте, не стало ли слишком много одинаковых надписей в разных местах.
Плагин, код или правка шаблона: что выбрать
| Подход | Когда подходит | Минус |
|---|---|---|
| Код через хук | Нужен точечный и предсказуемый вывод | Нужно аккуратно тестировать на теме и вариациях |
| Плагин для кастомизации | Нет доступа к child theme или кода боятся | Может добавить лишнюю нагрузку и дублировать функциональность |
| Правка шаблона WooCommerce | Нужен полный контроль над версткой | Сложнее сопровождать после обновлений |
Если задача ограничена выводом остатка, код через хук обычно проще и безопаснее, чем переписывать шаблон. Для более сложной логики — например, когда нужно скрывать остаток для части категорий или ролей пользователей — уже имеет смысл смотреть в сторону дочерней темы или плагина для кастомных полей и условий.
Как проверить, что решение сработало
После внедрения не ограничивайтесь визуальной проверкой на одной карточке. Нужна короткая, но системная проверка.
- Откройте простой товар с включенным учетом запасов.
- Проверьте товар без учета запасов — блок не должен выводиться.
- Откройте вариативный товар и выберите несколько вариаций с разным остатком.
- Проверьте каталог: не дублируется ли текст под ценой и кнопкой.
- Очистите кэш страницы, если используется кэширование на уровне плагина или сервера.
Если используете кэш, не забывайте, что остаток товара может меняться часто. Для страниц товара это особенно важно: старый кэш способен показывать уже неактуальное количество. В таких случаях лучше исключить карточки товара из агрессивного кэширования или настроить более частую очистку кэша после изменения остатков.
Частые ошибки и как их исправить
Показывают остаток там, где он не нужен
Частая ошибка — выводить количество для всех товаров подряд. Для товаров без учета запасов это выглядит как пустой блок или «0». Исправление простое: сначала проверяйте $product->managing_stock(), а потом уже выводите значение.
Берут остаток у родительского товара вместо вариации
У вариативных товаров это приводит к неверным данным. Если товар продается по вариациям, ориентируйтесь на объект вариации, а не на родительский товар.
Не учитывают кэш
Если остаток обновили в админке, а на сайте он не изменился, проблема часто не в коде, а в кэше. Сначала проверьте страницу в режиме инкогнито и после очистки кэша. Если результат меняется только после очистки, значит, нужно править именно кэширование.
Пишут вывод прямо в шаблон без условий
Это удобно на старте, но плохо поддерживается. Через пару месяцев сложно понять, почему блок появился на всех товарах и кто его добавил. Хук или отдельная функция в functions.php дочерней темы читаются и отключаются проще.
Безопасность и производительность
Если вы выводите остаток через код, не вставляйте его в родительскую тему. После обновления изменения потеряются. Используйте дочернюю тему или небольшой кастомный плагин. Для вывода всегда экранируйте данные через esc_html(), даже если число кажется безопасным: это хорошая привычка и защита от случайных изменений формата.
Если на сайте много товаров и активный каталог, не добавляйте тяжелые запросы к базе в цикле архива. В примерах выше используется уже загруженный объект товара, без дополнительных запросов. Это важный момент: для каталога лишние SQL-запросы быстро превращаются в проблему производительности.
Если вам нужно не только показать остаток, но и убрать дубли, скрыть лишние элементы и почистить шаблоны WooCommerce, иногда удобнее сначала привести сайт в порядок через Clearfy Pro: плагин для чистки и оптимизации. Но сам вывод остатка все равно лучше держать в своем коде, чтобы не зависеть от лишней магии плагина.
Если после внедрения блок не появляется, проверьте три вещи в таком порядке: включен ли учет запасов у товара, не скрывает ли его тема, и не перекрывает ли вывод кэш. Обычно проблема находится именно в одном из этих мест, а не в самом хуке.