Jak ukryć inne wysyłki przy darmowej dostawie
Temat wczoraj powrócił jak bumerang podczas konfiguracji nowego sklepu, który stawiamy na niemiecki rynek. Szczerze powiedziawszy zapomniałem, że robiłem to kilka razy dawno temu bo byłem przekonany o tym, że woocommerce ma już to zaimplementowane. W czym rzecz? Mamy kilka metod wysyłki w tym wysyłkę darmową, która pojawia nam się po dodaniu do koszyka towarów o określonej wartości. Załóżmy, że darmowa wysyłka od zakupów powyżej 200 zł. I dopóki klient nie załaduje do koszyka na tą kwotę to darmowa wysyłka mu się nie pojawia – do tego momentu mamy elegancko. No ale jak już tą wartość przekroczy, to niestety oprócz darmowej wysyłki ma do wyboru pozostałe formy dostawy.
Logiczne lub nie, bo być może darmowa dostawa trwa tydzień a płatna będzie jutro i klient woli jednak dołożyć te 15 zł, ale nie o to w tym temacie chodzi. Zakładamy, że darmowa wysyłka jest równie szybka co najszybsza płatna i w tym momencie pokazując klientowi pozostałe opcje wprowadzamy go w konsternację. Niepotrzebnie wydłużamy proces zakupowy i budujemy zbędne napięcie, które nie pomaga w osiągnięciu celu jakim jest wciśnięcie guzika „KUPUJĘ I PŁACĘ”.
W internecie można znaleźć wiele rozwiązań tego problemu, jak zwykle okazuje się, że to kilka linijek kodu a nie 5 wtyczek. Ale ja chciałbym podejść do tematu trochę szerzej i bardziej nietypowo. Na konkretnym przykładzie. A co jeśli klient oprócz darmowej wysyłki oferuje odbiór własny (logicznym jest zerowy koszt odbioru własnego), a co jeśli ma np. 2 sklepy stacjonarne, gdzie można towar odebrać?
Za problem odpowiada filtr woocommerce_package_rates
add_filter('woocommerce_package_rates', 'ukryj_inne_gdy_darmowa', 10, 2);
function ukryj_inne_gdy_darmowa($rates, $package) {
if ( isset( $rates['free_shipping'] ) ) {
$darmowa_wysylka = $rates['free_shipping']; $rates = array(); // tutaj zerujemy tablicę z wysyłkami
$rates['free_shipping'] = $darmowa_wysylka; //tworzymy nową tylko z jedną zmienną
}
return $rates;
}
No dobra a teraz obiecany kod, gdy mamy jeszcze punkty odbioru osobistego czyli local_pickup
add_filter('woocommerce_package_rates', 'pokaz_tylko_darmowe_wysylki', 10, 2);
function pokaz_tylko_darmowe_wysylki($rates, $package) {
$darmowa = 0;
$odbior_osobisty = 0;
foreach($rates as $key => $value) {
$key_part = explode(":", $key);
$method_title = $key_part[0];
if ('free_shipping' == $method_title) { // sprawdzamy czy darmowa wysyłka istnieje
$darmowa = 1;
$free_shipping = $rates[$key];
$free_key = $key;
}
if ('local_pickup' == $method_title) {// sprawdzamy czy jest odbiór osobisty
if ($odbior_osobisty=='0') {
$odbior_osobisty = 1;
$local_pickup_zg = $rates[$key];
$pickup_key_zg = $key;}
else {
$odbior_osobisty = 2;
$local_pickup_ns = $rates[$key];
$pickup_key_ns = $key; }
}
}
if ($darmowa == 1) {
$rates = array();
$rates[$free_key] = $free_shipping;
if ($odbior_osobisty == 2) {
$rates[$pickup_key_ns] = $local_pickup_ns;
$rates[$pickup_key_zg] = $local_pickup_zg;
}
}
return $rates;
}
I gotowe, takie rozwiązanie z powodzeniem udało się zastosować w sklepie etraper.pl