
Як видалити кнопку Додати в кошик у 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. П’ять хвилин на бекап економлять години відновлення.



