В WooCommerce часто нужно не просто показать или скрыть остатки глобально, а убрать блок наличия только у части товаров: у предзаказов, товаров под заказ, цифровых позиций с ручной отгрузкой или ассортимента, где остатки не должны быть видны покупателю. Глобальная настройка тут не помогает, а правка шаблонов темы быстро превращается в поддержку собственного форка.
Ниже разберём рабочий вариант без выдуманных хуков и без вмешательства в ядро: сначала поймём, где именно WooCommerce выводит наличие, потом отключим его точечно по условию и проверим результат на карточке товара и в каталоге.
Когда проблема проявляется и что именно нужно отключать
В стандартной установке WooCommerce наличие может показываться в нескольких местах: на странице товара, в карточке в каталоге, в блоках связанных товаров и иногда в шаблонах темы, если она дублирует вывод через собственные обёртки. Поэтому фраза «убрать наличие» на практике означает не один переключатель, а несколько точек вывода.
Если задача звучит так:
- скрыть остаток только у товаров определённой категории;
- не показывать текст
В наличииу товаров под заказ; - оставить управление складом включённым, но не светить число единиц;
- не сломать сортировку и фильтры по наличию;
то правильнее не отключать учёт склада целиком, а фильтровать текст наличия на выводе.
Диагностика: где WooCommerce берёт текст наличия
Перед правкой кода проверьте, не вмешивается ли в вывод тема или плагин. Это важно, потому что один и тот же результат может быть собран по-разному: через шаблон single-product/stock.php, через фильтр woocommerce_get_availability_text или через кастомный блок темы.
Что проверить в админке и шаблонах
- Откройте товар и посмотрите, включено ли Управление запасами.
- Проверьте, не стоит ли статус В наличии вручную.
- Посмотрите, не переопределяет ли тема шаблоны WooCommerce в папке
your-theme/woocommerce/. - Если используется конструктор или блоки, проверьте, не выводится ли наличие отдельным виджетом.
Если наличие видно и в карточке товара, и в каталоге, а в коде темы нет явного шаблона, почти наверняка проще всего решить задачу через фильтр.
Пошаговое решение: скрыть наличие для выбранных товаров
Самый надёжный способ — добавить условие в фильтр woocommerce_get_availability_text. Он позволяет менять текст наличия до вывода на странице товара. Для каталога этого часто достаточно, но если тема отдельно выводит метку наличия в карточке товара, может понадобиться ещё один фильтр, который убирает сам массив доступности.
Вариант 1: скрыть текст наличия по категории товара
Пример ниже убирает текст наличия у товаров из категории preorder. Логика простая: если товар в нужной категории, возвращаем пустую строку.
add_filter( 'woocommerce_get_availability_text', 'wpsource_hide_stock_text_for_preorder_products', 10, 2 );
function wpsource_hide_stock_text_for_preorder_products( $availability, $product ) {
if ( ! $product instanceof WC_Product ) {
return $availability;
}
if ( has_term( 'preorder', 'product_cat', $product->get_id() ) ) {
return '';
}
return $availability;
}Если у вас не категория, а отдельный список товаров, можно заменить условие на проверку ID или на кастомное поле товара.
Вариант 2: скрыть наличие по метаполю товара
Этот вариант удобен, когда у части ассортимента есть флаг вроде hide_stock_label. Тогда менеджер может включать или выключать скрытие без правки кода.
add_filter( 'woocommerce_get_availability_text', 'wpsource_hide_stock_text_by_meta', 10, 2 );
function wpsource_hide_stock_text_by_meta( $availability, $product ) {
if ( ! $product instanceof WC_Product ) {
return $availability;
}
$hide_stock = get_post_meta( $product->get_id(), 'hide_stock_label', true );
if ( $hide_stock === 'yes' ) {
return '';
}
return $availability;
}Такой подход безопаснее, чем хардкодить ID товаров в теме: список можно менять в админке или через импорт.
Вариант 3: убрать только число остатков, но оставить статус
Иногда нужно сохранить смысловую метку В наличии, но не показывать количество. Тогда не трогаем весь текст, а заменяем только числовую часть. Это полезно, если тема выводит фразу вроде В наличии: 12.
add_filter( 'woocommerce_get_availability_text', 'wpsource_hide_stock_quantity', 10, 2 );
function wpsource_hide_stock_quantity( $availability, $product ) {
if ( ! $product instanceof WC_Product ) {
return $availability;
}
if ( $product->managing_stock() ) {
return __( 'В наличии', 'woocommerce' );
}
return $availability;
}Этот вариант не скрывает сам факт наличия, а только убирает точное количество. Для многих магазинов это компромисс между UX и коммерческой логикой.
Если тема выводит наличие отдельно в каталоге
Некоторые темы и шаблоны WooCommerce показывают наличие не через стандартный фильтр текста, а через отдельный блок в карточке товара. В таком случае одного фильтра может быть мало. Тогда нужно проверить, не использует ли тема шаблон content-product.php или собственный хук внутри карточки.
Если вы нашли вызов вроде woocommerce_template_single_meta() или отдельный вывод stock badge, проще всего убрать его через remove_action(), но только после проверки, какой именно хук использует тема. Универсального имени тут нет: оно зависит от шаблона.
Практический ориентир такой: если фильтр сработал на странице товара, но в каталоге метка осталась, значит вывод идёт не через стандартный текст WooCommerce, а через тему.
Проверка результата после внедрения
После добавления кода проверьте не только страницу товара, но и несколько соседних сценариев. Иначе можно случайно скрыть наличие там, где оно должно остаться видимым.
- Откройте товар из нужной категории и убедитесь, что текст наличия исчез.
- Проверьте товар вне условия — у него наличие должно отображаться как раньше.
- Посмотрите страницу категории и поиск по каталогу.
- Если включён кэш, очистите его на уровне плагина, сервера и CDN.
- Проверьте мобильную версию: некоторые темы выводят бейдж наличия отдельно для адаптива.
Если вы используете отладку, временно включите WP_DEBUG_LOG и убедитесь, что в логах нет предупреждений о неверном типе объекта WC_Product.
Частые ошибки и как их исправить
Код добавили в functions.php, но ничего не изменилось
Чаще всего причина в том, что код положили в дочернюю тему, которая не активна, или в файл, который не загружается. Ещё один вариант — кэш страницы. Для проверки временно вставьте в фильтр явный тестовый текст и убедитесь, что он вообще подменяется.
Скрыли наличие у всех товаров, хотя нужен был только один сегмент
Обычно это ошибка в условии. Проверьте slug категории, ключ метаполя и то, что функция has_term() получает правильный ID товара. Если товар вариативный, иногда нужно проверять родительский товар, а не вариацию.
В каталоге метка осталась, а на странице товара исчезла
Это признак того, что тема выводит наличие двумя разными способами. В таком случае ищите шаблон каталога и отдельный хук для карточки товара. Не пытайтесь лечить это глобальным отключением stock management, если вам нужен складской учёт.
Пропали фильтры по наличию в каталоге
Такое бывает, если вместо текста наличия отключили саму логику stock status. Для витрины это плохой сценарий: фильтры и сортировка начинают вести себя непредсказуемо. Возвращайте только текст вывода, а не статус товара.
Сравнение подходов: код, плагин или правка шаблона
| Подход | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| Фильтр в коде | Нужно скрыть наличие точечно | Гибко, быстро, без лишних зависимостей | Нужно понимать условие и место вывода |
| Правка шаблона темы | Тема выводит stock badge отдельно | Можно убрать именно визуальный блок | Сложнее поддерживать после обновлений |
| Плагин для кастомизации | Нет доступа к коду или нужен интерфейс | Удобно для менеджера | Лишняя зависимость и риск конфликтов |
Если задача разовая и понятная, код обычно выигрывает. Если же скрытие наличия должно управляться из админки без разработчика, тогда уже имеет смысл смотреть в сторону плагина или собственного поля товара.
Практические советы по безопасности и производительности
Не вставляйте такой код в основной файл темы, если проект живёт долго и обновляется. Лучше использовать дочернюю тему или небольшой mu-plugin, чтобы не потерять настройку при обновлении.
Если условие завязано на метаполе, не делайте тяжёлые запросы внутри фильтра. Фильтр вызывается часто, особенно в каталоге. Для массовых каталогов лучше хранить простое значение в post meta, а не вычислять его на лету через сложные запросы.
Если вам нужно не только скрыть наличие, но и убрать связанные SEO-дубли, дополнительные служебные блоки и лишние элементы WooCommerce, иногда удобнее подключить точечную оптимизацию через Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но для самой задачи скрытия stock label он не обязателен — код выше решает проблему без плагина.
Если после внедрения вы хотите убедиться, что всё работает стабильно, проверьте ещё и сценарий с обновлением товара: измените остаток, сохраните карточку и откройте её в инкогнито. Это помогает поймать ситуацию, когда кэш или минификация JS/CSS маскируют реальный результат.