WooCommerce – Das geänderte Warenkorbgewicht wirkt sich nicht auf die Versandkosten aus

Lesezeit: 4 Minuten

Benutzer-Avatar
Simon Conti

Guten Abend. Ich habe einen Code geschrieben, um das Gesamtgewicht einiger bestimmter Artikel in meinem Warenkorb zu ändern (aufgrund einer bestimmten Anfrage des Kuriers). Bevor Sie fragen … nein, ich kann das Einzelartikelgewicht nicht ändern, da ich ein Sondergewicht für die Verpackung berechnen muss. Ja, es ist eine lange Geschichte,

Mein Code sieht so aus (vereinfachte Version):

function set_my_weight($weight) {
  global $woocommerce;
  $cart_items = $woocommerce->cart->get_cart(); 
  $addedWeight = 0;

  echo "prev: ". $weight;
  foreach($cart_items as $prod => $values):
     if(conditions):
       $addedWeight += 1.5;
     endif;
  endforeach;

  $weight += $addedWeight;
  echo "final: ". $weight;

  return $weight;
}
add_filter('woocommerce_cart_contents_weight', 'set_my_weight',10,1);

Wenn ich den Wert anrufe echo
echo WC()->cart->cart_contents_weight; Alles scheint gut zu funktionieren, aber aus irgendeinem Grund ändern sich die Versandkosten nicht. Ich verwende das Plugin “WooCommerce Weight Based Shipping”, um meine Versandkosten zu verwalten.

Warum wird das neue Gewicht vom Plugin ignoriert?

Vielen Dank

Benutzer-Avatar
LoicTheAztec

Da WooCommerce Weight Based Shipping ein Drittanbieter-Plugin ist, gibt es verschiedene Möglichkeiten, Kostenänderungen basierend auf dem Warenkorbgewicht zu berechnen.

Hier unten sind 2 Möglichkeiten, das Wagengewicht zu ändern.

1) Gesamtgewicht des Warenkorbinhalts ändern:

add_filter( 'woocommerce_cart_contents_weight', 'filter_wc_cart_contents_weight', 10000 );
function filter_wc_cart_contents_weight( $weight ) {
    $condition    = true; // Only for testing
    $extra_weight = 1.5;

    // Loop through cart items
    foreach(WC()->cart->get_cart() as $cart_item ) {
        $quantity = $cart_item['quantity']; // If needed

        if( $condition ) {
            $weight += $extra_weight;
        }
    }
    return $weight;
}

// For testing: display the total weight after order total in cart page (Ajax updated)
add_action( 'woocommerce_cart_totals_after_order_total', 'display_wc_cart_total_weight_after_order_total' );
function display_wc_cart_total_weight_after_order_total() {
    ?>
    <tr class="order-total">
        <th><?php esc_html_e( 'Total weight', 'woocommerce' ); ?></th>
        <td data-title="<?php esc_attr_e( 'Total weight', 'woocommerce' ); ?>"><?php echo wc_format_weight( WC()->cart->get_cart_contents_weight() ); ?></td>
    </tr>
    <?php
}

Der Code wird in die Datei functions.php Ihres aktiven untergeordneten Designs (oder aktiven Designs) eingefügt. Getestet und funktioniert.


2) Gewicht der Warenkorbartikel ändern:

add_action( 'woocommerce_before_calculate_totals', 'conditionally_change_tax_class', 10000 );
function conditionally_change_tax_class( $cart ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // Required since Woocommerce version 3.2 for cart items properties changes
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    $condition    = true; // Only for testing
    $extra_weight = 1.5;

    // Looo through our specific cart item keys
    foreach ( $cart->get_cart() as $cart_item ) {
        // get product weight
        $weight = (float) $cart_item['data']->get_weight();

        // Set the new product weight
        $cart_item['data']->set_weight( $weight + ( $extra_weight / $cart_item['quantity'] ) );
    }
}

// For testing display the total weight after order total
add_action( 'woocommerce_cart_totals_after_order_total', 'display_wc_cart_total_weight_after_order_total' );
function display_wc_cart_total_weight_after_order_total() {
    ?>
    <tr class="order-total">
        <th><?php esc_html_e( 'Total weight', 'woocommerce' ); ?></th>
        <td data-title="<?php esc_attr_e( 'Total weight', 'woocommerce' ); ?>"><?php echo wc_format_weight( WC()->cart->get_cart_contents_weight() ); ?></td>
    </tr>
    <?php
}

Der Code wird in die Datei functions.php Ihres aktiven untergeordneten Designs (oder aktiven Designs) eingefügt. Getestet und funktioniert.


Wenn das Plugin WooCommerce Weight Based Shipping jetzt das Gewicht von jedem Produkt erhält, können Sie das Warenkorbgewicht nicht ändern, also die Versandkosten.

  • Vielen Dank. Ihr Code funktioniert … meiner. Ich habe festgestellt, dass das Problem in dem Plugin liegt, das ich verwende, um die Versandkosten basierend auf dem Gewicht zu berechnen. Ich habe einen kurzen Blick auf den Code geworfen, und er scheint nicht nach dem Wagengewicht zu suchen; es summiert stattdessen alle Gewichte der einzelnen Produkte, und das ist ein wirklich großes Problem für mich. Ich muss bestimmte Mengen (Kisten) beschweren, daher kann ich das zusätzliche Gewicht nicht auf einzelne Produkte aufteilen. Ich habe die Entwickler des Plugins kontaktiert.

    – Simone Conti

    9. Juni 2020 um 13:54 Uhr

  • @SimoneConti Ich habe meine Antwort geändert… Überprüfen Sie es bitte. Nun, da Sie sagen, dass sie ihre Berechnungen anhand des Produktgewichts vornehmen, wird es nicht möglich sein, die gewünschten Änderungen vorzunehmen.

    – LoicTheAztec

    9. Juni 2020 um 13:59 Uhr


  • Danke für deine Antwort. Ich versuche, den Code des Plugins zu ändern, um meine Bedürfnisse widerzuspiegeln. Natürlich werde ich es in Zukunft nicht mehr aktualisieren können …

    – Simone Conti

    9. Juni 2020 um 15:01 Uhr

Wenn Sie dies verwenden Gewichtsbasierter WooCommerce-Versand Plugin,

Die Antworten von @LoicTheAztec könnten funktionieren, wenn Sie die Warenkorbdaten frühzeitig ändern
WC()->cart->calculate_shipping() die den Haken verwendet woocommerce_checkout_update_order_review.

add_action( 'woocommerce_checkout_update_order_review', 'conditionally_change_tax_class', 10000 );

Quelle: woocommerce/includes/class-wc-ajax.php

1019560cookie-checkWooCommerce – Das geänderte Warenkorbgewicht wirkt sich nicht auf die Versandkosten aus

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

Privacy policy