Unter den WooCommerce-Einstellungen lassen sich unter Versandzonen die gewünschten Versandarten festlegen. Dabei kann man unter bestimmten Bedingungen auch die kostenlose Lieferung anbieten – am häufigsten hier der Mindestbestellwert.
Unschöner weise wird dies allerdings im Warenkorb anschließend als auszuwählende Versandoption angezeigt, anstatt die hier angegebene Pauschale zu ersetzen. Das führt dazu, dass unwissende Kundschaft dies eventuell übersieht und sich anschließend über zu Unrecht gezahlte Versandkosten ärgert.
Leider gibt es im WordPress-Backend unter dem Reiter WooCommerce keinerlei Einstellungsmöglichkeit für dieses Problem. Um es zu lösen, wird in der functions.php deiner Webseite eine Funktion benötigt, die hier Abhilfe schafft.
<?php function my_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', 'my_hide_shipping_when_free_is_available', 100 );
Wenn du dieses Code-Snippet in deine functions.php einfügst, wird im Warenkorb nur noch „Kostenlose Lieferung“ angewendet, sobald die Bedingung für den kostenlosen Versand erfüllt wurde. So musst du dir keine Sorgen machen, dass deine Kunden fälschlicherweise Versand zahlen.
So ganz ist es damit allerdings noch nicht getan, denn das Hinzufügen dieses Codes wirft ein neues Problem auf:
Die verschiedenen Benutzerrollen verursachen hier, dass der kostenlose Versand nicht angezeigt wird. Da die kostenlose Lieferung an der Versandzone hängt, benötigt das Backend die Adresse des Nutzers, um die Versandzone richtig zuordnen zu können. Das bedeutet, dass Nutzer mit Account und eingetragener Liefer- bzw. Rechnungsadresse den Versand korrekt angezeigt bekommen. Als Gast Bestellende sehen jedoch nichts, wie im obigen Bild zu sehen ist.
Dies ist glücklicherweise leicht zu lösen, denn in den Versandoptionen unter dem Reiter WooCommerce im Dashboard gibt es eine Einstellung, die genau dies beschreibt. Wenn diese deaktiviert wird, wird der Versand auch für Gäste richtig angezeigt. Die Logik mutmaßt die richtige Versandzone in diesem Fall anhand der IP-Adresse des Nutzers.
Ein Online-Shop mit komplexeren Anforderungen bezüglich Rabatten und Versand kommt leider nicht immer ohne zusätzlichen Code oder Plugins aus. Die hier aufgezeigte Lösung stellt sicher, dass kostenloser Versand sich stets gegenüber anderen Möglichkeiten durchsetzt, wenn dessen Bedingungen erfüllt sind.
Falls es für die Versandzone z.B. Abholung vor Ort gibt, sollte diese natürlich neben jeglicher Art von Versandkosten als Auswahlmöglichkeit bestehen bleiben. In diesem Fall muss der oben genannte Code etwas modifiziert werden:
function v161_woocommerce_hide_shipping_method( $rates ) { $free = array(); $free_shipping = false; foreach ( $rates as $rate_id => $rate ) { if ( 'free_shipping' === $rate->method_id ) { $free[ $rate_id ] = $rate; $free_shipping = true; } if ( $free_shipping == true && 'my_custom_shipping_method' === $rate->method_id ) { $free[ $rate_id ] = $rate; } } return ! empty( $free ) ? $free : $rates; }
„‘my_custom_shipping_option‘ === $rate->method_id“ beschreibt hierbei die hier die gewünschte Versandoption, die nun zusätzlich zum kostenlosen Versand weiterhin angezeigt wird.
Sehr hilfreicher Code-Schnipsel für einen WooCommerce Shop. Danke.