<< powrót
Opublikowano 50 komentarzy

Jak ukryć metodę wysyłki dla danej klasy wysyłkowej w WooCommerce

Jak ukryć metodę wysyłki

W artykule tłumaczę jak ukryć metodę wysyłki dla danej klasy wysyłkowej. Umiejętność ta może się przydać w przypadku, gdy w sklepie sprzedajemy produkty, które z uwagi na duże rozmiary lub specyfikę nie zawsze mogą zostać wysłane poprzez danego przewoźnika. Przykładowo mamy sklep wielobranżowy i sprzedajemy także produkty o bardzo dużych gabarytach. Oferujemy m.in. wysyłkę kurierem DPD i do paczkomatów InPost. Mniejsze artykuły bez problemu możemy wysłać do paczkomatów lub kurierem. Jednak produkty o większych rozmiarach nie zmieszczą się do paczkomatów i mogą zostać wysłane tylko kurierem.

Właśnie w takim przypadku dobrze jest dla takich produktów ukryć wysyłkę do paczkomatów, tak żeby klient jej nie widział i nie mógł jej wybrać. Zadanie to możemy zrealizować, wykorzystując klasy wysyłkowe.

Z uwagi na duże zainteresowanie artykułem, postanowiłam go nieco przebudować (data aktualizacji: 23.05.21 r.). Mam nadzieję, że po zmianach artykuł stał się bardziej przejrzysty i przydatny. Dajcie znać w komentarzu 🙂

Czym są klasy wysyłkowe

Klasy wysyłkowe służą do grupowania produktów według kosztów wysyłki. Przykładowo mamy 3 klasy wysyłkowe:

  • Małe paczki.
  • Średnie paczki.
  • Duże paczki.

Produkty, którym przypiszemy tę samą klasę wysyłkową, będą mieć taką samą cenę wysyłki.

Aby utworzyć nową klasę wysyłkową, wybierz WooCommerce -> Ustawienia -> Wysyłka -> Klasy wysyłkowe i kliknij przycisk Dodaj nową klasę wysyłkową

WooCommerce - jak ukryć metodę wysyłki dla danej klasy wysyłkowej

Klasy wysyłkowe można także wykorzystać do wykluczania metod wysyłki, czym zajmiemy się w tym artykule.

Jak dodać klasę wysyłkową do produktów

Po utworzeniu klas wysyłkowych należy przypisać je do produktów. Można to wykonać dla dwa sposoby: poprzez szybką edycję produktu, albo przechodząc do jego edycji.

WooCommerce - jak ukryć metodę wysyłki dla danej klasy wysyłkowej
WooCommerce - jak ukryć metodę wysyłki dla danej klasy wysyłkowej
WooCommerce - jak ukryć metodę wysyłki dla danej klasy wysyłkowej

1. Przypadek 1 – wykluczamy jedną metodę wysyłki dla jednej klasy wysyłkowej

Założenie

Oferujemy 4 metody dostawy:

  • Paczkomaty InPost
  • Kurier InPost
  • Kurier DPD
  • Odbiór osobisty

W sklepie sprzedajemy różnej wielkości artykuły, z których niektóre z uwagi na swoje większe gabaryty nie mogą zostać wysyłane do paczkomatów. Przykładowo takim produktem jest zestaw mebli ogrodowych.

Tworzymy klasę wysyłkową, którą nazwiemy Duży gabaryt i przypiszemy ją do produktu z zestawem mebli ogrodowych.

WooCommerce - jak ukryć metodę wysyłki dla danej klasy wysyłkowej

Dla tej klasy wysyłkowej będą widoczne poniższe metody wysyłki:

  • Kurier InPost
  • Kurier DPD
  • Odbiór osobisty

Czyli ukrywamy wysyłkę do paczkomatów InPost dla klasy wysyłkowej „Duży gabaryt”.

Dodajemy filtr do pliku functions.php

Plik functions.php znajdziesz w folderze z motywem: wp-content -> themes -> Twój motyw.

Skopiuj poniższy kod i wklej do pliku funtions.php:


add_filter( 'woocommerce_package_rates', 'fanka_kodowania_hide_shipping_method', 10, 2 );

function fanka_kodowania_hide_shipping_method( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    /*****************KLASA WYSYŁKI**************************/
    $class1 = 36;
    /********************************************************/

    /*****************METODA WYSYŁKI*************************/
    $method_key_ids = array('flat_rate:3');
    /********************************************************/

    foreach( $package['contents'] as $item ) {

        if( $item['data']->get_shipping_class_id() == $class1 ){
            foreach( $method_key_ids as $method_key_id ){
                unset($rates[$method_key_id]);
            }
        }
    }
    return $rates;
}

Do powyższego kodu będziesz musiał dodać ID klasy wysyłki oraz ID metody wysyłki.

Szukamy ID klasy wysyłki

ID klasy wysyłki znajdziesz, przechodząc do panelu: WooCommerce -> Ustawienia -> Wysyłka -> Klasy wysyłkowe.

Następnie kliknij prawym przyciskiem myszy na daną klasę wysyłkową. W tym przypadku jest to klasa Duży gabaryt, ponieważ to właśnie dla niej chcemy ukryć wysyłkę do paczkomatów. Po kliknięciu zostanie rozwinięte menu. Jeśli korzystasz z przeglądarki Firefox lub Chrome wybierz Zbadaj.

WooCommerce - jak ukryć metodę wysyłki dla danej klasy wysyłkowej

Teraz szukamy w kodzie ID tak jak na poniższym screenie. W naszym przypadku ID ma wartość 36.

WooCommerce - jak ukryć metodę wysyłki dla danej klasy wysyłkowej

Szukamy ID metody wysyłki

ID metody wysyłki również trzeba odczytać z kodu. Przejdź do koszyka i kliknij prawym przyciskiem myszy na wysyłkę, którą chcesz ukryć. W tym przypadku chcemy ukryć wysyłkę do paczkomatów.

WooCommerce - jak ukryć metodę wysyłki dla danej klasy wysyłkowej

Należy odszukać ID według poniższego schematu. W naszym przypadku będzie to wartość flat_rate:3.

WooCommerce - jak ukryć metodę wysyłki dla danej klasy wysyłkowej

Testujemy

Dodamy do koszyka rękawice ogrodowe oraz zestaw mebli. Kod zadziałał prawidłowo. Wśród metod wysyłki nie ma paczkomatów InPost.

WooCommerce - jak ukryć metodę wysyłki dla danej klasy wysyłkowej

2. Przypadek 2 – wykluczamy dwie i więcej metod wysyłek dla jednej klasy wysyłkowej

Oferujemy 4 metody dostawy:

  • InPost paczkomaty
  • InPost kurier
  • Kurier DPD
  • Odbiór osobisty

Według regulaminu InPost zakazana jest wysyłka artykułów szklanych, łatwo tłukących. W sklepie sprzedajemy komplet obiadowy, który nie może zostać wysłany ani do paczkomatów, ani kurierem InPost.

Tworzymy klasę wysyłkową, którą nazwiemy Produkt tłukący się i przypiszemy ją do kompletu obiadowego.

Klasy wysyłkowe w WooCommerce

Dla tej klasy wysyłkowej będą widoczne tylko poniższe metody wysyłki:

  • Kurier DPD
  • Odbiór osobisty

Czyli ukrywamy wysyłkę do paczkomatów i kurierem InPost dla klasy wysyłkowej „Produkt tłukący się”.

Dodajemy filtr do pliku functions.php

Plik functions.php znajdziesz w folderze z motywem: wp-content -> themes -> Twój motyw.

Skopiuj poniższy kod i wklej do pliku funtions.php:

add_filter( 'woocommerce_package_rates', 'fanka_kodowania_hide_shipping_method', 10, 2 );

function fanka_kodowania_hide_shipping_method( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    /*****************KLASA WYSYŁKI**************************/
    $class1 = 37;
    /********************************************************/

    /*****************METODY WYSYŁKI*************************/
    $method_key_ids = array('flat_rate:3','flat_rate:6');
    /********************************************************/

    foreach( $package['contents'] as $item ) {

        if( $item['data']->get_shipping_class_id() == $class1 ){
            foreach( $method_key_ids as $method_key_id ){
                unset($rates[$method_key_id]);
            }
        }
    }
    return $rates;
}

Do powyższego kodu będziesz musiał dodać ID klasy wysyłki oraz ID metod wysyłki. ID metod wysyłki należy wpisać w cudzysłowach, rozdzielone przecinkami, czyli przykładowo:

'flat_rate:3','flat_rate:6'

W pierwszym punkcie opisałam, jak należy odczytać ID klasy oraz metody wysyłki.

Testujemy

Dodamy do koszyka rękawice ogrodowe oraz komplet obiadowy. Kod zadziałał prawidłowo. Wśród metod wysyłki nie ma paczkomatów oraz kuriera InPost.

Klasy wysyłkowe w WooCommerce

3. Przypadek 3 – wykluczamy jedną metodę wysyłki dla dwóch i więcej klas wysyłkowych

Oferujemy 4 metody dostawy:

  • InPost paczkomaty
  • InPost kurier
  • Kurier DPD
  • Odbiór osobisty

W sklepie sprzedajemy produkty o większych gabarytach, które są przypisane do dwóch różnych klas wysyłkowych:

  • Meble ogrodowe, które są przypisane do klasy Meble.
  • Materace, które są przypisane do klasy Materace.
Klasy wysyłkowe w WooCommerce

Zarówno ani mebli, ani materacy nie wyślemy do paczkomatów. Zatem dla tych dwóch klas wysyłkowych nie będzie widoczna wysyłka do paczkomatów InPost.

Czyli ukrywamy wysyłkę do paczkomatów InPost dla klasy wysyłkowej „Meble” oraz „Materace”.

Dodajemy filtr do pliku functions.php

Plik functions.php znajdziesz w folderze z motywem: wp-content -> themes -> Twój motyw.

Skopiuj poniższy kod i wklej do pliku funtions.php:

add_filter( 'woocommerce_package_rates', 'fanka_kodowania_hide_shipping_method', 10, 2 );

function fanka_kodowania_hide_shipping_method( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    /*****************KLASA WYSYŁKI**************************/
    $class1 = 40;
    $class2 = 41;
    /********************************************************/

    /*****************METODA WYSYŁKI*************************/
    $method_key_ids = array('flat_rate:3');
    /********************************************************/

    foreach( $package['contents'] as $item ) {

        if( $item['data']->get_shipping_class_id() == $class1 ){
            foreach( $method_key_ids as $method_key_id ){
                unset($rates[$method_key_id]);
            }
            continue;
        }

        else if( $item['data']->get_shipping_class_id() == $class2 ){
            foreach( $method_key_ids as $method_key_id ){
                unset($rates[$method_key_id]);
            }
            break;
        }
    }
    return $rates;
}

Do powyższego kodu będziesz musiał dodać ID klas wysyłek oraz ID metody wysyłki. W pierwszym punkcie opisałam, jak należy odczytać ID klasy oraz metody wysyłki.

Testujemy

Dodamy do koszyka rękawice ogrodowe, materac oraz meble ogrodowe. Kod zadziałał prawidłowo. Wśród metod wysyłki nie ma paczkomatów InPost.

Klasy wysyłkowe w WooCommerce

4. Przypadek 4 – wykluczamy dwie i więcej metod wysyłek dla dwóch i więcej klas wysyłkowych

Według regulaminu InPost oraz DPD nie możemy skorzystać z ich usług, jeśli chcemy wysłać żywność, która szybko się psuje, a także żywe rośliny. W sklepie sprzedajemy jogurty oraz bazylię. Produkty te nie mogą być wysłane ani poprzez InPost, ani DPD. Klient jedynie może odebrać je osobiście.

Tworzymy klasę wysyłkową, którą nazwiemy Żywność i przypiszemy ją do jogurtu. Następnie tworzymy drugą klasę Rośliny i przypiszemy ją do bazylii.

Klasy wysyłkowe w WooCommerce

Dla tych dwóch klas wysyłkowych będzie widoczny tylko odbiór osobisty.

Czyli ukrywamy wysyłkę do paczkomatów i kurierem InPost oraz kurierem DPD dla klasy wysyłkowej „Żywność” oraz „Rośliny”.

Dodajemy filtr do pliku functions.php

Plik functions.php znajdziesz w folderze z motywem: wp-content -> themes -> Twój motyw.

Skopiuj poniższy kod i wklej do pliku funtions.php:

add_filter( 'woocommerce_package_rates', 'fanka_kodowania_hide_shipping_method', 10, 2 );

function fanka_kodowania_hide_shipping_method( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    /*****************KLASA WYSYŁKI**************************/
    $class1 = 42;
    $class2 = 43;
    /********************************************************/

    /*****************METODA WYSYŁKI*************************/
    $method_key_ids = array('flat_rate:3','flat_rate:4','flat_rate:6');
    /********************************************************/

    foreach( $package['contents'] as $item ) {

        if( $item['data']->get_shipping_class_id() == $class1 ){
            foreach( $method_key_ids as $method_key_id ){
                unset($rates[$method_key_id]);
            }
            continue;
        }

        else if( $item['data']->get_shipping_class_id() == $class2 ){
            foreach( $method_key_ids as $method_key_id ){
                unset($rates[$method_key_id]);
            }
            break;
        }
    }
    return $rates;
}

Do powyższego kodu będziesz musiał dodać ID klas wysyłek oraz ID metod wysyłek. W pierwszym punkcie opisałam, jak należy odczytać ID klasy oraz metody wysyłki.

Testujemy

Dodamy do koszyka rękawice ogrodowe, jogurt oraz bazylię. Kod zadziałał prawidłowo. Wśród metod wysyłki jest tylko odbiór osobisty.

Jak ukryć metodę wysyłki – podsumowanie

Do ukrywania metod wysyłki w zależności od klasy wysyłkowej dostępne są gotowe wtyczki. Jednak robiąc to samemu, nie obciążamy strony kolejnym dodatkiem. Daj znać w komentarzu, czy przedstawiony sposób nie jest zbytnio skomplikowany i czy kod działa u Ciebie prawidłowo.

Subskrybuj
Powiadom o
guest
50 komentarzy
najstarszy
najnowszy oceniany
Inline Feedbacks
View all comments
Xelone
Xelone
4 lat temu

Super porada, ja zmagam się z przypisaniem taksonomii np. tagu do rozmiaru paczki paczkomatu. np tag produktu A > Przesyłka rozmiar A itd. lub w ostateczności do klasy wysyłkowej. Może pomysł na kolejny wpis 🙂 Pozdrawiam

Joanna
Joanna
4 lat temu

Świetny artykuł. Jasno i czytelnie wszytko wyjaśnione, nawet dla laika 🙂 Mi bardzo pomógł. Pozdrawiam.

Biel
Biel
4 lat temu

Świetny poradnik! A jeśli chciałbym ukryć opcję dla więcej niż jednej klasy wysyłkowej?

Adam
Adam
1 rok temu
Reply to  Monika Szeliga

a jak ukryc kilka metod dla różnych klas, czasem kilka metod w jednej klasie trzeba wykluczyc ale nie tych samych np. Duże tylko Amberem moze jechac, Wieksze nie moga do paczkomatu i pickup, zas wszystkie poza Duze nie maja miec Ambera

Adam
Adam
1 rok temu
Reply to  Monika Szeliga

wstawione, dam znać czy działa

MorF
MorF
4 lat temu

Prosty i bardzo pożyteczny artykuł:). Niestety życie potrafi się komplikować;). Jak ukryć kilka metod wysyłki na raz dla kilku klas wysyłkowych? Nie jestem orłem w programowaniu, ale instrukcja break przerywająca główna pętlę działającą na produktach znajdujących się w koszyku nie działa prawidłowo jeżeli na raz w koszyku mamy produkty np. do paczkomatu i kurier standard (paczki nie mieszczące się w paczkomacie). Znaczenie ma kolejność produktów w koszyku. Jeżeli produkt do paczkomatu będzie pierwszy a dla kuriera drugi w koszyku to działa ok. Natomiast w odwrotnej kolejności już nie czyli klient ma możliwość wyboru paczkomatu mimo że produkty do niego się nie mieszczą. Myślałem żeby posortować tablicę z produktami po id klasy wysyłkowej, ale woocommerce nadaje im nr wg kolejności tworzenia klas. Może Droga Moniko masz lepszy pomysł.

MorF
MorF
4 lat temu
Reply to  Monika Szeliga

Witam ponownie.
Udało mi się rozwiązać problem. Może niezbyt profesjonalnie ale działa. Stworzyłem tablicę zawierającą klasy wysyłkowe($tab_kw) wszystkich produktów w koszyku:
$tab_kw;
$i=0;
foreach( $package[’contents’] as $item )
{
$tab_kw[$i]=$item[’data’]->get_shipping_class_id();
$i++;
}
Następnie w warunkach użyłem funkcji in_array, która wyszukuje konkretne klasy w wspomnianej tablicy. Przykład warunku który ukrywa metody wysyłki gdy w koszyku mamy towar „dłużycowy”:
foreach( $package[’contents’] as $item )
{
   //klasa wysyłki dłużyca ukrywa paczkomaty, kurier standard i standard pobranie //pod warunkiem że nie ma produktu z klasą wyłącznie odbiór osobisty ($osobisty):
    if( in_array($dluzyca,$tab_kw) && !(in_array($osobisty,$tab_kw)))
{
      foreach( $method_paczkomat as $method_key_id )
{
        unset($rates[$method_key_id]);
      }
foreach( $method_standard as $method_key_id )
{
         unset($rates[$method_key_id]);
      }
foreach( $method_standard_cod as $method_key_id )
{
         unset($rates[$method_key_id]);
      }
       break; 
     }
Pewnie są dużo lepsze rozwiązania, ale to jest proste i działa.

MorF
MorF
4 lat temu
Reply to  Monika Szeliga

Link do mojej strony testowej:
http://graphenecontractor.com/sklep/sklep/
PS. Strona stworzona tylko do testowania Twojego kodu 😉

Łukasz
Łukasz
3 lat temu
Reply to  Monika Szeliga

Dzień dobry Pani Moniko, Ma Pani jakieś rozwiązanie na powyższą kwestię? Mam 1 klase wysyłkową i chciałbym przypisać 2 wysyłki pod nią? Działa tylko z 1.

Cezary
Cezary
3 lat temu

Kod działa świetnie. Tyle że pojawił się mały problem: pomimo braku aktywacji opcji Paczkomatu za pobraniem opca ta est zawsze widoczna. Niebardzo wiem czemu powyższy kod mógłby wywołać taki efekt, przed ego wklejeniem Paczkomaty za pobraniem byłu ukryte. Chcę tę opcję permanentnie ukryć albo poprzez standardową opcę pluginu (trzeba coś zmajstrować żeby spowrotem działała) albo ewentualnie w kodzie. Ale ako kompletnie zielony z tegoż języka programowania więcej mieszam moimi próbami niż to est warte ;).
Zerknij proszę w wolnej chwili na ten problem :). Dzięki

Cezary
Cezary
3 lat temu

Małe sprostowanie: jeżeli wybiorę artykuł dla którego ma być możliwy paczkomat – nie ma problemu. Paczkomat est widoczny a paczkomat za pobraniem nie (według konfiguraci pluginu. Jeżeli natomiast w koszyku jest artykuł dla którego opcja paczkomatu ma być ukryta – paczkomat jest ukryty ale..pojawia się paczkomat za pobraniem. Mimo że (albo właśnie dlatego że) ta druga opcja nigdy nie została aktywowana w pluginie..

Cezary
Cezary
3 lat temu

Przepraszam za wysyp komentarzy;). Problem rozwiązany poprzez dodanie metody Paczkomaty za pobraniem do tablicy metod wysyłki. Dzięki temu dla klas dla któych paczkomaty maą być niewidoczne ukrywane są obie opcje paczkomatów. Dla klas gdzie paczkomat ma być dostępny pokazuje się ta która est aktywowana w ustawieniach pluginu :).
Pozdrawiam
Raz jeszcze dzięki za kodzik 😉

Cezary
Cezary
3 lat temu
Reply to  Monika Szeliga

Jednak po wykonaniu kilku testów okazuje się, że nie do końca działa. Podejrzewam że sam plugin coś może mieć pochrzanione. Wszystko jest ok z jednym wyjątkiem: gdy wybieram produkty z klas dla których paczkomaty mają być dostępne, na stronie koszyka dostępna jest również nigdy nieuaktywniona metoda InPost za pobraniem. Ale gdy tylko z poziomu strony koszyka usunę choć jeden dowolny produkt, koszyk jest auktualniany i InPost za pobraniem znika, zostaje tylko standardowy InPost (czyli tak jak być powinno). Jakiś pomysł co może powodować konflikt pomiędzy ustawieniem wtyczki (nieaktywna metoda za pobraniem) i Twoim filtrem?
Dzięki serdeczne

Cezary
Cezary
3 lat temu
Reply to  Cezary

I okazuje się jednak że to faktycznie wtyczka – test bez filtra potwierdza że nawet gdy Inpost za pobraniem jest dezaktywowany i tak się czasem pokazuje. No nic, walczę dalej. Ostatecznie aktywuję za pobraniem i tyle 😉

Tomek
Tomek
3 lat temu

Czy coś się zmieniło może ostatnio? Pomimo wykonania wszystkich opisanych tu czynności Paczkomaty nadal widoczne 🙁

Mateusz
Mateusz
2 lat temu
Reply to  Monika Szeliga

U mnie to samo – dodałem filtr z wtyczką paczkomaty i działa nadal.

Wojtek
Wojtek
3 lat temu

Witam, testuje to rozwiązanie i natknąłem na następujący problem co w przypadku gdy mamy np materace i łóżka (materace mają ustawione darmową wysyłkę a łóżko wysyłka 200 zł) póki wybiera się albo łóżka albo materac działa perfekcyjnie. Wywala gdy wybierze się łóżko i materac , wtedy są wyłączone wszystkie metody … zrobiłem if warunkowy z && ale jak zrobić z unset aby ponownie pojawiły się wcześniej wyłączone metody wysyłki ….
     else if ( $item[’data’]->get_shipping_class_id() == $class1 && $item[’data’]->get_shipping_class_id() == $class2 ){
       
        
      foreach( $method_key_ids as $method_key_id ){
        unset($rates[$method_key_id]); //
      }
      
     
      }

Adam
3 lat temu

Cześć 🙂
Bardzo fajny artykuł, który mi pomógł.
Z racji, że pomogłaś mi to pozwolę sobie trochę urozmaicić kod.
Zmiana polega na dodaniu klas wysyłkowych do tabeli i użyciu instrukcji warunkowej „switch” przy różnych scenariuszach produktów w koszyku (które posiadają różne klasy wysyłkowe).
Mam nadzieję, że to komuś pomoże 😉
Pozdrawiam!

/*
*UKRYWANIE METOD WYSYŁKI DLA KONKRETNYCH KLAS WYSYŁKOWYCH
*/

add_filter( 'woocommerce_package_rates’, 'hide_shipping_methods’, 10 , 2);

function hide_shipping_methods( $rates, $package )
{

/*****************KLASA WYSYŁKI**************************/

$class_gls = 413;
$class_dpd_paczkomat = 412;

$array_class_in_basket = array();

/********************************************************/

/*****************METODA WYSYŁKI*************************/
$method_local = 'local_pickup:1′;
$method_gls = 'flat_rate:6′;
$method_dpd = 'flat_rate:7′;
$method_paczkomat = 'flat_rate:8′;

$method_key_ids_gls = array($method_local, $method_dpd, $method_paczkomat);
$method_key_ids_dpd_paczkomat = array($method_local, $method_gls);
$method_key_ids_only_local = array($method_gls, $method_dpd, $method_paczkomat);

/********************************************************/

//ZBIERAM INFORMACJĘ O KLASACH WYSYŁKI W KOSZYKU I DODAJĘ DO TABELI $array_class_in_basket

foreach( $package[’contents’] as $item ) {
if (!empty($item[’data’]->get_shipping_class_id())) {
array_push($array_class_in_basket, $item[’data’]->get_shipping_class_id());
} else {
array_push($array_class_in_basket, ’empty class’);
}

}

//SPRAWDZAM CZY W TABELI SĄ KLASY DLA GLS I DPD + PACZKOMATY, ORAZ CZY JEST PRODUKT BEZ KLASY WYSYŁKOWEJ

$has_gls = false;
$has_dpd_paczkomat = false;
$has_empty_class = false;

foreach ($array_class_in_basket as &$iterator) {
if($iterator === $class_gls) {
$has_gls = true;
}
if($iterator === $class_dpd_paczkomat) {
$has_dpd_paczkomat = true;
}
if($iterator === ’empty class’) {
$has_empty_class = true;
}
}

// USTAWIAM WARTOŚĆ DLA 3 SCENARIUSZY WYSYŁKI 1-TYLKO GLS, 2-TYLKO DPD I PACZKOMAT, 3-ODBIÓR OSOBISTY

$shipping_scenario;

if($has_gls === true && $has_dpd_paczkomat === false && $has_empty_class === false) {
$shipping_scenario = 1;
}
elseif($has_gls === false && $has_dpd_paczkomat === true && $has_empty_class === false) {
$shipping_scenario = 2;
}
else {
$shipping_scenario = 3;
}

//W ZALEŻNOŚCI OD SCENARIUSZA WYKLUCZAM ODPOWIEDNIE METODY WYSYŁKI

switch($shipping_scenario) {
case 1:
foreach($method_key_ids_gls as $method_key_id){
unset($rates[$method_key_id]);
};
break;
case 2:
foreach($method_key_ids_dpd_paczkomat as $method_key_id){
unset($rates[$method_key_id]);
};
break;
default:
foreach($method_key_ids_only_local as $method_key_id){
unset($rates[$method_key_id]);
};
}

//DEBUGOWANIE
// print_r($array_class_in_basket);
// echo 'has_gls = ’ . $has_gls . ’ | ’;
// echo 'has_dpd_paczkomat = ’ . $has_dpd_paczkomat . ’ | ’;
// echo 'shipping_scenario = ’ . $shipping_scenario . ’ | ’;

return $rates;

}

Mateusz
Mateusz
3 lat temu

dzięki za poradę, patent działa fajnie i jest banalnie prosty. Pojawił się jednak problem potrzebuję wyeliminować dwie różne metody wysyłki dla dwóch różnych klas wysyłkowych. Próbowałem użyć 4 metody z artykułu ale niestety wtedy nie wyłącza obie metody wysyłki przy każdej klasie wysyłkowej. Dodałem również metodę nr 1 dwa razy ale wtedy całkowicie wywala stronę. 
Masz może jakiś pomysł jak to rozwiązać? 

Marcin
Marcin
2 lat temu

Dodałem wszystko zgodnie z instrukcją no ale nie działa – w sensie nic sie totalnie nie zmieniło, próbowałem dodać w innych miejscach ale ten sam rezultat. Widziałem, że ktoś mial ten sam problem. Używam OceanWP theme

Rafał
2 lat temu
Reply to  Marcin

Wszystko banalnie proste, a jednak nie działa, może jakaś aktualizacja WP coś namieszała?

Grzesiek
Grzesiek
2 lat temu
Reply to  Marcin

Odpal w innej przeglądarce lub wyczyść dane przeglądarki. Dopóki tego nie zrobiłem też wydawało mi się, że nie działa 😉

Przemo
2 lat temu

Hej Monika! Świetny kod 🙂 Bardzo pomógł, ale oczywiście pojawiła się z czasem nowa kwestia :/ Mam dwie klasy wysyłkowe, jedna przypisana do produktów z odbiorem własnym, druga dopisana do produktów z wysyłką kurierem. Nie ma produktów, które miałyby obie opcje. Za pomocą Twojego pierwszego snippeta udało mi się wyłączyć opcję wysyłki kurierem dla towarów odbieranych w magazynie, ale nie mogę zrobić sytuacji odwrotnej, tzn. dla produktów z klasa wysyłkową z kurierem, nie mogę wyłączyć odbioru własnego. Masz na to jakiś pomysł?

Barbara
2 lat temu

Zastosowałam kod dla wersji 1 na stronie. Od jednego producenta mam wysyłkę z magazynu i to tylko kurierem. Paczkomat nie wchodzi w opcję. Kod działa. Po zastosowaniu pozostał tylko kurier.

natalia
2 lat temu

hejka! zrobiłam mega głupotę, bo bez znajomości kodowania dodałam ten kod przez code snippets i wystąpił błąd krytyczny. Przywróciłam witrynę do poprzedniego stanu, wyłączyłam i usunęłam code snippets. Jednak teraz po każdej zmianie, witryna pada na ok. 5-30 min. Co z tym zrobić? Pomocy 🙁

Kondziu
Kondziu
2 lat temu

Dzięki wielkie, trafiłem kilka razy na tą stronkę i pomogła mi bardzo 🙂 miło, że sie dzielisz wiedzą. Wszystkiego dobrego

Asia
Asia
1 rok temu

Wszystko wpisałam poprawnie, niestety pojawił się błąd krytyczny Fatal error. Wiem, że to na pewno kod bo od wczoraj siedzę i analizuje. Sam kod działa, ale nie można edytować żadnej ze stron.

Nie jestem robotem
Nie jestem robotem
1 rok temu

Działa jak powinno – pozdrawiam

Batman
Batman
1 rok temu

Wszystko pięknie, ładnie. Będzie update „skóry” i trzeba ustawiać os nowa 🙁

Adam
Adam
1 rok temu

Witam, zastosowałem taki kod:

//ukrycie wysyłek dla Duże
add_filter( 'woocommerce_package_rates’, 'fanka_kodowania_hide_shipping_method’, 10, 2 );

function fanka_kodowania_hide_shipping_method( $rates, $package )
{
   if ( is_admin() && ! defined( 'DOING_AJAX’ ) )
       return;

   /*****************KLASA WYSYŁKI**************************/
   $class1 = 17;
       /********************************************************/

   /*****************METODA WYSYŁKI*************************/
   $method_key_ids = array(’flat_rate:31′,’flat_rate:38′,’flat_rate:34′,’flat_rate:35′,’flat_rate:33′,’flat_rate:39′,’flat_rate:36′,’flat_rate:40′,’flat_rate:32′);
   /********************************************************/

   foreach( $package[’contents’] as $item ) {

       if( $item[’data’]->get_shipping_class_id() == $class1 ){
           foreach( $method_key_ids as $method_key_id ){
               unset($rates[$method_key_id]);
           }
       }
   }
   return $rates;
}

ale teraz dla klasy 19 chciałbym wykluczyć paczkomaty i pickup
miało by to działać jednocześnie z filtrem dla 17
$method_key_ids = array(’flat_rate:32′,’flat_rate:39′,’flat_rate:36′,’flat_rate:40′,’flat_rate:45′);
próbowałem pozostałych dwóch wariantów ale problemem jest to że częściowo metody się pokrywają chyba i strona sypie błędami.

Olga
Olga
10 miesięcy temu

A jak ukryć metodę wysyłki B jeśli jest możliwa wysyłka A? 🙂

Net
Net
1 miesiąc temu

Rewelacja! Bardzo dziękuję za pomoc i jestem pełen podziwu. Pozdrawiam serdecznie