
Jak usunąć przycisk Dodaj do koszyka w WooCommerce
Przycisk „Dodaj do koszyka", podstawowa mechanika WooCommerce, bez której sklep nie działa. Ale podstawowa nie oznacza zawsze odpowiednia. Witryna-wizytówka bez możliwości zamówienia, produkt „na zamówienie" z indywidualną kalkulacją, wyprzedana pozycja, którą za wcześnie zdejmować z publikacji, we wszystkich tych przypadkach standardowy Add to Cart tylko przeszkadza.
Można pójść na skróty i zmienić status produktu na „ukryty", ale wtedy wypadnie on z katalogu i przestanie być indeksowany. Znacznie subtelniej jest pozostawić kartę widoczną, a przycisk zakupu usunąć lub zastąpić. WooCommerce daje do tego kilka haków i filtrów: od globalnego wyłączenia po punktowe ukrycie na jednym produkcie.
Poniżej wszystkie działające sposoby, od prostego do złożonego. Każdy przetestowano na aktualnej wersji WooCommerce.
💡 Szybki przegląd:
- Cała witryna od razu: dwa
remove_actionwfunctions.php, dla siatki kart i dla strony produktu - Strona główna i archiwa: warunkowy filtr
woocommerce_is_purchasablezis_shop() - Wszystkie kategorie lub jedna konkretna: ten sam filtr z
is_product_category()lubis_product_category('slug') - Jeden produkt: trzy sposoby, standardowe wyłączenie w panelu administracyjnym, wyzerowanie stanu magazynowego, filtr po
product_id - Dla tych, którym przycisk jest potrzebny: zastąpienie niestandardowym napisem lub przyciskiem „Zapytaj o cenę"
1. Usuwamy przycisk z całej witryny
Jeśli sklep działa jako wizytówka i zakup nie jest w ogóle przewidziany, najprościej zdjąć przycisk globalnie, dwoma hakami w functions.php aktywnego motywu.
Pierwszy hak odpowiada za karty produktów w siatce (shortkody [products], strona sklepu, kategorie), drugi za stronę konkretnego produktu:
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 );
Kod lepiej umieszczać nie bezpośrednio w functions.php motywu (ryzyko utraty przy aktualizacji), a przez wtyczkę Code Snippets lub motyw potomny. Przed każdą edycją należy zrobić kopię zapasową, bez niej nie będzie jak cofnąć zmian.
2. Ukrywamy przycisk na stronie głównej i stronach archiwów
Globalne wyłączenie nie każdemu odpowiada. Częsta sytuacja: przycisk ma pozostać na stronie produktu, ale zniknąć z katalogu i ze strony głównej (gdzie produkty wyświetlane są listą).
Tutaj zamiast remove_action poprawniej jest użyć filtra woocommerce_is_purchasable z warunkowym sprawdzeniem 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' );
Hak wp uruchamia się wcześnie, przed renderowaniem, i nie obciąża strony powtarzalnymi sprawdzeniami. is_shop() obejmuje główną stronę sklepu, a is_front_page() statyczną stronę główną, jeśli wyświetlono na niej shortkod WooCommerce. Dla stron produktu filtr nie jest stosowany, tam zakup działa standardowo.
3. Usuwamy przycisk ze wszystkich stron kategorii
Ta sama zasada, ale zamiast is_shop() stosujemy is_product_category() bez parametru. Filtr obejmie każdą kategorię produktów:
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' );
Na stronie konkretnego produktu przycisk pozostaje. To wygodne, gdy katalog służy jako wizytówka, a zakup dostępny jest dopiero po przejściu do karty, na przykład po to, by użytkownik najpierw przeczytał opis i specyfikację.
4. Wyłączamy przycisk dla jednej kategorii
Bywa, że w sklepie jedna kategoria działa na zamówienie, a pozostałe standardowo. Wtedy potrzebne jest punktowe blokowanie po slugu kategorii:
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' należy zastąpić rzeczywistym slugiem potrzebnej kategorii. Slug można sprawdzić w panelu administracyjnym: „Produkty → Kategorie", kolumna „Slug". Filtr po cichu wyłącza możliwość zakupu dla wszystkich produktów wewnątrz kategorii, na stronie produktu przycisk również zniknie, ponieważ WooCommerce sprawdza is_purchasable() także tam.
5. Ukrywamy przycisk dla konkretnego produktu
Najbardziej pożądany scenariusz: jeden produkt z setek ma tymczasowo wyświetlać się bez możliwości zamówienia. W WooCommerce są na to trzy sposoby.
Sposób 1: standardowe wyłączenie w panelu administracyjnym
Wejdź w edycję produktu, otwórz zakładkę „Zapasy" (Inventory) i przełącz „Stan magazynowy" na „Brak w magazynie". Ustaw opcję „Zezwalaj na zamówienia przedpremierowe" na „Nie zezwalaj". Zapisz produkt, przycisk Add to Cart zniknie automatycznie.

Ta ścieżka nie wymaga kodu i działa od razu po instalacji. Minus: produkt jest oznaczany jako „Brak w magazynie", co nie zawsze jest pożądane (na przykład dla produktów cyfrowych lub usług, gdzie „stan magazynowy" nie ma sensu).
Sposób 2: wyzerowanie stanu magazynowego
W tej samej zakładce „Zapasy" odznacz „Zarządzaj stanem magazynowym" lub ustaw ilość na 0. Przycisk zniknie, gdy stan osiągnie zero.

Sposób dobry dla produktów fizycznych: gdy tylko ostatnia sztuka zostanie sprzedana, przycisk znika sam. Ale, podobnie jak pierwszy sposób, produkt otrzymuje status brakującego.
Sposób 3: filtr po ID produktu
Jeśli trzeba usunąć przycisk bez zmiany statusu „w magazynie", należy użyć filtra ze sprawdzeniem 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 );
Co tu się dzieje: filtr woocommerce_is_purchasable otrzymuje bieżący status $purchasable i obiekt $product. Jeśli $product->get_id() pokrywa się z jednym z ID w tablicy $target_ids, zwracane jest false, przycisk zostaje stłumiony. Dla wszystkich pozostałych produktów zwracany jest pierwotny status.
$product->get_id() to metoda aktualna od WooCommerce 3.0. Stara właściwość $product->id (bezpośrednie odwołanie do pola) jest uznana za przestarzałą i generuje notice w logach, proszę jej nie używać.
Tablicę $target_ids można rozszerzać. ID produktu można sprawdzić w panelu administracyjnym: najedź kursorem na nazwę produktu na liście, ID wyświetli się w pasku statusu przeglądarki (lub otwórz produkt i sprawdź liczbę w URL: post=22).
6. Zastąpienie przycisku niestandardowym tekstem
Czasem przycisku nie trzeba usuwać, trzeba go zastąpić. Na przykład dla produktów „na zamówienie" wyświetlić „Zapytaj o cenę" z linkiem do formularza kontaktowego.
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 );
Ten filtr przechwytuje HTML przycisku przed wyświetleniem i podmienia go na dowolny link z klasą .button. Działa zarówno dla siatki kart, jak i dla strony produktu, w obu kontekstach WooCommerce używa jednego filtra.
Dla bardziej złożonej logiki (różny tekst dla różnych produktów, własny przycisk z oknem modalnym) warto spojrzeć w stronę woocommerce_template_single_add_to_cart, czyli pełnego nadpisania szablonu przycisku przez motyw potomny.
⁉️🤔 Często zadawane pytania
Czy bezpiecznie jest edytować functions.php bezpośrednio?
Bez doświadczenia nie. functions.php wykonuje się przy każdym żądaniu, a błąd składni w nim kładzie całą witrynę (biały ekran). Proszę używać wtyczki Code Snippets, daje ona interfejs do dodawania fragmentów PHP ze sprawdzaniem składni i automatycznym wyłączaniem przy błędzie krytycznym. Albo edytować przez FTP/SFTP, uprzednio zapisując działającą kopię pliku lokalnie.
Jak ukryć przycisk tylko dla niezalogowanych użytkowników?
Proszę dodać sprawdzenie
is_user_logged_in()do dowolnego z powyższych warunków. Na przykład:if ( ! is_user_logged_in() && is_shop() ) { add_filter(...); }. Goście widzą witrynę bez przycisku, zarejestrowani pełną funkcjonalność. Częsty przypadek dla sklepów hurtowych, gdzie ceny i koszyk są dostępne po zalogowaniu.
Przycisk zniknął, ale cena i warianty pozostały, czy to normalne?
Tak. Haki
remove_actioni filtrwoocommerce_is_purchasableusuwają wyłącznie przycisk dodawania do koszyka. Cena i selektory wariantów (kolor, rozmiar) wizualnie pozostają. Jeśli trzeba ukryć również je, proszę dodać CSS:.single-product .variations_form, .single-product .price { display: none; }lub zastosować głębszą interwencję przezwoocommerce_get_price_html.
Po aktualizacji motywu wszystkie zmiany przepadły, jak się zabezpieczyć?
Nigdy nie należy wprowadzać zmian bezpośrednio w
functions.phpmotywu nadrzędnego. Każda aktualizacja motywu nadpisze plik. Trzy niezawodne opcje: motyw potomny (własnyfunctions.php), wtyczka Code Snippets (fragmenty żyją w bazie danych i przetrwają aktualizacje) lub prosty MU-plugin (/wp-content/mu-plugins/disable-cart.php, plik nie jest wyłączany z panelu administracyjnego i nie jest ruszany przez aktualizacje).
Czy można przywrócić przycisk dla konkretnego produktu po globalnym wyłączeniu?
Tak. Po tym, jak filtr
woocommerce_is_purchasableglobalnie zwraca__return_false, proszę dodać drugi filtr z wyższym priorytetem, który dla potrzebnych ID zwracatrue:add_filter( 'woocommerce_is_purchasable', 'ts_enable_for_specific', 20, 2 );, priorytet 20 wykona się po 10 i będzie mógł nadpisać zwracaną wartość.
Jaki sposób wybrać do swojego zadania
Jeśli tworzą Państwo witrynę-wizytówkę bez płatności online, proszę wziąć globalne wyłączenie dwoma remove_action. Trzeba zamknąć zakupy w katalogu, ale zostawić w kartach, filtr z is_shop(). Jedna problematyczna kategoria, is_product_category('slug'). Jeden produkt z setek, standardowe ustawienie stanów magazynowych lub filtr po ID.
I najważniejsze: zanim cokolwiek zmienią Państwo w functions.php, proszę zrobić kopię zapasową. I nie przez wtyczkę, którą właśnie zamierzają Państwo edytować, tylko pełną, przez hosting lub UpdraftPlus. Pięć minut na backup oszczędza godziny przywracania.



