Skip to content

Wszystko o WordPressie, tworzeniu stron — i nie tylko

Jak usunąć przycisk Dodaj do koszyka w WooCommerce

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_action w functions.php, dla siatki kart i dla strony produktu
  • Strona główna i archiwa: warunkowy filtr woocommerce_is_purchasable z is_shop()
  • Wszystkie kategorie lub jedna konkretna: ten sam filtr z is_product_category() lub is_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// Убрать кнопку из сетки карточек
2remove_action(
3 'woocommerce_after_shop_loop_item',
4 'woocommerce_template_loop_add_to_cart'
5);
6
7// Убрать кнопку со страницы товара
8remove_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():

1function ts_hide_cart_on_shop() {
2 if ( is_shop() || is_front_page() ) {
3 add_filter( 'woocommerce_is_purchasable', '__return_false' );
4 }
5}
6add_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:

1function ts_hide_cart_in_categories() {
2 if ( is_product_category() ) {
3 add_filter( 'woocommerce_is_purchasable', '__return_false' );
4 }
5}
6add_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:

1function ts_hide_cart_for_category() {
2 if ( is_product_category( 'pod-zakaz' ) ) {
3 add_filter( 'woocommerce_is_purchasable', '__return_false' );
4 }
5}
6add_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.

Konfiguracja statusu zapasów produktu w WooCommerce

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.

Zerowanie ilości produktu w celu ukrycia przycisku zakupu

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:

1function 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}
8add_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.

1function 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}
8add_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_action i filtr woocommerce_is_purchasable usuwają 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ę przez woocommerce_get_price_html.

Po aktualizacji motywu wszystkie zmiany przepadły, jak się zabezpieczyć?

Nigdy nie należy wprowadzać zmian bezpośrednio w functions.php motywu nadrzędnego. Każda aktualizacja motywu nadpisze plik. Trzy niezawodne opcje: motyw potomny (własny functions.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_purchasable globalnie zwraca __return_false, proszę dodać drugi filtr z wyższym priorytetem, który dla potrzebnych ID zwraca true: 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.