Woocommerce Versandarten anpassen

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.

Homepage erstellen lassen | Webdesign | Schwyz | Zug | Luzern | Altdorf | ulrich.digital
Macht wenig Sinn: Kostenloser Versand wird angeboten, aber kostenpflichtige Versandoptionen bleiben sichtbar.

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.

Homepage für Kultur und Wirtschaft | Webdesign | Schwyz | Zug | Luzern | Altdorf | ulrich.digital
Versandkostenfreies und versandkostenpflichtiges Produkt

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.

Werbung | Webdesign | Schwyz | Zug | Luzern | Altdorf | ulrich.digital
Standardverhalten von WooCommerce: sobald sich ein versandkostenfreies Produkt im Warenkorb befindet, werden keine Versandkosten berechnet.
Homepage erstellen lassen | Webdesign | Schwyz | Zug | Luzern | Altdorf | ulrich.digital
Optimiertes Verhalten: wenn sich im Warenkorb nicht ausschließlich versandkostenfreie Produkte befinden, werden die Versandkosten berechnet

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

Business Bloomer: Get All Shipping Zones & Rates

1 Star2 Stars3 Stars4 Stars5 Stars (0)

Hast du den Beitrag genossen? Oder hast du währenddessen geschlafen? Lass es uns wissen und hinterlasse einen Kommentar!

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert