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;
}
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