Как скрыть цены в WooCommerce для неавторизованных пользователей

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

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

Что именно нужно проверить перед изменениями

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

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

  • Откройте карточку товара в режиме гостя и проверьте, где отображается цена.
  • Посмотрите исходный код страницы: если цена есть в HTML, CSS-скрытие не решает задачу.
  • Проверьте архив категории товаров и блоки WooCommerce в шапке/сайдбаре.
  • Убедитесь, что тема не дублирует цену собственным шаблоном.

Если цена выводится в HTML, лучше отключать её на уровне PHP. Тогда не будет лишней разметки, а кнопка покупки не останется доступной через прямую ссылку.

Решение: скрываем цену и кнопку покупки для гостей

Самый надёжный способ — использовать фильтры WooCommerce, которые отвечают за вывод цены и кнопки «В корзину». Логику можно положить в дочернюю тему или в собственный мини-плагин.

<?php
/**
 * Hide WooCommerce prices and add-to-cart button for guests.
 */
add_filter( 'woocommerce_get_price_html', 'wpturbo_hide_price_for_guests', 10, 2 );
function wpturbo_hide_price_for_guests( $price, $product ) {
    if ( is_admin() ) {
        return $price;
    }

    if ( is_user_logged_in() ) {
        return $price;
    }

    return '<span class="price-login-required">Цена доступна после входа</span>';
}

add_filter( 'woocommerce_is_purchasable', 'wpturbo_disable_purchase_for_guests', 10, 2 );
function wpturbo_disable_purchase_for_guests( $purchasable, $product ) {
    if ( is_admin() ) {
        return $purchasable;
    }

    if ( is_user_logged_in() ) {
        return $purchasable;
    }

    return false;
}

add_filter( 'woocommerce_loop_add_to_cart_link', 'wpturbo_remove_loop_add_to_cart_for_guests', 10, 2 );
function wpturbo_remove_loop_add_to_cart_for_guests( $html, $product ) {
    if ( is_user_logged_in() ) {
        return $html;
    }

    return '';
}

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

Если нужно скрыть цену только у части товаров

Часто задача не глобальная: например, цены скрывают только для оптового каталога, товаров в определённой категории или для товаров без авторизации. Тогда добавьте проверку по категории или по метаполю.

<?php
add_filter( 'woocommerce_get_price_html', 'wpturbo_hide_price_for_specific_category', 10, 2 );
function wpturbo_hide_price_for_specific_category( $price, $product ) {
    if ( is_user_logged_in() ) {
        return $price;
    }

    if ( has_term( 'opt', 'product_cat', $product->get_id() ) ) {
        return '<span class="price-login-required">Цена по запросу</span>';
    }

    return $price;
}

Такой подход удобен, если у вас смешанный каталог: часть товаров продаётся открыто, а часть — только после авторизации.

Сравнение подходов: плагин, код, CSS

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

ПодходПлюсыМинусыКогда использовать
ПлагинБыстро, без кодаМожет конфликтовать с темой и кэшомЕсли нужен быстрый запуск без доработок
Код через фильтры WooCommerceТочный контроль, меньше лишней разметкиНужно аккуратно тестироватьЕсли важны стабильность и предсказуемость
CSSСамый простой способЦена остаётся в HTML, решение легко обходитсяТолько как временная мера

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

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

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

  • Откройте каталог в режиме инкогнито: цена должна быть заменена на ваш текст или скрыта.
  • Проверьте карточку товара: кнопка «В корзину» не должна отображаться для гостя.
  • Попробуйте открыть прямую ссылку на товар с параметрами вариации — покупка тоже должна быть недоступна.
  • Войдите под обычным пользователем и убедитесь, что цена и покупка вернулись.
  • Проверьте кэш: если используется page cache, очистите его после правок.

Дополнительно откройте исходный код страницы и найдите цену поиском по HTML. Если она всё ещё присутствует, значит, вы скрыли только визуальный слой, а не сам вывод данных.

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

Скрыли цену только через CSS

Это самая частая ошибка. Пользователь не видит цену, но она остаётся в HTML, а иногда и в структурированных данных. Исправление простое: используйте фильтр woocommerce_get_price_html, а не только стили.

Не отключили кнопку покупки в архиве

Если убрать только цену, товар всё равно можно добавить в корзину через список товаров. Для этого нужен фильтр woocommerce_loop_add_to_cart_link или отключение purchasable через woocommerce_is_purchasable.

Забыли про кэш страницы

После изменения логики гостям может продолжать показываться старая версия страницы из кэша. Очистите кэш плагина, серверный кэш и CDN, если он используется.

Сломали вывод в админке

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

Безопасность и производительность

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

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

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

Когда лучше не прятать цену полностью

Полное скрытие цены не всегда лучший вариант. Для некоторых магазинов полезнее показывать диапазон, текст «Цена по запросу» или кнопку «Войти, чтобы увидеть цену». Это снижает количество пустых страниц и не создаёт ощущение, что товар недоступен.

Если у вас B2B-магазин, проверьте ещё один сценарий: гостям можно оставить каталог, а цену показывать только после регистрации и подтверждения роли. Тогда логика будет чуть сложнее, но структура фильтров останется той же — меняется только условие доступа.

⭐⭐⭐⭐⭐