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.

Opcja darmowej wysyłki w WooCommerce

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.

Tagi artykułu:

×

Interesujesz się WordPressem?

Polub nas na Facebooku, będziesz na bieżąco!

facebook