Wenn der Benutzer in Deinem Woocommerce-Shop einkauft und Anspruch auf eine kostenlose Lieferung hat, kann es verwirrend sein und unnötig erscheinen, dass im Warenkorb dennoch eine Option für kostenpflichtigen Versand angezeigt wird.
Die gute Nachricht ist, dass du dieses Problem leicht beheben kannst. Du kannst den Filter woocommerce_package_rates
nutzen, um die Funktion ud_hide_shipping_when_free_is_available
aufzurufen. Innerhalb dieser Funktion werden alle anderen Versandoptionen entfernt, wenn die Versandoption $free
vorhanden ist. Um dies umzusetzen, kannst du den Code-Schnipsel in deine functions.php
-Datei einfügen.
Dadurch wird im Frontend nur noch die Option für kostenlosen Versand angezeigt, wenn der Benutzer Anspruch darauf hat.
function ud_hide_shipping_when_free_is_available( $rates ) {
$free = array();
foreach ( $rates as $rate_id => $rate ) {
if ( 'free_shipping' === $rate->method_id ) {
$free[ $rate_id ] = $rate;
break;
}
}
return ! empty( $free ) ? $free : $rates;
}
add_filter( 'woocommerce_package_rates', 'ud_hide_shipping_when_free_is_available', 10,2 );
Damit das Snippet auch greift, ist es sinnvoll, zuvor den Woocommerce-Transienten-Cache zu leeren: WooCommerce → Status → Werkzeuge → WooCommerce-Transienten → Transients leeren
Zusätzliche Versandart hinzufügen
Wenn du neben der Versandoption «kostenfreie Lieferung» auch die Möglichkeit «Abholung vor Ort» anzeigen möchtest, kannst du dies ebenfalls mit dem Filter woocommerce_package_rates
erreichen.
Zunächst erstellen wir ein leeres Array namens $new_rates
, in dem die neuen Versandoptionen gespeichert werden sollen. Die Funktion durchläuft dann alle vorhandenen Versandoptionen in der Variable $rates
. Wenn eine Versandoption mit der Methode free_shipping
übereinstimmt, wird sie zum Array $new_rates
hinzugefügt.
Danach überprüfen wir, ob das Array $new_rates
nicht leer ist. Wenn dies der Fall ist, wird eine weitere Schleife verwendet, um nach Versandoptionen mit der Methode local_pickup
zu suchen und sie ebenfalls zum Array $new_rates
hinzuzufügen.
Abschliessend wird überprüft, ob das Array $new_rates
nicht leer ist. Wenn es nicht leer ist, werden nur die Versandoptionen in $new_rates
zurückgegeben, andernfalls werden die ursprünglichen Versandoptionen zurückgegeben.
function ud_hide_shipping_when_free_is_available( $rates ) {
$new_rates = array();
foreach ( $rates as $rate_id => $rate ) {
if ( 'free_shipping' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
}
}
if ( ! empty( $new_rates ) ) {
foreach ( $rates as $rate_id => $rate ) {
if ('local_pickup' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
}
}
return $new_rates;
}
return $rates;
}
add_filter( 'woocommerce_package_rates', 'ud_hide_shipping_when_free_is_available', 10, 2 );
Versandkostenfreie Produkte bedeuten nicht automatisch kostenfreien Versand
Wenn ein Produkt im Warenkorb die Versandklasse «versandkostenfrei» hat, berechnet WooCommerce für den gesamten Warenkorb keine Versandkosten – auch dann nicht, wenn sich im Warenkorb noch weitere Produkte befinden, für die normalerweise Versandkosten anfallen würden.
In einem Online-Shop können zum Beispiel sowohl Autogrammkarten, die versandkostenfrei sind, als auch kostenpflichtige Musik-CDs verkauft werden.
Wenn sich ein versandkostenfreies Produkt im Warenkorb befindet, berechnet WooCommerce keine Versandkosten. Jedoch sollen die Versandkosten nur dann entfallen, wenn sich ausschliesslich versandkostenfreie Produkte im Warenkorb befinden. Wenn also auch kostenpflichtige Produkte im Warenkorb liegen, sollen trotzdem Versandkosten berechnet werden.
Mit diesem Snippet fallen die Versandkosten weg, wenn sich ausschliesslich versandkostenfreie Produkte im Warenkorb befinden, oder wenn ein bestimmter Bestellwert erreicht worden ist.
function ud_get_all_shipping_zones() {
$data_store = WC_Data_Store::load('shipping-zone');
$raw_zones = $data_store->get_zones();
foreach ($raw_zones as $raw_zone) {
$zones[] = new WC_Shipping_Zone($raw_zone);
}
$zones[] = new WC_Shipping_Zone(0); // ADD ZONE "0" MANUALLY
return $zones;
}
function ud_shipping($rates) {
$free = array();
$my_min_amount = "";
/*
Woocommerce-Setting
Get the free shipping value, if enabled
*/
$my_min_amount = "";
foreach (ud_get_all_shipping_zones() as $zone) {
$zone_shipping_methods = $zone->get_shipping_methods(); // SEE BELOW
foreach ($zone_shipping_methods as $index => $method) {
$method_is_enabled = $method->is_enabled();
$method_title = $method->get_method_title(); // e.g. "Flat Rate"
$instance = $method->instance_settings;
if ("Kostenlose Lieferung" == $method_title && "true" == $method_is_enabled) {
if (array_key_exists('requires', $instance)) :
$my_requires = $instance['requires']; // min_amount as value
if (array_key_exists($my_requires, $instance)) : // min_amount also as key
$my_min_amount = intval($instance[$my_requires]); // 49 (CHF)
endif;
endif;
}
}
}
/*
Cart
Free shipping, if only(!) free shipping items on cart, else shipping flat rate
Free shipping, if subtotal higher then $my_min_amount, else shipping flat rate
local pickup everytime
*/
$my_free_shipping = true;
// check items
foreach (WC()->cart->get_cart() as $cart_item) {
$product_id = $cart_item['product_id'];
$_product = wc_get_product($product_id);
$shipclass = $_product->get_shipping_class();
if ($shipclass != "versandkostenfrei") :
$my_free_shipping = false;
endif;
}
// check subtotal
$my_cart_subtotal = intval(WC()->cart->subtotal);
if ($my_min_amount !="") :
if ($my_cart_subtotal > $my_min_amount) :
$my_free_shipping = true;
endif;
endif;
if($my_free_shipping == true):
foreach ($rates as $rate_key => $rate) {
if ($rate->method_id == 'local_pickup') {
$free[$rate_key] = $rate;
}
if($rate->method_id == 'flat_rate') {
$new_cost = 0;
$rates[$rate_key]->label = "Kostenlose Lieferung";
$rates[$rate_key]->cost = $new_cost;
$free[$rate_key] = $rate;
}
}
endif;
return !empty($free) ? $free : $rates;
}
add_filter('woocommerce_package_rates', 'ud_shipping', 100);
Weiterführende Links, weil wir wissen, dass du nach Stunden des Scrollens auf dieser Seite unbedingt noch mehr lesen möchtest:
Mike Jolley: Hide shipping rates when free shipping is available
Kulturbanause: Andere Versandarten entfernen, wenn kostenlose Lieferung verfügbar ist