Как отключить отображение наличия для определённых товаров в WooCommerce

В 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 маскируют реальный результат.

Как удалить вредоносные плагины в WordPress
18.11.2025
Как создать автоматический sitemap в WordPress без плагинов
06.12.2025
Как запретить индексацию отдельных страниц в WordPress без плагинов
20.08.2026
Как отключить XML-RPC в WordPress без потери нужных функций
15.08.2026
Автоматическое удаление товаров в WooCommerce по сроку годности или дате публикации
20.06.2026