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
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.
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