Ukrywanie płatności na podstawie wybranej wysyłki

ukrywanie metod płatności na podstawie wybranej metody dostawy

Ukrywanie płatności na podstawie wybranej wysyłki to temat, który zawsze wraca jak bumerang przy stosowaniu w Woocommerce płatności za pobraniem. Domyślnie w Woocommerce nie mamy możliwości wyklikać, która metoda płatności będzie wyświetlana przy danej wybranej wysyłce. Często spotykam się ze sklepami internetowymi na Woocommerce, gdzie po wybraniu płatności za pobraniem mam cały czas możliwość zapłacenia np. bramką przelewy24. Nie jest to eleganckie rozwiązanie z punktu widzenia klienta, ponieważ wprowadza go niejako w zakłopotanie. Za pewne jest jakaś płatna wtyczka do tego celu, ale po co ją stosować skoro parę linijek w pliku functions.php załatwi nam tą sprawę. Kod jest prosty, przejrzysty do tego stopnia, że osoba nie mająca pojęcia o języku PHP poradzi sobie bez problemu.

Jeżeli preferujesz formę wideo poradnika to odsyłam Cię na mój kanał YouTube.

Na skróty

  1. Ukrywanie metod płatności przy wybraniu wysyłki
  2. Kod do wklejenia w WordPress functions.php
  3. Dostosowanie kodu
  4. Dlaczego kod mi nie działa?

Brak ukrycia płatności przy pobraniu Woocommerce

Zastosowanie tego kodu najczęściej jest przy płatności oraz dostawie za pobraniem. Jak sama nazwa wskazuje jedyną dostępną metodą płatności w tym przypadku również powinno być za pobraniem. Często zdarza się tak, że niestety przy wybraniu tejże opcji w Woocommerce wyświetlać będą nam się pozostałe metody płatności. I tak np. wybierając metodę dostawy za pobraniem, będziemy mogli dalej opłacić sobie zamówienie w sklepie internetowym np. przez bramkę przelewy24. Niżej prezentuję Ci przykład jak powinno to wyglądać.

ukrywanie płatności na podstawie wybranej wysyłki w woocommerce
Działająca rotacja płatnościami na podstawie wybranej wysyłki.

Zauważ, że na prezentowanym przykładzie mamy dodatkowo Paczkomaty InPost, dla których również działa dodany przez nas kod.

ukrywanie płatności na podstawie wybranej wysyłki w woocommerce paczkomaty inpost
Paczkomaty InPost

Wraz z wyborem opcji dostawy kurierem lub przez paczkomaty InPost znika opcja płatności za pobraniem, natomiast przy wyborze dostawy za pobraniem znikają nam wszystkie metody płatności oprócz tej właściwej.

Ukrywanie płatności na podstawie wysyłki w Woocommerce

Ważna uwaga, abyśmy to co dodajemy do pliku functions.php robili na motywie potomnym, dzięki czemu mamy pewność, że podczas aktualizacji motywu plik ten nie zostanie nadpisany. W efekcie czego kod, który za chwile dodamy mógłby się usunąć.

Omawiany przeze mnie przykład zastosowania kodu ma następujące metody płatności:

  • przelew na konto – po dokonaniu zakupu klient ma wyświetlane informacje dotyczące nr konta bankowego,
  • płatność natychmiastowa CashBill – klient, u którego wdrażałem kod korzysta z bramki płatnościowej CashBill,
  • płatność BLIK – metoda dodana przez moduł CashBill,
  • za pobraniem – problematyczna metoda płatności, która spędza sen z powiek początkującym osobom.

Warto wymienić też jakie metody dostawy są w sklepie klienta:

  • Kurier DPD – metoda stworzoną przy pomocy płaskiej stawki,
  • Za pobraniem – tak samo jak wyżej jest to płaska stawka,
  • InPost Paczkomaty – dostawa dodana przy użyciu wtyczki, dzięki której klient ma możliwość z poziomu sklepu nadawać paczki u tego operatora; u klienta występuję w dwóch wariantach jako opcja płatna i darmowa; specjalnie jej tutaj nie rozdzielam na dwie osobne o czym dowiesz się z dalszej części tego wpisu.

Mamy jeszcze 2 darmowe dostawy (z punktu widzenia Woocommerce nie są stworzone jako płaska stawka tylko jako darmowa dostawa):

  • Kurier DPD darmowa,
  • Za pobraniem darmowa.

Łącznie mamy 4 metody płatności oraz 5 unikatowych metod wysyłek.

Kod ukrywania metod płatności na podstawie wybranej wysyłki

Wchodzimy w edycję pliku functions.php i dodajemy poniższy kod.

add_filter( 'woocommerce_available_payment_gateways', 'bbloomer_gateway_disable_shipping_326' );
	function bbloomer_gateway_disable_shipping_326( $available_gateways ) {	
		if ( ! is_admin() ) {
			$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
		if(!is_null($chosen_methods))
			$chosen_shipping = $chosen_methods[0];
		else
			$chosen_shipping = "";
		if(0 === strpos( $chosen_shipping, 'WARTOŚĆ WYSYŁKI' )) {
			if ( isset( $available_gateways['WARTOŚĆ PŁATNOŚCI'] )) {
				unset( $available_gateways['WARTOŚĆ PŁATNOŚCI'] );
			}
			if ( isset( $available_gateways['WARTOŚĆ PŁATNOŚCI'] )) {
				unset( $available_gateways['WARTOŚĆ PŁATNOŚCI'] );
			}
		}
		elseif(0 === strpos( $chosen_shipping, 'WARTOŚĆ WYSYŁKI' )) {
			if ( isset( $available_gateways['WARTOŚĆ PŁATNOŚCI'] )) {
				unset( $available_gateways['WARTOŚĆ PŁATNOŚCI'] );
			}
			if ( isset( $available_gateways['WARTOŚĆ PŁATNOŚCI'] )) {
				unset( $available_gateways['WARTOŚĆ PŁATNOŚCI'] );
			}
		}
		elseif(0 === strpos( $chosen_shipping, 'WARTOŚĆ WYSYŁKI' )) {
			if ( isset( $available_gateways['WARTOŚĆ PŁATNOŚCI'] )) {
				unset( $available_gateways['WARTOŚĆ PŁATNOŚCI'] );
			}
			if ( isset( $available_gateways['WARTOŚĆ PŁATNOŚCI'] )) {
				unset( $available_gateways['WARTOŚĆ PŁATNOŚCI'] );
			}
		}	
	}
return $available_gateways;
}

Dużo kodowego bełkotu, przez który przebijają się dwie informacje: wartość wysyłki oraz wartość płatności. Są to unikalne dla każdej metody wartości, które musimy znaleźć w kodzie strony i najlepiej zapisać je gdzieś sobie z boku. W pierwszej kolejności właśnie to zróbmy.

Wchodzimy do zakładki z formularzem składania zamówienia i klikamy PPM na przycisk do wybrania danej metody wysyłki, a następnie wybieramy zbadaj element. Pokaże nam się kod z zaznaczoną linijką odpowiadająca za element, który kliknęliśmy. W gąszczu informacji musimy znaleźć wartość value i ją sobie zapisać. Tak samo robimy z każdą metodą wysyłki oraz sposobem płatności.

ukrywanie płatności na podstawie wybranej wysyłki pobieranie wartości wysyłki
Pobieranie wartości metody wysyłki w Woocommerce
ukrywanie płatności na podstawie wybranej wysyłki pobieranie wartości płatności
Wartości metod płatności w Woocommerce

Dostosowanie kodu pod nasze płatności, wysyłki

Po spisaniu wszystkich wartości otrzymujemy taką listę:

  • Kurier DPD – flat_rate:16,
  • Za pobraniem – flat_rate:17,
  • InPost Paczkomaty – easypack_parcel_machines; obowiązuje ta wartość dla płatnego i darmowego wariantu tej wysyłki,
  • darmowy Kurier DPD – free_shipping:18,
  • darmowe za pobraniem – free_shipping:19

Do tego dochodzą nam metody płatności w Woocommerce:

  • Przelew bankowy – bacs,
  • Za pobraniem – cod,
  • Płatność CashBill – cashbill_basic_payment,
  • BLIK – cashbill_blik_payment.

Teraz musimy rozpisać sobie jakie metody płatności będą wyświetlały się przy wybraniu danej wysyłki:

  • Kurier DPD, InPost Paczkomaty, darmowy kurier DPD – przelew bankowy, CashBill, Blik,
  • Za pobraniem, darmowe za pobraniem – Za pobraniem.

Następnie edytujemy kod, który teraz będzie miał postać jak poniżej.

add_filter( 'woocommerce_available_payment_gateways', 'bbloomer_gateway_disable_shipping_326' );
	function bbloomer_gateway_disable_shipping_326( $available_gateways ) {	
		if ( ! is_admin() ) {
			$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
		if(!is_null($chosen_methods))
			$chosen_shipping = $chosen_methods[0];
		else
			$chosen_shipping = "";
		if(0 === strpos( $chosen_shipping, 'flat_rate:16' )) {
			if ( isset( $available_gateways['cod'] )) {
				unset( $available_gateways['cod'] );
			}
		}
		elseif(0 === strpos( $chosen_shipping, 'flat_rate:17' )) {
			if ( isset( $available_gateways['bacs'] )) {
				unset( $available_gateways['bacs'] );
			}
			if ( isset( $available_gateways['cashbill_basic_payment'] )) {
				unset( $available_gateways['cashbill_basic_payment'] );
			}
			if ( isset( $available_gateways['cashbill_blik_payment'] )) {
				unset( $available_gateways['cashbill_blik_payment'] );
			}
		}
		elseif(0 === strpos( $chosen_shipping, 'easypack_parcel_machines' )) {
			if ( isset( $available_gateways['cod'] )) {
				unset( $available_gateways['cod'] );
			}
		}
		elseif(0 === strpos( $chosen_shipping, 'free_shipping:18' )) {
			if ( isset( $available_gateways['cod'] )) {
				unset( $available_gateways['cod'] );
			}
		}
		elseif(0 === strpos( $chosen_shipping, 'free_shipping:20' )) {
			if ( isset( $available_gateways['bacs'] )) {
				unset( $available_gateways['bacs'] );
			}
			if ( isset( $available_gateways['cashbill_basic_payment'] )) {
				unset( $available_gateways['cashbill_basic_payment'] );
			}
			if ( isset( $available_gateways['cashbill_blik_payment'] )) {
				unset( $available_gateways['cashbill_blik_payment'] );
			}
		}	
	}
return $available_gateways;
}

Kod ten sprawdza, która metoda dostawy jest wybrana, a następnie ukrywa tą, która ma nie być dostępna w jej przypadku. Biorąc początek kodu pod lupę mamy pętlę warunkową if, która sprawdza czy wybraną metodą dostawy jest kurier DPD (flat_rate:16). Jeżeli tak to następnie sprawdzana jest obecność metody płatności za pobraniem (cod). Jeżeli jest to w następnym poleceniu unset jest ona chowana. I tak odbywa się to z każdą dostępną wysyłką w sklepie Woocommerce.

Po dostosowaniu kodu otrzymujemy efekt, o którym mowa była na początku w filmie.

Kod nie działa. Co robić?

Na 99% przypadków kod ten zadziała. Jednakże jeżeli Tobie kod w Woocommerce nie funkcjonuje to musisz sprawdzić następujące elementy:

  • czy w czasie dostosowania kodu nie usunąłeś przez przypadek jakiegoś nawiasu, klamry, przecinka, apostrofa, średnika,
  • nazwy wartości metod płatności oraz dostawy są odpowiednie i nie ma w nich błędów,
  • używasz jakiejś wtyczki do manipulowania wysyłkami, płatnościami; jeżeli tak to wyłącz ją i sprawdź czy kod działa,
  • wyłącz wszystkie wtyczki oprócz Woocommerce oraz ewentualnego PageBuildera i sprawdź czy kod działa; jeżeli działa, wtedy musisz pojedynczo włączać każdą wtyczkę i obserwować, przy której kod nie zadziała.
  • jeżeli nadal kod nie działa to jesteś w 1% ludzi, którym nie zadziała 🤷‍♂️

Jeżeli będziesz miał z problem z WordPress lub z Woocommerce to pisz śmiało na mojego maila [email protected].

7 odpowiedzi

  1. Hejo, nie wiem czy się nie mylę, ale opcję za pobraniem, można włączyć do poszczególnych form wysyłki. Nie musi ona być widoczna przy każdej wysyłce. Tak więc do tych „przelewowych” po prostu nie uruchamiamy płatności za pobraniem. Ja utworzyłem dodatkową opcję wysyłki (analogicznie do Ciebie Emilu) Kurier InPost – ZA POBRANIEM i w opcjach płatności za pobraniem ustawiłem tylko tą wysyłkę. Tak więc jest ona widoczna tylko przy Kurierze za pobraniem 🙂 W takim przypadku pozostaje tylko w tej formie wysyłki ukrycie płatności przelewem + bramka płatności 🙂
    Pozdrawiam Cię serdecznie, robisz kawał dobrej roboty!
    Do usłyszenia!

  2. Fajnie ukrywa metody płatności, ale powoduje błąd w wyświetlaniu klientów, który objawia się komunikatem „Wystąpił błąd podczas pobierania statystyk. Proszę spróbować ponownie.” Ponadto wchodzi w konflikt z niektórymi wyczkami uniemożliwiając konfigurację z poziomu panelu administracyjnego.

    1. Niestety przy jednej z najnowszych aktualizacji Woocommerce nastąpiła wada w tym kodzie. Wyszło mi to przy tym, że kod był stosowany na sklepie przez 2 lata i niedawno przestała działać integracja z BaseLinkerem. Wkrótce będzie aktualizacja kodu, gdyż mam już nowy 🙂

      1. Kiedy można spodziewać się publikacji nowego kodu?
        Dotychczasowy oprócz błędu wspomnianego przez Dariusza powoduje również komunikat w Stanie witryny o treści „The REST API call gave the following unexpected result: (500)”

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *