Jeżeli chciałbyś zarządzać metodami wysyłek w zależności od tego jakie produkty użytkownik ma w sklepie to mam dla Ciebie kod, który to umożliwia 🙂
Oczywiście, możesz to zrobić kolejną wtyczką ale po co jak można kodem.
Poniżej cały kod a poniżej całości będę omawiał poszczególne fragmenty.
add_filter( 'woocommerce_package_rates', 'damian_hide_shipping_method', 10, 2 );
function damian_hide_shipping_method( $rates, $package )
{
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
/*****************KLASA WYSYŁKI**************************/
$kurier_dhl_paleta = 280;
$kurier_inpost = 36;
$transport_producenta = 37;
/********************************************************/
/*****************METODA WYSYŁKI*************************/
$m_kurier_dhl = array('flat_rate:37', 'flat_rate:39', 'flat_rate:41', 'flat_rate:43', 'flat_rate:45', 'flat_rate:47', 'flat_rate:49', 'flat_rate:51', 'flat_rate:53', 'flat_rate:55', 'flat_rate:57', 'flat_rate:59', 'flat_rate:61', 'flat_rate:63', 'flat_rate:65', 'flat_rate:67');
$m_kurier_inpost = array('flat_rate:72','flat_rate:73', 'flat_rate:74', 'flat_rate:75', 'flat_rate:76', 'flat_rate:77', 'flat_rate:78', 'flat_rate:79', 'flat_rate:80', 'flat_rate:81', 'flat_rate:82', 'flat_rate:83', 'flat_rate:84', 'flat_rate:85', 'flat_rate:86', 'flat_rate:87');
$m_transport_producenta = array('flat_rate:12', 'flat_rate:15', 'flat_rate:17', 'flat_rate:18', 'flat_rate:19', 'flat_rate:20', 'flat_rate:21', 'flat_rate:22', 'flat_rate:23', 'flat_rate:24', 'flat_rate:25', 'flat_rate:26', 'flat_rate:27', 'flat_rate:28', 'flat_rate:29', 'flat_rate:30');
/********************************************************/
$dhl = false;
$inpost = false;
$producent = false;
foreach( $package['contents'] as $item ) {
if( $item['data']->get_shipping_class_id() == $transport_producenta ){
$producent = true;
$dhl = false;
$inpost = false;
break;
}
elseif( $item['data']->get_shipping_class_id() == $kurier_dhl_paleta ){
$dhl = true;
}else{
$inpost = true;
$dhl = false;
}
}
if($producent){
foreach(array_combine($m_kurier_dhl, $m_kurier_inpost) as $kurier_dhl_id => $kurier_inpost_id){
unset($rates[$kurier_dhl_id]);
unset($rates[$kurier_inpost_id]);
}
}elseif($inpost){
foreach(array_combine($m_kurier_dhl, $m_transport_producenta) as $kurier_dhl_id => $transport_producenta_id){
unset($rates[$kurier_dhl_id]);
unset($rates[$transport_producenta_id]);
}
}else{
foreach($m_kurier_inpost as $kurier_inpost_id){
unset($rates[$kurier_inpost_id]);
}
}
return $rates;
}
Klasy wysyłki:
W pierwszej kolejności musisz mieć stworzone klasy wysyłki w ustawieniach WooCommerce i każdy produkt musi być przypisany do jednej z klas.
Następnie musisz sprawdzić jakie ID mają poszczególne klasy wysyłkowe. Aby to zrobić kliknij prawym -> zbadaj element. Najeżdżasz kursorem myszki na daną klasę wysyłkową klikasz w nazwę i dzięki temu w kodzie pokaże Ci się fragment gdzie jest przypisany ID do tej klasy wysyłkowej. Zapisz sobie ten numer ID. Zrób tak dla każdej klasy wysyłkowej jaką stworzyłeś.
W kodzie skryptu podaj do zmiennych ID klas wysyłkowych
/*****************KLASA WYSYŁKI**************************/
$kurier_dhl_paleta = 280;
$kurier_inpost = 36;
$transport_producenta = 37;
/********************************************************/
Kolejnym krokiem będzie przypisanie metod wysyłki. U mnie wygląda to tak
/*****************METODA WYSYŁKI*************************/
$m_kurier_dhl = array('flat_rate:37', 'flat_rate:39', 'flat_rate:41', 'flat_rate:43', 'flat_rate:45', 'flat_rate:47', 'flat_rate:49', 'flat_rate:51', 'flat_rate:53', 'flat_rate:55', 'flat_rate:57', 'flat_rate:59', 'flat_rate:61', 'flat_rate:63', 'flat_rate:65', 'flat_rate:67');
$m_kurier_inpost = array('flat_rate:72','flat_rate:73', 'flat_rate:74', 'flat_rate:75', 'flat_rate:76', 'flat_rate:77', 'flat_rate:78', 'flat_rate:79', 'flat_rate:80', 'flat_rate:81', 'flat_rate:82', 'flat_rate:83', 'flat_rate:84', 'flat_rate:85', 'flat_rate:86', 'flat_rate:87');
$m_transport_producenta = array('flat_rate:12', 'flat_rate:15', 'flat_rate:17', 'flat_rate:18', 'flat_rate:19', 'flat_rate:20', 'flat_rate:21', 'flat_rate:22', 'flat_rate:23', 'flat_rate:24', 'flat_rate:25', 'flat_rate:26', 'flat_rate:27', 'flat_rate:28', 'flat_rate:29', 'flat_rate:30');
/********************************************************/
Dlaczego tak? Bo dla każdego województwa mam osobne metody wysyłki. Jeżeli nie masz regionizacji wysyłki a wysyłasz na całą Polskę to ten kod możesz zniwelować do jednej wartości w tablicy, danej metody wysyłki.
$m_kurier_dhl = array('flat_rate:37');
$m_kurier_inpost = array('flat_rate:72');
$m_transport_producenta = array('flat_rate:12');
Skąd wziąć id „flat_rate”? Najlepiej, dodaj produkt do koszyka, następnie w koszyku sklepu kliknij prawym -> zbadaj element
W moim wypadku dla tego regionu wysyłka inpost ma flat_rate:74. Tak musisz zbadać każdą metodę wysyłki i wpisać w tablicę.
Kolejny fragment kodu odpowiada już za sprawdzenie jakie produkty znajdują się w koszyku. Precyzyjniej to do jakich klas wysyłkowych znajdują się produkty
$dhl = false;
$inpost = false;
$producent = false;
foreach( $package['contents'] as $item ) {
if( $item['data']->get_shipping_class_id() == $transport_producenta ){
$producent = true;
$dhl = false;
$inpost = false;
break;
}
elseif( $item['data']->get_shipping_class_id() == $kurier_dhl_paleta ){
$dhl = true;
}else{
$inpost = true;
$dhl = false;
}
}
U mnie działa to tak, że jeżeli w koszyku znajduję się chociaż jeden produkt, który ma klasę wysyłkową „transport-producenta” to tylko ta metoda wysyłki jest możliwa + oczywiście odbiór osobisty. Nie można wtedy zamówić inną metodą.
Jeżeli jest w koszyku jest produkt (jeden lub wiele), które mają klasę „paleta dhl” to klient może zamówić to DHL lub Transportem producenta. Nie można zamówić w takim wypadku Inpost
Jeżeli w koszyku znajduje się produkt (jeden lub wiele), z klasą Inpost, to klient może zamówić tylko Inpost.
Dalsza część kodu to już usuwanie poszczególnych metod wysyłki w zależności co jest w koszyku.
if($producent){
foreach(array_combine($m_kurier_dhl, $m_kurier_inpost) as $kurier_dhl_id => $kurier_inpost_id){
unset($rates[$kurier_dhl_id]);
unset($rates[$kurier_inpost_id]);
}
}elseif($inpost){
foreach(array_combine($m_kurier_dhl, $m_transport_producenta) as $kurier_dhl_id => $transport_producenta_id){
unset($rates[$kurier_dhl_id]);
unset($rates[$transport_producenta_id]);
}
}else{
foreach($m_kurier_inpost as $kurier_inpost_id){
unset($rates[$kurier_inpost_id]);
}
}
return $rates;
Jeżeli zmienna producent jest ustawiony na true, to usuwa DHL oraz Inpost,
Jeżeli pierwszy warunek nie jest prawdziwy to sprawdza kolejny czyli czy zmienna inpost ma wartość true, to oznacza, że w koszyku znajdują się tylko takie produkty, które można wysłać inspotem.
Jeżeli pierwszy oraz drugi warunek nie jest prawdziwy to musi być prawdziwy trzeci warunek. Czyli w koszyku znajdują się produkty, które można wysłać DHL paleta ewentualnie Transport-producenta.