2017-07-12 13 views
1

Ich versuche, Flatrate Versandart nur aufheben, wenn Einkaufswagen Produkte mit und ohne Versandklasse hat. Wenn alle Produkte im Warenkorb Versandklasse haben, sollte es bleiben.WooCommerce Versandmethode basierend auf Warenkorb Artikel Versandklassen

Lassen Sie sich diese Versandart: Flat Rate - (flat_rate1) (instance_id = 1)

Und diese Versandklassen: 50, 100 und so weiter, mit der gleichen Art und Weise benannt Slugs: 50, 100 ...

Bei der Versandart Flatrate wurden für diese Versandklassen Kosten eingerichtet. Die Kosten Hauptkosten und Keine Versandklasse für diese Methode sind nicht festgelegt. Sie werden also nur für Produkte im Einkaufswagen angezeigt, für die Versandklassen festgelegt wurden.

Verstanden Arbeits

add_filter('woocommerce_package_rates', 'unset_shipping_for_unmatched_items', 100, 2); 

function unset_shipping_for_unmatched_items($rates, $package) { 
    // Initialisation 
    $shipping_classes = array(50, 100, 150, 200, 250, 300); 
    $cart_items = WC()->cart->get_cart(); 
    $cart_items_count = WC()->cart->get_cart_contents_count(); 

    $items_match = false; 

    $inArray = 0; 
    $notInArray = 0; 

    foreach($cart_items as $cart_item){ 
     if(in_array($cart_item[ 'data' ]->get_shipping_class(), $shipping_classes) && $cart_items_count > 1) { 
      $inArray++; 
     } else { 
      $notInArray++; 
     } 
    } 
    if(($cart_items_count == $notInArray) || ($cart_items_count == $inArray)){ 
     $items_match = false; 
    } else { 
     $items_match = true; 
    } 

    if($items_match) 
     unset($rates['flat_rate:6']); 

    return $rates; 
} 

Antwort

1

In WooCommerce sind die Versandmethoden ID Butzen ein wenig anders, ich meine, es ist ein Tippfehler Fehler. Sie müssen : zwischen dem Namen und der Nummer im Slug hinzufügen: 'flat_rate6'.

Auch wenn Sie eine passende Warenkorb Artikel Versandklasse erhalten, können Sie break die Schleife.
Letzte Sache: Dieser Hook hat 2 verfügbare Argumente: $rates und $package.

So wird Ihr Code sein:

add_filter('woocommerce_package_rates', 'hide_shipping_when_class_is_in_cart', 100, 2); 
function hide_shipping_when_class_is_in_cart($rates, $package) { 
    // Initialisation 
    $shipping_classes = array(50, 100, 150, 200, 250, 300); 
    $class_exists = false; 

    foreach(WC()->cart->get_cart() as $cart_item) 
     if(in_array($cart_item[ 'data' ]->get_shipping_class_id(), $shipping_classes)) { 
      $class_exists = true; 
      break; // Stop the loop 
     } 

    if($class_exists) 
     unset($rates['flat_rate:6']); 

    return $rates; 
} 

-Code geht in function.php Datei Ihres aktiven Kind Thema (oder Thema) oder auch in jeder Plugin-Datei.

Dies sollte jetzt funktionieren.

+0

Hat es funktioniert, musste stattdessen get_shipping_class() verwendet werden, um Slug zu bekommen, wie im Array zu verwenden. Und etwas Zählen, um zu überprüfen, ob die Artikelklasse dem Versandklassen-Array entspricht. – Aivaras

Verwandte Themen