Jak uzależnić sposób płatności od metody wysyłki w WooCommerce

Metody wysyłki w WooCommerce są niezależne od sposobów płatności, co powoduje problemy. Gdy ktoś wybierze wysyłkę kurierem za pobraniem, to nadal może zapłacić z góry przelewem. Wprowadza to zamieszanie i utrudnia proces zamawiania. Zobaczmy, jak skonfigurować metody płatności i wysyłki w WooCommerce na potrzeby Polski i odpowiednio je ze sobą powiązać.

WooCommerce - jak ustawić sposoby płatności zależne od wysyłki

Wiele gotowych sklepów internetowych, takich jak Prestashop czy WooCommerce, ma jeden poważny problem z dostosowaniem ich na potrzeby polskiego rynku. Chodzi o ustawienie metod wysyłki i  przypisanie ich do konkretnych metod płatności. Wszyscy wiemy, że wysyłka produktu za pobraniem jest droższa, niż wysyłka produktu opłaconego wcześniej z góry. W związku z tym koszt dostawy musi się zmieniać w zależności od tego, czy klient wybierze płatność przy odbiorze, czy też zapłaci za zamówienie z góry (przelewem lub płatnością online). WooCommerce jednak na to domyślnie nie pozwala.

tpay szybkie płatności

Na czym polega problem z dostawą i płatnością w WooCommerce?

Niestety przeniesienie powyższej zasady na realia sklepów internetowych opartych na WooCommerce (a także np. na Prestashop) jest domyślnie niemożliwe. Wynika to z tego, że twórcy po prostu takiej funkcji nie zaimplementowali i domyślnie działanie tych sklepów jest takie, że klient wybiera np. dostawę kurierem, a dopiero w następnym kroku wybiera sposób płatności.. Problem polega na tym, że koszt dostawy jest przypisany na stałe dla danej metody wysyłki (np. dla kuriera) i nie ma możliwości wprowadzenia modyfikacji tej kwoty na podstawie sposobu płatności (np. zwiększenia kosztu paczki kurierskiej po wybraniu płatności za pobraniem), gdyż te dwie rzeczy nie są po prostu ze sobą mechanicznie powiązane w skrypcie WooCommerce.

Rozwiązaniem powyższego problemu jest zduplikowanie metod dostawy, przypisanie im nazw płatności (np. „Kurier – za pobraniem”, „Kurier – płatność z góry”, „Poczta Polska – za pobraniem”, „Poczta Polska – płatność z góry”) i wprowadzenie osobnych kwot za wysyłkę. Problem rozwiązany? Nie do końca. Klient “w kasie”, który wybierze dostawę „Poczta Polska – za pobraniem” może w kolejnym kroku i tak wybrać płatność z góry przelewem, bo nadal będą mu się wyświetlać wszystkie sposoby płatności.

WooCommerce - problem z wyborem dostawy i sposobu płatności (niespójność)

Wynika to z tego, że sposoby płatności nie są w żaden sposób mechanicznie uzależnione od metod wysyłki. Wprowadza to straszne zamieszanie podczas finalizacji zamówienia, gdyż w jednym miejscu klient wybiera paczkę kurierską za pobraniem, a zaraz pod spodem wyświetla mu się domyślnie zaznaczona płatność przelewem. Rozwiązaniem jest ukrycie wybranych sposobów płatności na podstawie aktualnie zaznaczonej metody wysyłki. Efekt wtedy będzie taki, jak poniżej. Brzmi dobrze, ale jak to zrobić?

WooCommerce - prawidłowa konfiguracja metod wysyłki i sposobów płatności

WooCommerce, niestety, nie ma żadnej wbudowanej funkcji, która pozwalałaby na ukrycie określonych sposobów płatności na podstawie wybranej metody wysyłki (np. ukrycie płatności przelewem po wybraniu paczki kurierskiej za pobraniem). Są oczywiście do tego płatne wtyczki, ale my pokażemy wam krok po kroku, jak to zrobić za darmo. Najpierw skonfigurujemy odpowiednio wszystkie metody dostawy, a następnie za pomocą nieskomplikowanego kodu PHP wprowadzimy warunki, które będą ukrywać określone sposoby płatności na podstawie aktualnie wybranej metody dostawy. Dzięki temu klient, który wybierze np. opcję „Kurier – za pobraniem”, w następnym kroku nie zobaczy żadnych metod płatności z góry. Wszystko będzie jasne, proste i klarowne.

Krok 1: Ustaw odpowiednie metody wysyłki

Pierwszym krokiem jest skonfigurowanie metod dostawy, przypisując im w nazwie określone sposoby płatności, a także ustawiając odpowiednie ceny. Na potrzeby poradnika stworzymy takie najpopularniejsze zestawienie, czyli dostawę Pocztą Polską i Kurierem w dwóch wariantach – za pobraniem oraz z płatnością z góry.

W poradniku opieramy się na najnowszej wersji WooCommerce 2.6, w której wprowadzono już funkcję stref wysyłki. Aby skonfigurować wysyłki wedle powyższego schematu, musimy utworzyć strefę wysyłkową dla Polski i dodać w niej cztery metody wysyłki (dwie dla Poczty Polskiej, dwie dla Kuriera) oparte na tzw. płaskiej stawce, czyli na stałej kwocie, którą podamy dla każdej wysyłki.

Wejdź do panelu administracyjnego WordPressa, a następnie z menu bocznego wybierz „WooCommerce > Ustawienia”. W ustawieniach WooCommerce przejdź do zakładki „Wysyłka”.

WooCommerce - dodaj nową strefę wysyłki dla Polski

Pojawi się tu okno tworzenia nowej strefy wysyłkowej (domyślnie jest tylko jedna strefa o nazwie „Reszta świata” – możemy ją zignorować). Tworzymy nową strefę o nazwie „Polska” i przypisujemy jej obok region „Polska”. Potwierdzamy strefę przyciskiem „Zapisz zmiany”. Wszystkie metody wysyłki dodane do tej strefy będą obowiązywały klientów, którzy dokonują zakupów w Polsce.

Wejdź do utworzonej strefy wysyłkowej „Polska”.  Zauważysz, że póki co jest ona pusta, gdyż nie zdefiniowano w niej jeszcze żadnych metod płatności dla osób zamawiających z Polski.

WooCommerce - pusta strefa wysyłkowa

W dolnym prawym rogu kliknij przycisk „Dodaj metodę wysyłki”. Jako typ dostawy wybierz „Płaska stawka” i kliknij dodaj. Powtórz to kilka razy, aby dodać cztery warianty dostawy opartej na stałej kwocie (dwie dla Poczty Polskiej i dwie dla Kuriera).

Dodawanie nowej metody wysyłki (Płaska stawka)
WooCommerce - cztery płaskie stawki

Na liście wyświetlają się teraz cztery pozycje o nazwie „Płaska stawka”. Musisz teraz edytować wszystkie pozycje „Płaska stawka” i ustawić im odpowiednie nazwy w zależności od dostawcy, wyłączyć opodatkowanie oraz wpisać odpowiedni koszt wysyłki dla danej kombinacji.

W moim przypadku będzie to wyglądać następująco:

  • Poczta Polska (płatne z góry) – 10 zł
  • Poczta Polska (za pobraniem) – 12 zł
  • Kurier (płatne z góry) – 14 zł
  • Kurier (za pobraniem) – 16 zł

Kliknij w przycisk „Edytuj” obok danej pozycji z płaską stawką, a następnie w nowym oknie wpisz odpowiednią nazwę dla kombinacji wysyłki/płatności, wyłącz opodatkowanie, a następnie podaj kwotę wysyłki dla danej kombinacji. Powtórz to dla każdej pozycji z płaską stawką, aż ustawisz wszystkie potrzebne kombinacje.

WooCommerce - edycja płaskiej stawki

Po wszystkim kliknij w przycisk „Zapisz zmiany”. Pierwszą część poradnika i pierwszy problem mamy za sobą. Klient podczas finalizacji zamówienia ma do wyboru cztery metody dostawy, które mają przypisane odpowiednie kwoty w zależności od sposoby płatności.

woocommerce-skonfigurowane-metody-wysylki

Występuje jednak wspomniany wcześniej problem – pomimo tego, że klient wybierze np. „Kurier (płatne z góry)”, to w następnym kroku może i tak wybrać płatność przy odbiorze. Musimy zatem wykonać następny krok, czyli wprowadzić ukrywanie określonych metod płatności na podstawie wybranej wysyłki.

Krok 2: Parowanie metod dostawy ze sposobami płatności

Jak wcześniej wspomniałem, najprostszym sposobem jest skorzystanie z płatnej wtyczki z serwisu WP Desk – Aktywne płatności, która oferuje po prostu zaznaczenie i odznaczenie wybranych sposobów płatności dla danej metody wysyłki. Jest to dziecinnie proste i zajmuje kilka sekund – wystarczy np. dla Kuriera i Poczty Polskiej (za pobraniem) odznaczyć płatności przelewem, a dla Kuriera i Poczty Polskiej (płatne z góry) odznaczyć opcje płatności przy odbiorze.

Ja jednak obiecałem wam pokazać, jak to zrobić za darmo za pomocą dość prostego kodu PHP i tej obietnicy mam zamiar się trzymać. Jeśli nie chcecie kupować wtyczki, to możecie stworzyć prosty skrypt PHP, oparty na funkcji „if/else” (jeśli X to Y), który będzie sprawdzał, jaka metoda dostawy jest aktualnie zaznaczona, po czym będzie ukrywał te sposoby płatności, który są dla niej nieodpowiednie. Pora więc na małą lekcję PHP dla zielonych (nie martwcie się, nie będzie ciężko).

W tym celu skorzystamy z poniższego skryptu PHP, stworzonego przez użytkownika Jeroen Sormani.

Aktualizacja: 02.02.2018 r. – poniższy skrypt został zaktualizowany, aby wyeliminować problem ze znikającą zawartością sekcji “Wygląd > Menu” w panelu administracyjnym WordPressa. Jeśli występuje u Ciebie ten problem, to sprawdź swoją aktualnie używaną funkcję i zaktualizuj ją o poniższy kod.

/**
 * Filter payment gateways
 */
function my_custom_available_payment_gateways( $gateways ) {
	$chosen_shipping_rates = ( isset( WC()->session ) ) ? WC()->session->get( 'chosen_shipping_methods' ) : array();

		if ( in_array( 'flat_rate:1', $chosen_shipping_rates ) ) :
		unset( $gateways['cod'] );
		
		elseif ( in_array( 'flat_rate:2', $chosen_shipping_rates ) ) :
		unset( $gateways['bacs'] );
		
		elseif ( in_array( 'flat_rate:3', $chosen_shipping_rates ) ) :
		unset( $gateways['cod'] );
		
		elseif ( in_array( 'flat_rate:4', $chosen_shipping_rates ) ) :
		unset( $gateways['bacs'] );

	endif;
	return $gateways;
}
add_filter( 'woocommerce_available_payment_gateways', 'my_custom_available_payment_gateways' );

Jeśli wszystkie metody dostawy skonfigurowałeś identycznie jak ja, to nie musisz do powyższego kodu wprowadzać już jakichkolwiek zmian. Domyślnie jest on ustawiony tak, że dla metod wysyłki za pobraniem ukrywa on płatność przelewem, a z kolei dla metod wysyłki opartych na przelewie ukrywa on płatność za pobraniem.

Prawdopodobnie jednak będziesz mieć inne metody wysyłki lub będzie ich więcej, dlatego pokażę Ci, jak zmodyfikować ten skrypt na swoje potrzeby. Interesują nas linie pogrubione, a konkretnie to elementy podświetlone na zielono i niebiesko. Skrypt działa prosto – dla danej metody wysyłki (zielony tekst) ukrywa dany sposób płatności (niebieski tekst). Działa to po prostu na zasadzie „jeśli zaznaczona jest wysyłka X, to ukrywaj płatność Y”.

  • Rozłożenie skryptu na elementy pierwsze

Elementy podświetlone na zielono to metody wysyłki, które skonfigurowaliśmy w pierwszym kroku. Nazywają się one flat_rate, gdyż jest to ustawiona przez nas „Płaska stawka”. Z kolei cyferka, która stoi obok flat_rate to pozycja danej metody wysyłki na liście w ustawieniach wysyłek. Przykładowo, flat_rate:2 to druga metoda wysyłki oparta na płaskiej stawce – w naszym wypadku Poczta Polska (za pobraniem).

W WooCommerce znajdziemy trzy typy identyfikatorów dla metod wysyłek. Są to:

  • flat_rate – płaska stawka
  • local_pickup – odbiór osobisty
  • free_shipping – darmowa dostawa

Jeśli w przyszłości dodamy sobie np. jedną metodę wysyłki typu Odbiór osobisty i zechcemy dla niej ustawić jakąś regułę, to w skrypcie będzie ona miała identyfikator local_pickup:1.

Elementy podświetlone na niebiesko, to sposoby płatności, które są ukrywane dla danej metody wysyłki. Przykładowo, „cod”, to skrót od „cash on delivery”, czyli „płatność za pobraniem”.

W WooCommerce znajdziemy cztery typy identyfikatorów dla sposobów płatności. Są to:

  • cod – płatność przy odbiorze
  • bacs – płatność zwykłym przelewem
  • cheque – płatność czekiem
  • paypal – płatność PayPalem

Skrypt zaczyna nabierać sensu, prawda? Jeśli zatem się przyjrzymy określonym fragmentom, to wszystko stanie się niesamowicie proste. Spójrzmy np. na poniższy fragment:

elseif ( in_array( 'flat_rate:4', $chosen_shipping_rates ) ) :

unset( $gateways['bacs'] );

Widzimy od razu, że fragment ten sprawia, że gdy wybrana jest opcja flat_rate:4, czyli Kurier (za pobraniem), to ukrywana jest opcja płatności bacs, czyli przelew bankowy. Jeśli chcecie dodać nowe elementy i jeszcze więcej rzeczy poukrywać, to wystarczy, że skopiujecie powyższy fragment i wkleicie go wśród pozostałych, a następnie zmienicie zielone i niebieskie pola na odpowiednie nazwy metod wysyłek i płatności. Przykładowo, jeśli dla odbioru osobistego (local_pickup:1) chcielibyśmy wyłączyć płatność przy odbiorze (cod), tak, aby oferować tylko odbiór osobisty po przedpłacie na konto, to wystarczy, że dodacie poniższy fragment:

elseif ( in_array( 'local_pickup:1', $chosen_shipping_rates ) ) :

unset( $gateways['cod'] );

W ten sposób, gdy ktoś zaznaczy „Odbiór osobisty”, to opcja płatności przy odbiorze zniknie i klient będzie mógł wybrać tylko płatność z góry. W ten sposób możecie stworzyć nieskończoną ilość kombinacji i ukrywać określone metody płatności dla konkretnych sposobów wysyłek.

W jakim pliku umieścić gotowy skrypt na ukrywanie sposobów płatności?

Skrypt ten należy umieścić w pliku „functions.php”, który znajduje się w katalogu z twoim aktualnie uaktywnionym motywem. Można to zrobić bezpośrednio w tym pliku, logując się na serwer FTP ze swoim sklepem. Ma to jednak poważny minus – jeśli twój motyw aktualizuje się samodzielnie do nowszej wersji, to aktualizacja usunie twoje wpisy z pliku functions.php.

Dlatego przed wprowadzeniem kodu PHP do pliku functions.php należy utworzyć motyw potomny. Dzięki temu nasze własne modyfikacje będą oddzielone od oryginalnych plików motywu i przetrwają aktualizacje nadrzędnego motywu.

Zaloguj się na serwer FTP, a następnie przejdź do poniższej ścieżki:

wp-content/themes/

W środku znajdziesz katalogi ze swoimi zainstalowanymi motywami. Znajdź w tym miejscu folder ze swoim motywem potomnym. Otwórz go i wyszukaj pliku “functions.php”. Skopiuj go na dysk twardy, a następnie otwórz za pomocą Notatnika, Notepad++ bądź innego ulubionego edytora tekstowego.

WooCommerce - wklej skrypt do pliku Functions.php

Na samym końcu tego pliku dopisz gotowy skrypt, zapisz plik, a następnie prześlij go ponownie na serwer, nadpisując stary plik. Pamiętaj, że wszystkie zmiany użytkownika zostają usunięte przy każdej aktualizacji i będziesz musiał je wprowadzać za każdym razem, gdy szablon zostanie zaktualizowany do nowszej wersji. Jeśli nie chcesz tego robić, to skorzystaj z metody dodawania swoich funkcji za pomocą odpowiedniej wtyczki (np. My Custom Functions opisanej powyżej).


Szukasz sprawdzonego hostingu dla swojego sklepu na WordPressie? Sprawdź ofertę LH.pl i bezpłatnie przetestuj dowolny pakiet hostingowy.

Poradnik WordPress
Darmowy kurs WooCommerce
Artykuł odpowiedział na twoje pytanie? Udostępnij go dalej:
Obrazek domyślny
Błażej Starosta
Ma doświadczenie w tworzeniu oraz prowadzeniu stron WWW, od blogów aż po sklepy internetowe. Od lat uważnie śledzi rozwój WordPressa i jego wpływ na rynek twórców stron internetowych. Stara się być na bieżąco ze wszystkimi nowinkami technologicznymi i dzielić się swoją wiedzą.

79 komentarzy

  1. Witam.
    Niestety u mnie kod nie działa nie rozumiem w czym problem więc będę wdzięczny za pomoc

  2. “Nie działa” to bardzo szerokie pojęcie i ciężko coś z tego wywnioskować 😉 Potrzebuję więcej informacji, aby spróbować pomóc. Na pierwszy rzut stawiałbym, że źle oznaczyłeś swoje metody wysyłki w kodzie lub coś jest po prostu nie tak ze składnią w pliku functions.php.

    Jak możesz, to zrób dwa zrzuty ekranu i wklej je do komentarza za pomocą funkcji dodawania obrazków. Na pierwszym zrzucie ekranu zamieść widok z panelu administracyjnego WordPressa, tak, aby było widać ustawione przez Ciebie formy wysyłki / płatności. Na drugim zrzucie ekranu pokaż zawartość pliku, do którego wkleiłeś kod PHP (najlepiej od początku do końca).

  3. Najprościej sprawdzić w źródle strony. Przejdź jako klient do sklepu i przejdź do zamówienia. Na stronie zamówienia, tam, gdzie możesz wybrać sposób dostawy kliknij prawym przyciskiem myszy i wybierz opcję pokazywania źródła strony w przeglądarce. Z przybornika źródła wybierz opcję zaznaczania elementu i zaznacz całe pole z wysyłką, która jest zarządzania przez Flexible Shipping. W źródle strony zaznaczy Ci się pole “input” odpowiedzialne za tę wysyłkę. W wartości “value” masz nazwę, którą musisz wpisać do kodu (jak widać na załączonym zrzucie ekranu w moim wypadku jest to flexible_shipping_2_1). https://uploads.disquscdn.com/images/58e6ebfd474b445f91fa46cfe49f8f0fa67af0287978166ddc47cb0ced51449e.png

  4. Spróbuj zalogować się przez FTP do swojego serwera, otwórz plik functions.php i usuń z niego dodany skrypt. Zobacz, czy wszystko będzie działać.

    Obstawiam, że powodem może być problem ze składnią PHP. Prawdopodobnie twórca motywu zamknął kod PHP w dokumencie Functions.php na końcu klamrą “” i ty wkleiłeś czysty kod pod spodem. To trochę tak, jakby wkleić kod HTML poza klamrami “” oraz “”. Mogło dojść też do kilku innych potknięć podczas wklejania. Często wystarczy usunąć jeden znak, aby cały kod był źle interpretowany.

    Jak możesz, to wklej całą zawartość swojego pliku functions.php w serwisie typu PasteBin.com i wklej link albo zrób zrzuty ekranu z całego dokumentu i dołącz je do komentarza. Wtedy będę w stanie Ci pomóc, bo ewidentnie jest to problem ze składnią i prawdopodobnie teraz cała zawartość tego pliku nie jest odczytywana.

  5. Jak to mówią najstarsi górale z pod Sosnowca: “You made my day BRO” Dzięki)

  6. Super – działa prawie wszystko. Nie wiem jak wykluczyć dla wysyłki pobraniowej dwóch metod płatności
    ‘bacs’ i ‘transferuj’

  7. Bacs to bank transfer, czyli płatność przelewem. W artykule robimy dokładnie to, o co prosisz, czyli wykluczamy płatność przelewem dla wysyłki pobraniowej. Zakładając, że zrobiłeś np. metodę wysyłki na płaskiej stawce o nazwie “Kurier (pobranie)” i ma ona oznaczenie “flat_rate:2”, to dla niej wykluczasz po prostu metodę płatności “bacs”. Odpowiada za to ten fragment kodu:

    elseif ( in_array( ‘flat_rate:2’, $chosen_shipping_rates ) ) :

    unset( $gateways[‘bacs’] );

    Być może masz źle oznaczoną wysyłkę pobraniową w pliku functions.php, skoro działa Ci tylko dla niektórych metod płatności? Musialbym zobaczyć twój kod z functions.php, żeby zweryfikować, co jest nie tak, że dla niektórych metod to działa, a dla innych nie. Metody wysyłki stworzyłeś wszystkie na płaskiej stawce? Możesz wkleić kod z functions.php do serwisu pastebin.com i wrzucić tu link.

  8. Chyba niejasno się wyraziłem. Dla wysyłki pobraniowej działa albo ‘bacs’ albo ‘transferuj’, a potrzebuję, żeby dla tej metody wysyłki wykluczyć jednocześnie obydwie.
    Chodzi o ten fragment kodu:

    elseif ( in_array( ‘flat_rate:6’, $chosen_shipping_rates ) ) :

    unset( $gateways[‘transferuj’] );

    To działa, ale potrzebuję, żeby działało również dla drugiej płatności, jakby powtórzenie kodu:

    elseif ( in_array( ‘flat_rate:6’, $chosen_shipping_rates ) ) :

    unset( $gateways[‘bacs’] );

  9. A rozumiem, chcesz ukryć więcej niż jedną metodę płatności dla jednej metody wysyłki. W takim razie musisz powtórzyć fragment kodu zaczynający się od “unset”. Przykład na podstaiwe tego, co napisałeś wyżej:

    elseif ( in_array( ‘flat_rate:6’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘transferuj’] ); unset( $gateways[‘bacs’] );

    Powyższa opcja ukrywa metodę płatności przez transferuj i płatności przelewem (bacs) dla szóstej płaskiej stawki. Sprawdziłem to u siebie na testowym WordPressie, ukrywając tą samą metodę płatność przelewem i za pobraniem jednocześnie i poszło bez problemu 🙂

  10. taa taam 🙂 czyli gra i buczy. Wielkie dzięki. Oznaczenia już wcześniej sprawdziłem (dzięki wyjaśnieniom w komentarzu) nie znam php na tyle, żeby wiedzieć jaką składnię do tego co potrzebowałem zastosować. Jeszcze raz dzięki.

  11. Witam,
    pojawił się pewien problem. Kiedy nie jestem zalogowany, przy płatnosciach pojawia się to:

    Warning: in_array() expects parameter 2 to be array, null given in /wp-content/themes/satori/functions.php on line 308

    Warning: in_array() expects parameter 2 to be array, null given in /wp-content/themes/satori/functions.php on line 311

    Warning: in_array() expects parameter 2 to be array, null given in /wp-content/themes/satori/functions.php on line 314

    Warning: in_array() expects parameter 2 to be array, null given in /wp-content/themes/satori/functions.php on line 317

    Płatności wyświetlają się poprawnie.
    Taki sam komunikat pojawia się po zalogowaniu na stronie sklepu “Moje konto”

  12. Czy ten błąd znika, gdy usuniesz kod PHP odpowiedzialny za ukrywanie metod płatności? Jak możesz, to otwórz plik functions.php za pomocą programu NotePad++ i sprawdź linie od 308 do 317. Czy w tych liniach jest wpisany kod do ukrywania płatności, czy też może są tam jakieś inne wpisy?

  13. to jest dokładnie ten kod:

    if ( in_array( ‘flat_rate:1’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:6’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘transferuj’] ); unset( $gateways[‘bacs’] );

    elseif ( in_array( ‘free_shipping:5’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:3’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    ukrywanie płatności działa pomimo komunikatu, który też nie zawsze się pojawia. Dziś bez logowania się nie pojawił, po zalogowaniu i wylogowaniu, już tak

  14. Ja mam zgryz z wtyczkami WooCommerce Conditional Shipping and Payments i WooCommerce Table Rate Shipping.
    W Table Rate zdefinoiwane dwie opcje wysyłki – 1: poczta i kurier, 2 pobraniowa. W conditionalu zaś utworzone 3 reguły – dla poczty i kuriera przypisany odpowiedni table rate i wykluczona metoda pobraniowa, zaś dla pobrania przypisany adekwatny TR i wykluczone inne metody poza pobraniem.
    Problem jest taki, że w zamówieniu po wyborze wysyłki za pobraniem wyskakuje błąd informujący o niedostępności płatności przelewem. W dodatku jak by poprzedni wybór stosowało do aktualnego – więc jak następnie kliknę na wysyłke poczta, to mam błąd niedostepności zapłaty przy odbiorze. Ale jak ponownie zmienie na kuriera, to jest ok – bo poprzednim wyborem była poczta. Natomiast jak wybiorę za pobraniem, to znowu błąd i dla kolejnego wyboru również.

    Myśl była taka, by zastosowac opisaną tu metodę, tylko zamiast flat_rate:x u mnie jest wówczas dla poczty table_rate:2:2, dla kuriera table_rate:2:3 i dla pobrania table_rate:4:8. Dla wysyłek daję unset na cod, dla pobrania bacs albo wszystko poza cod – problem nie znika. Co może byc grane?
    O dziwo po aktywacji wtyczki Aktywne Płatności z WP Desk komunikat z ostrzezeniem znika i formularz wydaje się działać ok. Co ciekawe, wartość chosen_shipping_methods jest identyczna przy wtyczce aktywnych płatności jak i bez. Jakiś pomyśł, co może być grane?

  15. Witam, Jak wklejam kod to strona przestaje działać – “pusta strona”
    Nie ma znaczenia czy wkleję kod na końcu czy w środku. Wklejany kod to:
    ———————————————————————————————————————–
    /**
    * Filter payment gateways
    */
    function my_custom_available_payment_gateways( $gateways ) {
    $chosen_shipping_rates = WC()->session->get( ‘chosen_shipping_methods’ );

    if ( in_array( ‘flexible_shipping_3_1’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flexible_shipping_3_3’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’] ); unset( $gateways[‘przelewy24’] );

    elseif ( in_array( ‘flexible_shipping_3_4’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flexible_shipping_3_2’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’] ); unset( $gateways[‘przelewy24’] );

    endif;
    return $gateways;
    }
    add_filter( ‘woocommerce_available_payment_gateways’, ‘my_custom_available_payment_gateways’ );
    ————————————————————————————————————————

    Jakiś pomysł dlaczego tak się dzieje?

  16. Poradziłem sobie z ukryciem One Click.
    Musiałem usunąć pierwszy warunek elseif.
    Ale nadal pokazuje mi się płatność Dotpay.

  17. A co gdy mam na sklepie produkty “małe” ze stawką1 za płatność z góry i pobranie oraz “duże” ze stawką2. Da się to jakoś rozgraniczyć aby klient w koszyku nie musiał sam decydować czy chce:
    -pobranie za “mały”
    -płatność z góry za “mały”
    -pobranie za “duży”
    -płatność z góry za “duży” ?

  18. Użyłem tego kodu w moim motywie potomnym. Co do zakresu swojej funkcji działa tak jak powinno. Niestety wykracza poza swój zakres i powoduje błędy.
    1. Sprawia że przestaje działać wtyczka Max Mega Menu
    2. Nie działa edytor menu
    3. Nie chce się generować mapa XML, system nadaje komunikat błędu:
    “This page contains the following errors:
    error on line 2 at column 6: XML declaration allowed only at the start of the document
    Below is a rendering of the page up to the first error.”

    Może szkody są większe lecz to zauważyłem od razu. Po usunięciu kodu z function.php wszystko wraca do normy.

    To jest dokładnie co dodałem:

    function my_custom_available_payment_gateways( $gateways ) {
    $chosen_shipping_rates = WC()->session->get( ‘chosen_shipping_methods’ );

    if ( in_array( ‘flat_rate:1’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:2’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’] );

    elseif ( in_array( ‘flat_rate:3’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:4’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘local_pickup:5’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘free_shipping:6’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘free_shipping:7’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’] );

    endif;
    return $gateways;
    }

    add_filter( ‘woocommerce_available_payment_gateways’, ‘my_custom_available_payment_gateways’ );

    Jakieś pomysł? Help!

  19. Witam. widoczny mam w Panelu Moje konto po zalogowaniu następujący błąd:
    Warning: in_array() expects parameter 2 to be array, null given in /public_html/wp-content/themes/functions.php
    on line 48Warning: in_array() expects parameter 2 to be array, null given in /public_html/wp-content/themes/functions.php on line 51

    Jest to dokładnie :
    if ( in_array( ‘flat_rate:4’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:2’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’] );

    Czy ktoś pomoże mi zlikwidować ten błąd? Dodam, że ukrywanie działa na stronie poprawnie. Flat_rat:4 to wysyłka z płaską stawką 0zł (darmowa) natomiast flat_rate:2 to pobranie.

  20. Uwaga, kod jest źle napisany, nie stanowi rozwiązania, wprowadza liczne błędy na stronie.
    Jak się okazuje sprawy tej nie można rozwiązać dodając kilka linijek kodu, w ten sposób można tylko zaszkodzić.

  21. Wiele gotowych sklepów internetowych, takich jak Prestashop czy WooCommerce, ma jeden poważny problem z dostosowaniem ich na potrzeby polskiego rynku. Chodzi o ustawienie metod wysyłki i przypisanie ich do konkretnych metod płatności. Wszyscy wiemy, że wysyłka produktu za pobraniem jest droższa, niż wysyłka produktu opłaconego wcześniej z góry. W związku z tym koszt dostawy musi się zmieniać w zależności od tego, czy klient wybierze płatność przy odbiorze, czy też zapłaci za zamówienie z góry (przelewem lub płatnością online). WooCommerce jednak na to domyślnie nie pozwala.

  22. Niestety przeniesienie powyższej zasady na realia sklepów internetowych opartych na WooCommerce (a także np. na Prestashop) jest domyślnie niemożliwe. Wynika to z tego, że twórcy po prostu takiej funkcji nie zaimplementowali i domyślnie działanie tych sklepów jest takie, że klient wybiera np. dostawę kurierem, a dopiero w następnym kroku wybiera sposób płatności.. Problem polega na tym, że koszt dostawy jest przypisany na stałe dla danej metody wysyłki (np. dla kuriera) i nie ma możliwości wprowadzenia modyfikacji tej kwoty na podstawie sposobu płatności (np. zwiększenia kosztu paczki kurierskiej po wybraniu płatności za pobraniem), gdyż te dwie rzeczy nie są po prostu ze sobą mechanicznie powiązane w skrypcie WooCommerce.

  23. Mam problem z darmową dostawą zaznacza mi płatność przelewem ale popranie nie znika

    function my_custom_available_payment_gateways( $gateways ) {
    $chosen_shipping_rates = WC()->session->get( ‘chosen_shipping_methods’ );

    if ( in_array( ‘flat_rate:1’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:2’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’] );

    elseif ( in_array( ‘flat_rate:3’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:4’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’] );

    elseif ( in_array( ‘flat_rate:5’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:6’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’] );

    elseif ( in_array( ‘free_shipping:1’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    endif;
    return $gateways;
    }

  24. Zrobiłem dokładnie tak jak jest w opisie. Wkleiłem kod bezpośrednio w wordpress’ie do pliku functions.php (do motywu potomnego shoopkeeper’a) zaktualizowałem i nic. nie zadziałał ten skrypt 🙁 Generalnie nic mi się nie wiesza, nie mam komunikatów o błędzie.

  25. mam takie zagadnienie.
    Na bazie free shipping lub local pickup tworzę opcję odbioru osobistego. Ukrywam wszystkie formy płatności (przelew zwykły, pobranie, przelewy24) i wywala mi takim komunikatem: Przykro nam, ale dla Twojego regionu nie jest udostępniona żadna
    metoda płatności. Prosimy skontaktuj się z nami, jeśli potrzebujesz
    wyjaśnień lub chcesz omówić alternatywne sposoby płatności.

    No i nie da się sfinalizować zamówienia w takim przypadku. Czy jest na to jakiś sposób?

  26. Pojawia się problem z My Account po zalogowaniu na konto a przed przejściem do zamówienia:

    Warning: in_array() expects parameter 2 to be array, null given in /home/hewra/public_html/bellamo/wp-content/themes/flatsome-child/functions.php on line 10

    Warning: in_array() expects parameter 2 to be array, null given in /home/hewra/public_html/bellamo/wp-content/themes/flatsome-child/functions.php on line 14

    Czy coś z tym można zrobić? Jakiś wyjątek wprowadzić?

  27. Ja rozwiązałem ten problem w inny sposób.
    Ustawiłem Odbiór osobisty dla wysyłek w których klient ma dokonać przelewu, (ponazywałem tak jak było w płaskiej stawce, kurier 15 PLN itp), w tej opcji za pobraniem jest schowane. Wówczas nie ma możliwości jej wyboru.
    Płaską stawkę dałem tylko dla wysyłek za pobraniem.

  28. Rozwiązałeś częściowo, jedynie dla przesyłek przedpłaconych. Klient wybierający płatność za pobraniem nadal będzie mieć do wyboru dwie bramki płatności.

  29. Żaden ze mnie ekspert z PHPa, ani WordPressa. Najlepiej jakby autor wpisu się wypowiedział dlaczego ten kod wykonuje się w Kokpicie. Szybki fix, to dodanie do każdego if-a kodu “!empty($chosen_shipping_rates) &&” albo przed pierwszym if-em inicjalizacja nieistniejącej zmiennej “$chosen_shipping_rates = array();”

  30. Zmieniamy linijke:

    $chosen_shipping_rates = WC()->session->get( ‘chosen_shipping_methods’ );

    na:

    $chosen_shipping_rates =(array) WC()->session->get( ‘chosen_shipping_methods’ );

    I DZIAŁA.

  31. Należy dodać warunek if !is_admin i problem znika – ponizej kod z warunkiem:

    function custom_available_payment_gateways( $gateways ) {
    if(!is_admin()){
    $chosen_shipping_rates = WC()->session->get( ‘chosen_shipping_methods’ );

    if ( in_array( ‘flat_rate:2’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:4’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:6’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’] );
    unset( $gateways[‘payu’] );

    elseif ( in_array( ‘flat_rate:7’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’] );
    unset( $gateways[‘payu’] );

    endif;
    }
    return $gateways;
    }

  32. Już działa, faktycznie ta linia powodowała błąd. Należy ją zmienić na:

    $chosen_shipping_rates = ( isset( WC()->session ) ) ? WC()->session->get( ‘chosen_shipping_methods’ ) : array();

    Wtedy działa wszystko na stronie i w sekcji “Wygląd > Menu”. Zostało to uwzględnione w poradniku.

  33. Rozwiązałem ten problem i zaktualizowałem poradnik. Należy zmienić jedną linię w functions.php. Konkretnie to poniższą:

    $chosen_shipping_rates = WC()->session->get( ‘chosen_shipping_methods’ );

    na

    $chosen_shipping_rates = ( isset( WC()->session ) ) ? WC()->session->get( ‘chosen_shipping_methods’ ) : array();

    Cała reszta zostaje taka sama. Przetestowałem na najnowszym WordPressie i WooCommerce z domyślnym motywem StoreFront oraz na darmowym Shop Isle. Faktycznie w obu wypadkach pojawiał się błąd w opcji “Wygląd > Menu”, ale po zastosowaniu powyższej poprawki działa wszystko poprawnie.

  34. Mam problem pojawia mi się komunikat, wtedy osoba jest zalogowana

    Warning: in_array() expects parameter 2 to be array, null given in /home/klient.dhosting.pl/elegancki/elegancki.pl/public_html/wp-content/themes/xstore-child/functions.php on line 62

    Warning: in_array() expects parameter 2 to be array, null given in /home/klient.dhosting.pl/elegancki/elegancki.pl/public_html/wp-content/themes/xstore-child/functions.php on line 65

    Warning: in_array() expects parameter 2 to be array, null given in /home/klient.dhosting.pl/elegancki/elegancki.pl/public_html/wp-content/themes/xstore-child/functions.php on line 68

    Warning: in_array() expects parameter 2 to be array, null given in /home/klient.dhosting.pl/elegancki/elegancki.pl/public_html/wp-content/themes/xstore-child/functions.php on line 71

    Warning: in_array() expects parameter 2 to be array, null given in /home/klient.dhosting.pl/elegancki/elegancki.pl/public_html/wp-content/themes/xstore-child/functions.php on line 74

    kod

    function my_custom_available_payment_gateways( $gateways ) {
    $chosen_shipping_rates = ( isset( WC()->session ) ) ? WC()->session->get( ‘chosen_shipping_methods’ ) : array();

    if ( in_array( ‘flat_rate:1’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:2’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:3’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:5’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’] );

    elseif ( in_array( ‘local_pickup:9’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    endif;
    return $gateways;

    linia 62 to if ( in_array( ‘flat_rate:1’, $chosen_shipping_rates ) ) :, lina 65 to elseif ( in_array( ‘flat_rate:2’, $chosen_shipping_rates ) ) i tak dalej

    Z tego co się orientuje to brak jest zaznaczonego na początky wyboru. Co z tym poradzić.

  35. Cześć, niestety twój kod nie działa z Przelewami24, chcę na swoim sklepie mieć do wyboru tylko kurier opłacony i kurier pobranie, więc zmodyfikowałem twój kod na:
    /**
    * Filter payment gateways
    */
    function my_custom_available_payment_gateways( $gateways ) {
    $chosen_shipping_rates = ( isset( WC()->session ) ) ? WC()->session->get( ‘chosen_shipping_methods’ ) : array();

    if ( in_array( ‘flat_rate:1’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:2’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘przelewy24’] );

    endif;
    return $gateways;
    }
    add_filter( ‘woocommerce_available_payment_gateways’, ‘my_custom_available_payment_gateways’ );

    niestety nic to nie dało.
    Pomożesz jakoś?

  36. Szkoda że przy próbie wywołania kodu dla woocommerce Wersja 3.3.4 konczy się białym ekranem w panelu admina szukałem rozwiązania ale jakiś trafem nie udało mi się

  37. Drobna uwaga: kod pięknie działa na komputerze, ale w wersji responsywnej (na telefonie, https://prekognicja.pl/checkout/ ) pojawia się błąd:
    po przejściu do kasy, w sekcji “Twoje zamówienie” system wyświetla błędy:

    Warning: in_array() expects parameter 2 to be array, null given in /www/prekognicja/wp-content/plugins/my-custom-functions/inc/php/functional.php(85) : eval()’d code on line 7

    Warning: in_array() expects parameter 2 to be array, null given in /www/prekognicja/wp-content/plugins/my-custom-functions/inc/php/functional.php(85) : eval()’d code on line 10

    Warning: in_array() expects parameter 2 to be array, null given in /www/prekognicja/wp-content/plugins/my-custom-functions/inc/php/functional.php(85) : eval()’d code on line 13

    Też tak macie? Ktoś wie, jak to naprawić?

  38. Witam,
    Mam podobny problem z przelewami 24. Nie mogę ich usunąć dla płatności przy odbiorze oraz za pobraniem. A w kodzie na moje chłopskie oko jest wszystko dobrze. Ktoś może znalazł rozwiązanie? Może sam autor tego wpisu? Byłbym wdzięczny za pomoc.

    /**
    * Filter payment gateways
    */
    function my_custom_available_payment_gateways( $gateways ) {
    $chosen_shipping_rates = ( isset( WC()->session ) ) ? WC()->session->get( ‘chosen_shipping_methods’ ) : array();

    if ( in_array( ‘flat_rate:3’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:5’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’] );

    elseif ( in_array( ‘flat_rate:5’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘przelewy24’] );

    elseif ( in_array( ‘flat_rate:4’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘local_pickup:6’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    endif;
    return $gateways;
    }
    add_filter( ‘woocommerce_available_payment_gateways’, ‘my_custom_available_payment_gateways’ );

  39. Prawdopodobnie przelewy24 mają inne “ID bramki” i nie są widoczne w systemie jako “przelewy24” tylko jako coś innego. Z tego co widzę w dokumentacji, to mają one ID “przelewy24_payment”. Spróbuj zatem zmienić fragment “unset( $gateways[‚przelewy24’] );” na “unset( $gateways[‚przelewy24_payment’] );” i zobacz, czy działa.

  40. Niestety nie odznacza się ta opcja, wciąż widnieją przelewy 24 przy przesyłce pobraniowej oraz płatności przy odbiorze osobistym. Testowałeś może też te opcje? Masz jakieś inne pomysły? 🙂 Będę wdzięczny za pomoc.

  41. Made my day! Niedużo pracy a ile pieniędzy można zaoszczędzić. Jakby tak płacić za każdą wtyczkę do jakiegoś drobiazgu to by człowiek zbankrutował. Wielkie DZIĘKUJĘ 🙂

  42. Dodałbym do artykułu informację, że nie zawsze np. ‘flat_rate:3′ będzie odpowiadał temu co mamy u siebie.
    Aby sprawdzić co powinniśmy wprowadzić (chodzi głównie o cyfrę po flat_rate) najlepiej skorzystać z konsoli.
    Czyli wchodzimy na stronę zamówienia, klikamy PPM (Prawym przyciskiem myszy) -> zbadaj.
    Na zakreślonym elemencie szukamy id=’….’ i przepisujemy dany numer i podstawiamy w naszym kodzie (ten, który wrzucamy do functions.php).

  43. Skrypt działa fajnie ukrywając przelew czy pobranie, ale gdy ukrywam klasę “paypal”, to jest ona dalej widoczna. Jedynie znika polskie tłumaczenie opisu przycisku. Spotkałeś się z tym?

  44. Ukrycie metody płatności przelewy24 nie jest możliwe tym sposobem. Nie działa z ID przelewy24 ani przelewy24_payment

    elseif ( in_array( ‘flat_rate:2’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘przelewy24_payment’] );

  45. U mnie to wygląda tak:

    elseif ( in_array( ‘flat_rate:7’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’], $gateways[‘paypal’], $gateways[‘payu’] );

  46. Warning: in_array() expects parameter 2 to be array, null given in /wp-content/plugins/my-custom-functions/inc/php/functional.php(94) : eval()’d code on line 6

    Warning: in_array() expects parameter 2 to be array, null given in /wp-content/plugins/my-custom-functions/inc/php/functional.php(94) : eval()’d code on line 9

    Warning: in_array() expects parameter 2 to be array, null given in /wp-content/plugins/my-custom-functions/inc/php/functional.php(94) : eval()’d code on line 12

    Warning: in_array() expects parameter 2 to be array, null given in /wp-content/plugins/my-custom-functions/inc/php/functional.php(94) : eval()’d code on line 15

  47. Witam
    Ten kod wyświetla mi się w Moje Konto.
    Jak to naprawić ?

    Warning: in_array() expects parameter 2 to be array, null given in /wp-content/plugins/my-custom-functions/inc/php/functional.php(94) : eval()’d code on line 6

    Warning: in_array() expects parameter 2 to be array, null given in /wp-content/plugins/my-custom-functions/inc/php/functional.php(94) : eval()’d code on line 9

    Warning: in_array() expects parameter 2 to be array, null given in /wp-content/plugins/my-custom-functions/inc/php/functional.php(94) : eval()’d code on line 12

    Warning: in_array() expects parameter 2 to be array, null given in /wp-content/plugins/my-custom-functions/inc/php/functional.php(94) : eval()’d code on line 15

    pozdrawiam

  48. Działa jak talala, jestem laikiem ale dało radę w 3 godziny:) Powoli i dokładnie + czytanie ze zrozumieniem = sukces

  49. Witam,

    Używam tego kodu z powodzeniem na swoich stronach, super działa.
    Ostatnio użyłem innego motywu i na podglądzie strony gdy jestem zalogowany jako administrator mam w polu menu wyświetlane ostrzeżenia związane z wklejonym kodem typu

    Warning
    : in_array() expects parameter 2 to be array, null given in
    /home/gucio1/domains/domena.eu/public_html/wp-content/plugins/my-custom-functions/inc/php/functional.php(94) : eval()’d code

    …….. i tak dalej dla wszyskich pozycji

    Mam dodane { if(!is_admin()) ale ta funkcja nie działa.

    function my_custom_available_payment_gateways( $gateways ) { if(!is_admin()) {
    $chosen_shipping_rates = ( isset( WC()->session ) ) ? WC()->session->get( ‘chosen_shipping_methods’ ) : array();

    Ktoś ma pomysł jak wyłączyć te błędy w adminie?

  50. U mnie paypal pojawia się z racji osobnej wtyczki WooCommerce PayPal Checkout Gateway. Wystarczy ją wyłączyć.

  51. Ja właśnie przed chwilą wstawiłem kod i wszystko pięknie działa. Nie wiem, czy będą jakieś inne błędy przez modyfikację tej funkcji, czas pokaże.

    Chciałbym tylko napisać 2 ważne kwestie:
    -Nie zawsze opcja cods to płatność przy odbiorze, a bacs to przelew. U mnie było na odwrót.
    -Każdy rodzaj przesyłki może mieć inne oznaczenie flat_rate:x, niekoniecznie będzie to po kolei, jak w kodzie autora. Ja miałem po kolei 1,5,4,3 (4 rodzaje wysyłki)

  52. zmień na: unset( $gateways[‘przelewy24’], $gateways[‘nastepny_parametr_value’], itd );

  53. Witam,

    Powiedzcie mi proszę jak to wygląda kiedy klasa wysyłki ma być przypisana do płatności paypal i płatność z góry

  54. Panowie i Panie, jak nie znacie id bramki to patrzcie na liście metod płatności w klasy tabelki w adminie. To samo tyczy się kolejności metod wysyłki – u mnie była zamieniona, a okazało się że pięknie można ją wyciągnąć z klas na liście metod wysyłki 🙂

  55. Czy udało się komuś rozwiązać problem z “Warning: in_array() expects parameter 2 to be array, null given in ” pojawiający się po zalogowaniu na stronie “My Account” ? Widziałem w komentarzach powyżej, iż nie jestem jedyny.

  56. Dodaj małpe przed funkcją in_array()

    if ( @in_array( ‘flat_rate:1’, $chosen_shipping_rates ) ) :

  57. Super sprawa,

    dzięki za kod. Małe debugowanie co do nazw, bo strona używała innych metod i wszystko cacy 🙂

    Pozdrawiam

  58. Witajcie, ja również użyłem powyższego ale dodałem paczkomaty inpost i payU:

    /**
    * Filter payment gateways
    */
    function my_custom_available_payment_gateways( $gateways ) {
    $chosen_shipping_rates = ( isset( WC()->session ) ) ? WC()->session->get( ‘chosen_shipping_methods’ ) : array();

    if ( in_array( ‘free_shipping:1’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:2’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘flat_rate:5’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’ ], $gateways[‘payu’] );

    elseif ( in_array( ‘local_pickup:3’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    /** Ustawienia dla Paczkomaty */
    elseif ( in_array( ‘easypack_parcel_machines’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( in_array( ‘easypack_parcel_machines_cod’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’], $gateways[‘payu’] );
    /** KONIEC Ustawienia dla Paczkomaty */
    endif;
    return $gateways;
    }
    add_filter( ‘woocommerce_available_payment_gateways’, ‘my_custom_available_payment_gateways’ );

  59. U mnie dziła tak.. Dodaj przed każde in_array małpe @ … powinno być tak ( @in_array(

  60. Witam,
    Przestudiowałem dokładnie całą korespondencję, zastosowałem wszystkie uwagi, z inspektora ściągnąłem ID wysyłek i niestety tylko w jednym punkcie usuwa “za pobraniem” a przy reszcie zupełnie nie reaguje. Poniżej kod. Adres strony www.krainaaloesu-forever.pl
    /**
    * Usunięcie przesyłek bez pobrania w przypadku wybrania pobrania i na odwrót
    */

    function my_custom_available_payment_gateways( $gateways ) {
    $chosen_shipping_rates = ( isset( WC()->session ) ) ? WC()->session->get( ‘chosen_shipping_methods’ ) : array();

    if ( @in_array( ‘local_pickup:10’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( @in_array( ‘flat_rate:11’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( @in_array( ‘flat_rate:14’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( @in_array( ‘flat_rate:15’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( @in_array( ‘flat_rate:13’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( @in_array( ‘flat_rate:12’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( @in_array( ‘flat_rate:16’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘cod’] );

    elseif ( @in_array( ‘flat_rate:20’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’],$gateways[‘przelewy24’] );

    elseif ( @in_array( ‘flat_rate:17’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’],$gateways[‘przelewy24’] );

    elseif ( @in_array( ‘flat_rate:18’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’],$gateways[‘przelewy24’] );

    elseif ( @in_array( ‘flat_rate:19’, $chosen_shipping_rates ) ) :
    unset( $gateways[‘bacs’],$gateways[‘przelewy24’] );

    endif;
    return $gateways;
    }
    add_filter( ‘woocommerce_available_payment_gateways’, ‘my_custom_available_payment_gateways’ );
    Jest ktoś w stanie powiedzieć co jest nie tak?

  61. Update mojego poprzedniego komentarza:
    Zrobiłem czeski błąd w nawiasach wyżej w funkcji i funkcja nie była . Poprawiłem i teraz super działa dla pierwszych 7 metod dostawy, gdzie chciałem usunąć płatność za pobraniem i dla 4 pozostałych usuwa płatność przelewem i przelewy24 (o co mi chodziło).
    Ale również usunięta jest płatność za pobraniem (pojawia się komunikat, że nie jest dostępna żadna metoda.)
    Prośba o info co trzeba zrobić w takim wypadku?

  62. Powyższe komentarze do skasowania – poradziłem sobie. Okazało się, że wykluczyłem te formy dostawy w ustawieniach Płatności za pobraniem.
    Wielkie dzięki za artykuł i komentarze.

  63. jak by ktoś szukał poprawki dla przelwy i pobranie to działa:
    tylko flat rate ustaw swój

    elseif (@in_array( ‘flat_rate:3’, $chosen_shipping_rates ) ) :

    unset( $gateways[‘przelewy24’] ); unset( $gateways[‘bacs’] );

  64. Witam, artykuł pomocny, u mnie ukrywanie działa. Mam jednak odwrotny problem.
    Dodałem wtyczkę do Paczkomatów Inpostu.
    Po zaznaczeniu metody wysyłki: Paczkomat Inpost znika metody płatności Tpay (po zmianie na kuriera z przedpłatą metoda płatności się odsłania). Podobny problem mam przy opcji Darmowej wysyłki.
    Czy miał spotkał się ktoś z takim problemem – odsłaniania ukrytych metod w zależności od wysyłki. Czy dało by się zmodyfikować powyższy kod tak aby odsłaniał płatność?

  65. Witam,
    Czy może ktoś rozgryzł jak wyłączyć Przelewy24?
    Mam jeszcze pytanie, w momencie spełnienia warunku darmowej dostawy np 150 zl minimum, włącza się ta opcja w wyborze dostawy. Czy jest możliwe automatyczne wyłączenie innych metod dostawy?
    pozdrawiam
    Michał

  66. Hej, wyłączenie przelewy24 i zwykłego przelewu:

    unset( $gateways[‘bacs’], $gateways[‘przelewy24’]);

    Automatyczne wyłączenie innych metod dostawy:

    function hide_shipping_when_free_is_available( $rates, $package ) {
    // Only modify rates if free_shipping is present
    $free_shipping_rate_key = false;

    foreach ( $rates as $rate_key => $rate ) {
    $rate_key_exploded = explode( ‘:’, $rate_key );
    if ( $rate_key_exploded[0] === ‘free_shipping’ ) {
    $free_shipping_rate_key = $rate_key;
    }
    }

    if ( $free_shipping_rate_key ) {
    foreach ( $rates as $rate_key => $rate ) {
    if ( $rate_key !== $free_shipping_rate_key ) {
    unset( $rates[ $rate_key ] );
    }
    }
    }

    return $rates;

    }

    Nie jestem autorem kodu, znalezione w internecie.

  67. Witam,
    skorzystałem ze skryptu i fanie działa, mam jednak pytanie.
    Chce skorzystać również z pluginu Flexible Shipping gdyż chciałbym dodać opcję, gdzie powyżej jakiejś kwoty przesyłka będzie darmowa.
    Co powinienem dopisać do tego skryptu że w przypadku wyższej zdefiniowanej kwoty pojawia się informacja że przesyłka darmowa i pozostałe opcję znikają?

    z góry dziękuje za pomoc

    pozdrawiam
    Bartek

Możliwość komentowania została wyłączona.