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ą
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.
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.
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.
Teraz szukamy w kodzie ID tak jak na poniższym screenie. W naszym przypadku ID ma wartość 36.
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.
Należy odszukać ID według poniższego schematu. W naszym przypadku będzie to wartość flat_rate:3.
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.
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.
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.
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.
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.
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.
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.
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
Świetny artykuł. Jasno i czytelnie wszytko wyjaśnione, nawet dla laika 🙂 Mi bardzo pomógł. Pozdrawiam.
Świetny poradnik! A jeśli chciałbym ukryć opcję dla więcej niż jednej klasy wysyłkowej?
Dziękuję:) Dodałam do poradnika instrukcję jak ukryć daną metodę wysyłki dla kilku klas wysyłkowych.
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
Poniższy kod powinien zadziałać:
Założenia:
W klasie nr 17 wykluczamy 'flat_rate:31′,’flat_rate:32′,’flat_rate:40′
W klasie nr 18 wykluczamy 'flat_rate:45′
W klasie nr 19 wykluczamy 'flat_rate:45′, 'flat_rate:40′
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;
$class2 = 18;
$class3 = 19;
/********************************************************/
/*****************METODA WYSYŁKI*************************/
$method_key_ids1 = array(’flat_rate:31′,’flat_rate:32′,’flat_rate:40′);
$method_key_ids2 = array(’flat_rate:45′);
$method_key_ids3 = array(’flat_rate:45′,’flat_rate:40′);
/********************************************************/
foreach( $package[’contents’] as $item ) {
if( $item[’data’]->get_shipping_class_id() == $class1 ){
foreach( $method_key_ids1 as $method_key_id1 ){
unset($rates[$method_key_id1]);
}
continue;
}
else if( $item[’data’]->get_shipping_class_id() == $class2 ){
foreach( $method_key_ids2 as $method_key_id2 ){
unset($rates[$method_key_id2]);
}
continue;
}
else if( $item[’data’]->get_shipping_class_id() == $class3 ){
foreach( $method_key_ids3 as $method_key_id3 ){
unset($rates[$method_key_id3]);
}
continue;
}
}
return $rates;
}
wstawione, dam znać czy działa
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ł.
Dziękuję za uwagi, zobaczę jak można rozwiązać ten problem 😉
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.
Świetnie 🙂 Dziękuję za wskazówkę! Przetestuję to rozwiązanie i dodam poprawkę do artykułu. Pozdrawiam serdecznie 😉
Link do mojej strony testowej:
http://graphenecontractor.com/sklep/sklep/
PS. Strona stworzona tylko do testowania Twojego kodu 😉
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.
Dzień dobry, w najbliższym czasie planuję zaktualizować wpis. Dziękuję za sugestię 😉
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
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..
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 😉
Super, cieszę się, że udało się rozwiązać problem, pozdrawiam 🙂
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
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 😉
Czy coś się zmieniło może ostatnio? Pomimo wykonania wszystkich opisanych tu czynności Paczkomaty nadal widoczne 🙁
Sprawdzę i dam znać 🙂
U mnie to samo – dodałem filtr z wtyczką paczkomaty i działa nadal.
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]); //
}
}
Dziękuję za zgłoszenie problemu. W najbliższym czasie postaram się to zweryfikować.
Nie wiem, czy temat jest jeszcze aktualny, ale przetestowałam działanie kodu wg opisanego problemu. Utworzyłam dwie klasy wysyłkowe – „materace” i „łóżka”. Dodałam dwie metody wysyłki – DPD i Paczkomaty. Dla obu utworzonych uprzednio klas wysyłki wykluczyłam wysyłkę do paczkomatów.
Dla klasy „materace” ustaliłam darmową wysyłkę poprzez DPD. Natomiast dla klasy „łóżka” ustaliłam wysyłkę poprzez DPD za 200 zł.
Po dodaniu obu produktów do koszyka w różnej kolejności za każdym razem była ukryta wysyłka do paczkomatów, natomiast była widoczna wysyłka DPD za 200 zł.
Sugeruję dodać darmową wysyłkę korzystając z klas wysyłkowych. Wtedy wszystko powinno działać poprawnie 🙂
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;
}
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ć?
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
Niestety nie jestem w stanie stwierdzić przyczyny problemu bez dostępu do WordPressa
Wszystko banalnie proste, a jednak nie działa, może jakaś aktualizacja WP coś namieszała?
W którym miejscu pojawia się problem?
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 😉
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ł?
Wydaje mi się, że to podejście nie będzie w tym przypadku właściwe, ponieważ problem pojawi się w sytuacji, gdy użytkownik doda do koszyka jeden produkt z wysyłką kurierem i drugi z odbiorem osobistym. Wtedy żadna metoda wysyłki nie byłaby widoczna, ponieważ jeden produkt wykluczałby wysyłkę kurierem, a drugi odbiór osobisty. W takiej sytuacji proponuję umożliwić odbiór osobisty dla wszystkich produktów, natomiast wykluczyć kuriera dla produktów, które z jakiś powodów nie mogą być wysyłane. Wtedy gdy użytkownik doda do koszyka produkty o dwóch różnych klasach wysyłkowych, będzie możliwy tylko odbiór osobisty.
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.
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 🙁
Bardzo ciężko jest mi ustalić przyczynę problemu bez wglądu w kod strony. Jeśli będzie potrzebna moja pomoc, to zapraszam do kontaktu: blog@fankakodowania.pl
Dzięki wielkie, trafiłem kilka razy na tą stronkę i pomogła mi bardzo 🙂 miło, że sie dzielisz wiedzą. Wszystkiego dobrego
Cieszę się, że pomogłam, pozdrawiam 🙂
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.
Niestety ciężko jest mi ustalić przyczynę problemu bez dostępu do strony. Musiałabym najpierw zajrzeć w kod.
Działa jak powinno – pozdrawiam
Wszystko pięknie, ładnie. Będzie update „skóry” i trzeba ustawiać os nowa 🙁
Wszelkie zmiany należy wprowadzać w motywie potomnym. Dzięki temu po aktualizacji nadal będą widoczne 🙂
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.
A jak ukryć metodę wysyłki B jeśli jest możliwa wysyłka A? 🙂
Spróbuj użyć poniższego kodu. Pamiętaj, żeby po wklejeniu kodu odświeżyć metody wysyłki. Przejdź do zakładki WooCommerce -> Ustawienia -> Wysyłka. Wejdź w metodę wysyłki A oraz B i przy każdej z nich kliknij przycisk „zapisz zmiany”. Powinno działać 😉
add_filter(’woocommerce_package_rates’, 'fanka_kodowania_hide_shipping_methods’, 10, 2);
function fanka_kodowania_hide_shipping_methods($rates, $package)
{
$flat_delivery_1 = 'flat_rate:1′; //wysyłka A
$flat_delivery_2 = 'flat_rate:2′; //wysyłka B
// Ukrycie B gdy A jest dostępne
if(isset($rates[$flat_delivery_1])) {
unset($rates[$flat_delivery_2]);
}
return $rates;
}
Rewelacja! Bardzo dziękuję za pomoc i jestem pełen podziwu. Pozdrawiam serdecznie
Cieszę się, że mój artykuł pomógł 😉