
Как удалить кнопку Добавить в корзину в WooCommerce
Кнопка «Добавить в корзину», базовая механика WooCommerce, без которой магазин не работает. Но базовая, не значит всегда уместная. Сайт-витрина без возможности заказа, товар «под заказ» с индивидуальным расчётом, распроданная позиция, которую рано снимать с публикации, во всех этих случаях стандартный Add to Cart только мешает.
Можно пойти в лоб и перевести товар в статус «скрыто», но тогда он выпадет из каталога и перестанет индексироваться. Гораздо тоньше, оставить карточку видимой, а кнопку покупки убрать или заменить. WooCommerce даёт для этого несколько хуков и фильтров: от глобального отключения до точечного скрытия на одном продукте.
Ниже, все работающие способы, от простого к сложному. Каждый протестирован на актуальной версии WooCommerce.
💡 Быстрый обзор:
- Весь сайт разом: два
remove_actionвfunctions.php, для сетки карточек и для страницы товара - Главная и архивы: условный фильтр
woocommerce_is_purchasableпоis_shop() - Все категории или одна конкретная: тот же фильтр с
is_product_category()илиis_product_category('slug') - Один товар: три способа, штатное отключение в админке, обнуление остатков, фильтр по
product_id - Для тех, кому кнопка нужна: замена на кастомную надпись или кнопку «Запросить цену»
1. Убираем кнопку со всего сайта
Если магазин работает как витрина и покупка не предусмотрена в принципе, проще всего снять кнопку глобально, двумя хуками в functions.php активной темы.
Первый хук отвечает за карточки товаров в сетке (шорткоды [products], страница магазина, категории), второй, за страницу конкретного товара:
1 // Убрать кнопку из сетки карточек 2 remove_action( 3 'woocommerce_after_shop_loop_item', 4 'woocommerce_template_loop_add_to_cart' 5 ); 6 7 // Убрать кнопку со страницы товара 8 remove_action( 9 'woocommerce_single_product_summary', 10 'woocommerce_template_single_add_to_cart', 11 30 12 );
Размещать код лучше не напрямую в functions.php темы (риск потерять при обновлении), а через плагин Code Snippets или дочернюю тему. Перед любым редактированием сделайте резервную копию, откатить правки без неё будет некуда.
2. Скрываем кнопку на главной и архивных страницах
Глобальное отключение подходит не всем. Частая ситуация: кнопка должна остаться на странице товара, но исчезнуть из каталога и с главной (где товары выводятся списком).
Здесь вместо remove_action правильнее использовать фильтр woocommerce_is_purchasable с условной проверкой is_shop():
1 function ts_hide_cart_on_shop() { 2 if ( is_shop() || is_front_page() ) { 3 add_filter( 'woocommerce_is_purchasable', '__return_false' ); 4 } 5 } 6 add_action( 'wp', 'ts_hide_cart_on_shop' );
Хук wp срабатывает рано, до рендеринга, и не нагружает страницу повторными проверками. is_shop() покрывает основную страницу магазина и is_front_page(), статическую главную, если на неё выведен шорткод WooCommerce. Для страниц товара фильтр не применяется, там покупка работает штатно.
3. Убираем кнопку со всех страниц категорий
Тот же принцип, но вместо is_shop(), is_product_category() без параметра. Фильтр подхватит любую категорию товаров:
1 function ts_hide_cart_in_categories() { 2 if ( is_product_category() ) { 3 add_filter( 'woocommerce_is_purchasable', '__return_false' ); 4 } 5 } 6 add_action( 'wp', 'ts_hide_cart_in_categories' );
На странице конкретного товара кнопка остаётся. Это удобно, когда каталог служит витриной, а покупка доступна только после перехода в карточку, например, чтобы пользователь сначала прочитал описание и характеристики.
4. Отключаем кнопку для одной категории
Бывает, что в магазине одна категория работает под заказ, а остальные, обычные. Тогда нужна точечная блокировка по slug категории:
1 function ts_hide_cart_for_category() { 2 if ( is_product_category( 'pod-zakaz' ) ) { 3 add_filter( 'woocommerce_is_purchasable', '__return_false' ); 4 } 5 } 6 add_action( 'wp', 'ts_hide_cart_for_category' );
'pod-zakaz' замените на реальный slug нужной категории. Slug можно посмотреть в админке: «Товары → Категории», столбец «Ярлык». Фильтр молча выключает возможность покупки для всех товаров внутри категории, на странице товара кнопка тоже исчезнет, потому что WooCommerce проверяет is_purchasable() и там.
5. Прячем кнопку для конкретного товара
Самый востребованный сценарий: один товар из сотен должен временно отображаться без возможности заказа. В WooCommerce для этого есть три способа.
Способ 1: штатное отключение в админке
Зайдите в редактирование товара, откройте вкладку «Запасы» (Inventory) и переключите «Статус запасов» в положение «Нет в наличии». Установите флажок «Разрешить предзаказ» в «Не разрешено». Сохраните товар, кнопка Add to Cart исчезнет автоматически.

Этот путь не требует кода и работает из коробки. Минус, товар помечается как «Нет в наличии», что не всегда желательно (например, для цифровых товаров или услуг, где «наличие» не имеет смысла).
Способ 2: обнуление остатков
В той же вкладке «Запасы» снимите флажок «Управлять запасами» или установите количество в 0. Кнопка пропадёт, когда остаток достигнет нуля.

Способ хорош для физических товаров: как только последняя единица продана, кнопка исчезает сама. Но, как и первый способ, товар получает статус отсутствующего.
Способ 3: фильтр по ID товара
Если нужно убрать кнопку без изменения статуса «в наличии», используйте фильтр с проверкой ID:
1 function ts_disable_cart_for_product( $purchasable, $product ) { 2 $target_ids = array( 22, 47, 103 ); // ID товаров, для которых убираем кнопку 3 if ( in_array( $product->get_id(), $target_ids ) ) { 4 return false; 5 } 6 return $purchasable; 7 } 8 add_filter( 'woocommerce_is_purchasable', 'ts_disable_cart_for_product', 10, 2 );
Что здесь происходит: фильтр woocommerce_is_purchasable получает текущий статус $purchasable и объект $product. Если $product->get_id() совпадает с одним из ID в массиве $target_ids, возвращается false, кнопка подавлена. Для всех остальных товаров возвращается исходный статус.
$product->get_id(), метод, актуальный с WooCommerce 3.0. Старое свойство $product->id (прямое обращение к полю) объявлено устаревшим и генерирует notice в логах, не используйте его.
Массив $target_ids можно расширять. ID товара смотрите в админке: наведите курсор на название товара в списке, ID отобразится в строке статуса браузера (или откройте товар и посмотрите число в URL: post=22).
6. Замена кнопки на кастомный текст
Иногда кнопку не нужно убирать, её нужно заменить. Например, для товаров «под заказ» вывести «Запросить цену» с ссылкой на форму обратной связи.
1 function ts_replace_cart_button_single( $html, $product ) { 2 $target_ids = array( 22 ); 3 if ( in_array( $product->get_id(), $target_ids ) ) { 4 return '<a href="/contact" class="button alt">Запросить цену</a>'; 5 } 6 return $html; 7 } 8 add_filter( 'woocommerce_loop_add_to_cart_link', 'ts_replace_cart_button_single', 10, 2 );
Этот фильтр перехватывает HTML кнопки до вывода и подменяет его на произвольную ссылку с классом .button. Работает и для сетки карточек, и для страницы товара, в обоих контекстах WooCommerce использует один фильтр.
Для более сложной логики (разный текст для разных товаров, своя кнопка с модальным окном) посмотрите в сторону woocommerce_template_single_add_to_cart, полную перезапись шаблона кнопки через дочернюю тему.
⁉️🤔 Частые вопросы
Безопасно ли править functions.php напрямую?
Без опыта, нет. functions.php выполняется на каждом запросе, и синтаксическая ошибка в нём кладёт весь сайт (белый экран). Используйте плагин Code Snippets, он даёт интерфейс для добавления PHP-фрагментов с проверкой синтаксиса и автоотключением при фатальной ошибке. Или правьте через FTP/SFTP, предварительно сохранив рабочую копию файла локально.
Как скрыть кнопку только для незалогиненных пользователей?
Добавьте проверку
is_user_logged_in()в любое из условий выше. Например:if ( ! is_user_logged_in() && is_shop() ) { add_filter(...); }. Гостям, витрина без кнопки, зарегистрированным, полный функционал. Частый кейс для оптовых магазинов, где цены и корзина открываются после входа.
Кнопка исчезла, а цена и вариации остались, это нормально?
Да. Хуки
remove_actionи фильтрwoocommerce_is_purchasableубирают именно кнопку добавления в корзину. Цена и селекторы вариаций (цвет, размер) визуально остаются. Если нужно скрыть и их, добавьте CSS:.single-product .variations_form, .single-product .price { display: none; }, или используйте более глубокое вмешательство черезwoocommerce_get_price_html.
После обновления темы все правки слетели, как защититься?
Никогда не вносите изменения напрямую в
functions.phpродительской темы. Любое обновление темы перезапишет файл. Три надёжных варианта: дочерняя тема (свойfunctions.php), плагин Code Snippets (фрагменты живут в базе данных и переживают обновления), или простой MU-плагин (/wp-content/mu-plugins/disable-cart.php, файл не отключается из админки и не затрагивается обновлениями).
Можно ли вернуть кнопку для конкретного товара после глобального отключения?
Да. После того, как фильтр
woocommerce_is_purchasableглобально возвращает__return_false, добавьте второй фильтр с более высоким приоритетом, который для нужных ID возвращаетtrue:add_filter( 'woocommerce_is_purchasable', 'ts_enable_for_specific', 20, 2 );, приоритет 20 выполнится после 10 и сможет переопределить возврат.
Какой способ выбрать под вашу задачу
Если вы делаете витрину без онлайн-оплаты, берите глобальное отключение двумя remove_action. Нужно закрыть покупки в каталоге, но оставить в карточках, фильтр с is_shop(). Одна проблемная категория, is_product_category('slug'). Один товар из сотен, штатная настройка запасов или фильтр по ID.
И главное: перед тем как что-то менять в functions.php, сделайте резервную копию. И не через плагин, который вы же и собираетесь править, а полную, через хостинг или UpdraftPlus. Пять минут на бэкап экономят часы восстановления.



