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

В 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 не считает его покупаемым, а значит, не показывает стандартную кнопку и не пропускает в корзину стандартным способом.

Автоматическое удаление неактивных пользователей в WooCommerce: пошаговое руководство
02.07.2026
Автоматическое удаление спама в комментариях WordPress: лучшие решения и примеры кода
12.12.2025
Как отключить автоматический выход из WordPress
17.02.2026
Как добавить динамические поля в WordPress: практическое руководство
09.03.2026
WooCommerce: автоматическое изменение стоимости товара в зависимости от роли пользователя
17.07.2026