Skocz do zawartości
Szukaj na Pecetowiczu
  • Utwórz konto

Opcje dostawy a klasy wysyłkowe | WooCommerce


Przejdź do rekomendacji Rozwiązane przez forumowicz321,
Rekomendowane odpowiedzi

Siema. Posiadam w WooCommerce klasy wysyłkowe: łóżeczka, szafy & komody, wózki. Posiadam opcje dostawy: darmowa wysyłka, odbiór osobisty, przesyłka kurierska, przesyłka pobraniowa, inpost paczkomaty

Teraz sedno problemu. Chciałbym ustawić w sklepie tak, ze jeśli klient doda do koszyka produkt z kategorii, które są w klasach wysyłkowych np. łóżeczka to przy wyborze opcji dostawy znika Inpost paczkomaty oraz darmowa wysyłka.

Czyli jeśli jest produkt w koszyku z klasy wysyłkowej to znikają te dwie opcje.

Znalazłem na necie pewien poradnik jakiś czas temu i mam taki kod:

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 ) {
 
$target1 = 525;
$target2 = 526;
$target3 = 769;

//$shipping_class_target
	
$in_cart = false;
foreach( WC()->cart->cart_contents as $key => $values ) {
  $_temp =  $values[ 'data' ]->get_shipping_class_id();
 if( $_temp == $target1 || $_temp == $target2 || $_temp == $target3) {
  $in_cart = true;
  break;
 } 
}

// $in_cart = false;
// foreach( WC()->cart->cart_contents as $key => $values ) {
//  if( $values[ 'data' ]->get_shipping_class_id() == $target1) {
//   $in_cart = true;
//   break;
//  }
// }

if( $in_cart ) {
 	unset( $rates['free_shipping:3'] );				
 	unset( $rates['inpost_paczkomaty:10'] );
}
 
if ( isset( $rates['free_shipping:3'] ) ) {
    unset( $rates['flat_rate:1'] );
	unset( $rates['flat_rate:2'] );
	unset( $rates['inpost_paczkomaty:10'] );
}   
 
return $rates;
 
}

zmienne $target to są klasy wysyłkowe,

Ten kod wklejony jest w plik functions.php jednak nie działa jak należy 😞

Odnośnik do komentarza
Udostępnij na innych stronach

Czy plik functions.php to plik głównego motywu? Jeśli tak to odradzam taką metodę, w takiej sytuacji lepiej stworzyć motyw potomny lub zainstalować wtyczkę https://pl.wordpress.org/plugins/code-snippets/ dzięki czemu przy aktualizacji głównego motywu nasze zmiany nie zostaną nadpisane.

 

Co do problemu to wszedłem na stronę i widzę że skrypt działa poprawnie:

obraz.png

obraz.png

To znaczy że produkt, który Ty testujesz może jest źle przypisany do kategorii przez co ta klasa wysyłkowa go nie wykrywa.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Rekomendowana odpowiedź

Zdaje mi się że naprawione. ID opcji wysyłek były błędnie przepisane.

Co do pliku functions.php, to korzystam z motywu potomnego.

Odnośnik do komentarza
Udostępnij na innych stronach

(edytowane)

Jeżeli mógłbym się wtrącić w kwestii kodu... 😄

<?php

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(array $rates, $package) {
  $shippingClassesIds = [
    'crips' => 525,
    'wardrobes_and_dressers' => 526,
    'strollers' => 769,
  ];

  //$shipping_class_target
  $itemInShippingClasses = false;
  $cartItems = WC()->cart->cart_contents;

  foreach($cartItems as $cartItem) {
    $itemShippingClassId = (int)$cartItem['data']->get_shipping_class_id();

    if(in_array($itemShippingClassId, $shippingClassesIds, true)) {
      $itemInShippingClasses = true;

      break;
    } 
  }

  if($itemInShippingClasses) {
    unset($rates['free_shipping:3']);				
    unset($rates['inpost_paczkomaty:10']);
  }

  if (isset($rates['free_shipping:3'])) {
    unset($rates['flat_rate:1']);
    unset($rates['flat_rate:2']);
    unset($rates['inpost_paczkomaty:10']);
  }   

  return $rates;
}

Niestety nie wiem czym jest zmienna `$package` - dlatego brak typowania. I nie wiem też czy to jest do końca poprawny warunek:

if (isset($rates['free_shipping:3'])) {

Bo nie wiem jakie wartości mogą być w środku tego klucza i może to powodować jakieś niepożądane efekty biznesowe.

Edytowane przez -n3veR
Odnośnik do komentarza
Udostępnij na innych stronach

Kontynuuj dyskusję

Dołącz do Pecetowicza, aby kontynuować dyskusję w tym wątku.

  • Dodaj nową pozycję...
  • Dodaj nową pozycję...