Der Versand wird nach dem Gewicht der Artikel im Warenkorb und der Menge im Warenkorb berechnet

Lesezeit: 4 Minuten

Der Versand wird nach dem Gewicht der Artikel im Warenkorb
Spion

Auf einer WooCommerce-Kundenwebsite ist die kostenlose Versandmethode für Bestellungen bis zu 250 aktiviert. Ich verwende den folgenden Code (aus dieser Antwort)um andere Versandkosten auszublenden, wenn der Bestellwert über 250 liegt, außer wenn sich schwere Artikel im Warenkorb befinden.

add_filter( 'woocommerce_package_rates', 'conditionally_hide_other_shipping_based_on_items_weight', 100, 1 );
function conditionally_hide_other_shipping_based_on_items_weight( $rates ) {
    // targeted weight
    $target_product_weight = 12;
    $target_cart_amount = 250;

    WC()->cart->subtotal_ex_tax >= $target_cart_amount ? $passed = true : $passed = false ;

    // Iterating trough cart items to get the weight for each item
    foreach(WC()->cart->get_cart() as $cart_item){
        if( $cart_item['variation_id'] > 0)
            $item_id = $cart_item['variation_id'];
        else
            $item_id = $cart_item['product_id'];

        // Getting the product weight
        $product_weight = get_post_meta( $item_id , '_weight', true);

        if( !empty($product_weight) && $product_weight >= $target_cart_amount ){
            $light_products_only = false;
            break;
        }
        else $light_products_only = true;
    }

    // If 'free_shipping' method is available and if products are not heavy
    // and cart amout up to the target limit, we hide other methods
    $free = array();
    foreach ( $rates as $rate_id => $rate ) {
        if ( 'free_shipping' === $rate->method_id && $passed && $light_products_only ) {
            $free[ $rate_id ] = $rate;
            break;
        }
    }

    return ! empty( $free ) ? $free : $rates;
}

Aber jetzt möchte ich einen variablen Versandbetrag festlegen, der auf 2 Arten berechnet wird:

  • Wenn der Bestellwert unter 250 liegt, wird 1 Euro pro Kilo auf das Gesamtgewicht der Bestellartikel berechnet.
  • Bei einem Bestellwert von bis zu 250 wird nur das Gewicht schwerer Artikel berechnet (1 Euro pro Kilo). Wenn es keine schweren Artikel gibt, ist der kostenlose Versandtarif verfügbar.

Wie kann ich das erreichen, da es ein bisschen kompliziert ist?
Jede Spur zu folgen?

Ich habe einige vorhandene verwandte Plugins ausprobiert, aber sie sind für diesen Fall nicht geeignet.

Danke.

Der Versand wird nach dem Gewicht der Artikel im Warenkorb
LoicTheAztec

Code verbessert (im März 2019):

Ja, das ist ohne Plugin mit einem Custom möglich VERSANDKOSTENberechnet nach dem Gewicht der Artikel im Einkaufswagen und der Menge im Einkaufswagen … Aber Sie müssen einen haben 'Flat rate' Versandart mit einer minimalen Menge einstellen. Dies sollte normalerweise mit dem von Ihnen verwendeten Code funktionieren.

Hier ist dieser Code (kommentiert):

//Adding a custom Shipping Fee to cart based conditionaly on weight and cart amount
add_action('woocommerce_cart_calculate_fees', 'custom_conditional_shipping_fee', 10, 1);
function custom_conditional_shipping_fee( $cart ){

    ## --- YOUR SETTINGS --- ##
    $targeted_weight      = 20;  // Your targeted "heavy" product weight
    $targeted_cart_amount = 250; // Your targeted cart amount
    $price_per_kg         = 1;   // Price by Kg;
    $flat_rate_price      = 10;  // Set the cost like in 'flat rate' shipping method

    // Initializing variables
    $fee = $calculated_weight = 0;

    // For cart SUBTOTAL amount EXCLUDING TAXES
    $passed = $cart->subtotal_ex_tax >= $targeted_cart_amount ? true : false ;

    // For cart SUBTOTAL amount INCLUDING TAXES (replace by this):
    // $passed = $cart->subtotal >= $targeted_cart_amount ? true : false ;

    // Iterating through each cart items
    foreach( $cart->get_cart() as $cart_item ){
        // The Product weight
        $product_weight = $cart_item['data']->get_weight();

        // cart item weight
        $cart_item_weight = $cart_item['quantity'] * $cart_item['data']->get_weight();

        // When cart amount is up to 250, Adding weight of heavy items
        if($passed && $product_weight > $targeted_weight)
            $calculated_weight += $cart_item_weight;
    }

    #### Making the fee calculation ####

    // Cart is up to 250 with heavy items
    if ( $passed && $calculated_weight != 0 ) {
        // Fee is based on cumulated weight of heavy items
        $fee = ( $calculated_weight * $price_per_kg ) - $flat_rate_price;
    }
    // Cart is below 250
    elseif ( ! $passed ) {
        // Fee is based on cart total weight
        $fee = ( $cart->get_cart_contents_weight( ) * $price_per_kg ) - $flat_rate_price;
    }

    #### APPLYING THE CALCULATED FEE ####

    // When cart is below 250 or when there is heavy items
    if ($fee > 0){
        // Rounding the fee
        $fee = round( $fee );
        // This shipping fee is taxable (You can have it not taxable changing last argument to false)
        $cart->add_fee( __('Shipping weight fee', 'woocommerce'), $fee, true);
    }
}

Code geht in die function.php-Datei Ihres aktiven Child-Themes (oder Themes) oder auch in jede Plugin-Datei.

Dieser Code ist getestet und funktioniert

Der minimale ‘Flatrate’-Betrag wird von der Gebührenberechnung abgezogen, so der Kunde den richtigen Preis zahlen.

  • Ich danke dir sehr!

    – spionieren

    22. Februar 2017 um 17:41 Uhr

  • ist richtig, wenn ich sage, dass dies die Plugin-Funktion Table Rate Shipping ersetzt?

    – Solomax

    6. März 2019 um 14:56 Uhr

  • Ich hätte gerne denselben Code, aber wenn das Gewicht über 10 kg liegt, berechnen wir, alles darunter ist kostenlos. Und wenn die Bestellsumme unter 20 USD liegt, berechnen wir 5 USD

    – Solomax

    6. März 2019 um 15:14 Uhr

  • @Solomax … Erster Kommentar: Tut mir leid, ich verstehe nicht… Zweiter Kommentar: Sie sollten zuerst versuchen, den Code zu ändern, um das zu bekommen, was Sie wollen… Wenn Sie es nicht zum Laufen bringen, stellen Sie eine neue Frage, die mit diesem Antwort-Thread verknüpft ist, und fügen Sie hinzu Ihren modifizierten Code-Intent mit den notwendigen Erklärungen.

    – LoicTheAztec

    6. März 2019 um 15:14 Uhr


1004880cookie-checkDer Versand wird nach dem Gewicht der Artikel im Warenkorb und der Menge im Warenkorb berechnet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy