WooCommerce – Darmowa wysyłka, a klasy wysyłkowe
Ostatnio zdarza mi się dość często pracować ze sklepami, więc pozostaniemy w temacie WooCommerce. Na pewno spotkaliście się z opcją darmowej wysyłki w sklepach internetowcyh (np. jeśli wartość zamówienia przekracza określoną kwotę), ale często też zdarza się, że macie kilka produktów, powiedzmy wielkogabarytowych i chcielibyście tylko dla tych produktów wyłączyć darmową przesyłkę. Postaram się opisać te problemy w artykule.
Darmowa wysyłka
Tutaj nie ma nic trudnego, wchodzimy w WooCommerce -> Ustawienia -> Wysyłka, edytujemy strefę wysyłki (lub najpierw tworzymy nową) a następnie, włączamy „Darmową wysyłkę”. Klikając Edytuj przy darmowej wysyłce, możemy ustawić np. dostępność darmowej wysyłki dla minimalnej wartości zamówienia.
I wszystko fajnie, ale na pewno mamy też inne metody wysyłki np. kurier, pobranie itd i chcielibyśmy je ukryć, jeśli darmowa wysyłka jest dostępna. Aby to zrobić dodajemy następujący fragment (najlepiej do pliku functions.php naszego motywu potomnego):
add_filter( 'woocommerce_package_rates', 'wpinfo_unset_shipping_when_free_is_available_in_zone', 10, 2 ); function wpinfo_unset_shipping_when_free_is_available_in_zone( $rates, $package ) { if ( isset( $rates['free_shipping:4'] ) ) { unset( $rates['flat_rate:1'] ); // jak znależć id metody wysyłki? zobacz screen poniżej } return $rates; }
Co robi funkcja? jeśli dostępna jest darmowa wysyłka (free_shipping:4), usuwamy metodę wysyłki „płaska stawka” (flat_rate:1), jak znaleźć odpowiednie identyfikatory metod wysyłki? zobaczcie screen poniżej, myślę, że nie wymaga dodatkowych wyjaśnień.
Klasy wysyłkowe
Wszystko działa poprawnie, ale po jakimś czasie dołożyliście do sklepu produkty wielkogabarytowe i koszt ich wysyłki to powiedzmy 80zł (np. na palecie) i nie będzie dobrym rozwiązaniem – dla Was 🙂 dalsze proponowanie darmowej wysyłki, jeśli wartość zamówienia przekroczy np. 200zł. W tym przypadku należy zdefiniować nową klasę wysyłkową dla wspomnianych produktów. Jak to zrobić? Nie będę pisał ponownie, bo bardzo dokładnie opisał to np. Daniel Pietrak z WP Desk.
Wszystko w porządku klasa działa, po dodaniu produktu do koszyka, widzimy droższą opcję wysyłki, ale niestety jeśli wartość całego zamówienia przekroczy 200zł, pojawia się opcja darmowej wysyłki, którą ustawiliśmy wcześniej – a tego chcielibyśmy uniknąć.
Aby to zrobić, musimy edytować naszą wcześniejszą funkcję:
function wpinfo_unset_shipping_when_free_is_available_in_zone( $rates, $package ) { $shipping_class_target = 550; // jak znaleźć ID klasy wysyłkowej? zobacz screen poniżej $in_cart = false; foreach( WC()->cart->cart_contents as $key => $values ) { if( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) { $in_cart = true; break; } } if( $in_cart ) { unset( $rates['free_shipping:4'] ); // jak znaleźć id metody wysyłki? zobacz screen powyżej } if ( isset( $rates['free_shipping:4'] ) ) { unset( $rates['flat_rate:1'] ); } return $rates; }
Krótki opis; jeśli w koszyku znajdzie się produkt z wspomnianą klasą wysyłkową, usuwamy darmową opcję wysyłki. Metoda szukania ID klasy wysyłkowej jest widoczna na screenie poniżej. Teraz wszystko powinno działać poprawnie.
Od razu odpowiadam na pytania w komentarzach: „U mnie działa” 🙂
A tak serio, to jeśli macie z tym problemy to w miarę możliwości postaram się pomóc.
Galeria produktu – problem po aktualizacji do WooCommerce 3.x? WordPress 4.8 – problemy po aktualizacji?