В WooCommerce часто нужен не «полностью скрыть товар», а более точный сценарий: товар должен быть виден в каталоге, но купить его через стандартную корзину нельзя. Это бывает для витринных позиций, услуг с ручным расчётом, товаров по запросу, предзаказов или ассортимента, который оформляется только через менеджера.
Ниже разберём рабочие способы: через код, через настройки товара и с учётом того, как не сломать каталог, поиск и карточку товара.
Когда это действительно нужно
Отключение добавления в корзину полезно, если:
- товар показывается как витринный, но не продаётся онлайн;
- цена зависит от менеджера, региона или индивидуального расчёта;
- нужно оставить карточку товара для SEO и каталога, но убрать кнопку покупки;
- часть товаров доступна только по запросу или через офлайн-канал;
- нужно временно остановить продажи без удаления товара из магазина.
Важно не путать это с полным скрытием товара. В большинстве случаев задача именно в том, чтобы убрать кнопку Добавить в корзину, а не удалять товар из каталога и поиска.
Диагностика: что именно сейчас происходит
Перед правкой кода проверьте, где товар должен оставаться видимым. Это влияет на выбор решения.
Проверьте поведение на витрине
- есть ли кнопка
Добавить в корзинув каталоге; - есть ли кнопка на странице товара;
- можно ли добавить товар через прямую ссылку с параметром
?add-to-cart=ID; - нужно ли убрать товар только из каталога или ещё и из карточки товара;
- должен ли товар оставаться доступным для поиска по сайту и в WooCommerce.
Если кнопка убрана только CSS-ом, товар всё равно можно добавить в корзину через прямой запрос или сторонние сценарии. Для реального ограничения нужен PHP-хук.
Пошаговое решение через код
Самый надёжный вариант — отключать покупку для конкретных товаров по ID, категории или метаполю. Ниже пример для товаров с определённым ID. Код лучше добавить в дочернюю тему или в собственный мини-плагин.
<?php
add_filter( 'woocommerce_is_purchasable', 'wpinfo_disable_purchase_for_selected_products', 10, 2 );
function wpinfo_disable_purchase_for_selected_products( $purchasable, $product ) {
if ( ! $product instanceof WC_Product ) {
return $purchasable;
}
$blocked_ids = array( 123, 456, 789 );
if ( in_array( $product->get_id(), $blocked_ids, true ) ) {
return false;
}
return $purchasable;
}
Этот фильтр убирает возможность покупки на уровне WooCommerce. В результате кнопка Добавить в корзину исчезает, а товар остаётся в каталоге.
Если нужно отключать по категории
Для магазинов с большим каталогом удобнее управлять не списком ID, а категорией. Это проще поддерживать, когда ассортимент меняется.
<?php
add_filter( 'woocommerce_is_purchasable', 'wpinfo_disable_purchase_for_category_products', 10, 2 );
function wpinfo_disable_purchase_for_category_products( $purchasable, $product ) {
if ( ! $product instanceof WC_Product ) {
return $purchasable;
}
if ( has_term( 'showcase', 'product_cat', $product->get_id() ) ) {
return false;
}
return $purchasable;
}
Здесь showcase — slug категории товаров. Подход удобен, если витринные товары собраны отдельно.
Как убрать кнопку и на странице товара, и в каталоге
В большинстве тем WooCommerce этого достаточно. Но если тема выводит кнопку через собственные шаблоны, может понадобиться дополнительно убрать стандартные действия:
<?php
add_action( 'wp', 'wpinfo_remove_add_to_cart_buttons' );
function wpinfo_remove_add_to_cart_buttons() {
global $product;
if ( ! $product instanceof WC_Product ) {
return;
}
$blocked_ids = array( 123, 456, 789 );
if ( in_array( $product->get_id(), $blocked_ids, true ) ) {
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
}
}
Этот вариант полезен, если тема или плагин вмешиваются в стандартный вывод. Но в большинстве случаев достаточно первого фильтра woocommerce_is_purchasable.
Сравнение подходов
| Способ | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
PHP-фильтр woocommerce_is_purchasable | Нужно реально запретить покупку | Работает на уровне WooCommerce, не зависит от верстки | Нужен доступ к коду |
| Удаление кнопки через шаблон темы | Тема сильно кастомизирована | Можно точечно изменить вывод | Легко сломать при обновлении темы |
| CSS-скрытие кнопки | Только визуально убрать элемент | Быстро | Не решает задачу безопасности и логики покупки |
Проверка результата после внедрения
После добавления кода проверьте не только внешний вид, но и поведение системы.
- откройте карточку товара из списка запрещённых;
- убедитесь, что кнопка покупки исчезла;
- проверьте, что товар всё ещё открывается по прямой ссылке;
- попробуйте добавить его через URL вида
?add-to-cart=123; - посмотрите, не остались ли кнопки в мини-корзине, быстрых просмотрщиках или в блоках темы;
- проверьте товар в мобильной версии, если тема использует отдельный шаблон.
Если товар всё ещё добавляется в корзину через прямую ссылку, значит, где-то используется отдельная логика, и одного визуального скрытия недостаточно. В этом случае фильтр woocommerce_is_purchasable должен быть именно в активной теме или плагине, а не в коде, который не загружается на фронтенде.
Частые ошибки и как их исправить
Код добавили в functions.php родительской темы
После обновления темы изменения пропадут. Для постоянной поддержки лучше использовать дочернюю тему или небольшой плагин с одним назначением.
Скрыли кнопку только через CSS
Это не отключает покупку. Пользователь или интеграция всё равно могут отправить товар в корзину. Для реального запрета нужен PHP-фильтр.
Проверяют не тот товар
В WooCommerce вариативный товар и его вариации могут вести себя по-разному. Если нужно отключить покупку у конкретной вариации, проверяйте не только родительский товар, но и сами вариации.
Не учли кэш
Если на сайте стоит кэш страницы или объектный кэш, после правки код может не проявиться сразу. Очистите кэш плагина, сервера и CDN, если он есть.
Отключили покупку, но оставили старые ссылки
Если товар уже был в закладках или в письмах, пользователь может открыть старую ссылку. Поэтому важно проверить не только каталог, но и прямой доступ к карточке.
Практические советы по безопасности и производительности
Если список товаров большой, не храните его в коде без структуры. Для поддержки удобнее:
- выделить отдельную категорию для витринных товаров;
- или использовать пользовательское поле, если у вас уже есть админская логика для этого;
- не дублировать логику в нескольких плагинах одновременно;
- после внедрения протестировать поведение на staging-окружении.
Если вам нужно не только убрать покупку, но и почистить магазин от лишних дублей, служебных страниц и технического мусора, для части задач может помочь Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но саму логику отключения покупки у товара всё равно лучше делать кодом, а не полагаться на косметические настройки.
Если нужно не только убрать кнопку, но и заменить сценарий покупки
Иногда вместо корзины нужен другой путь: форма заявки, кнопка Уточнить цену, переход к менеджеру или запрос по телефону. В таком случае можно оставить товар видимым, отключить покупку и вывести свой CTA в шаблоне товара. Это уже отдельная задача, и её лучше строить поверх проверки is_purchasable(), а не вместо неё.
Такой подход даёт предсказуемое поведение: товар остаётся в каталоге, но WooCommerce не считает его покупаемым, а значит, не показывает стандартную кнопку и не пропускает в корзину стандартным способом.