Реальный пример: покупатель купил в корзине следующие товары:
Мой клиент использует плагин для доставки с табличным тарифом, он может рассчитать стоимость доставки только по общему весу содержимого корзины, в данном случае это 3,0 кг.
Но реальный платный вес составляет всего 2,6 кг …
Обыскал все и не смог найти какую-либо функцию для расчета промежуточной суммы веса товаров в корзине для определенного класса доставки, поэтому только что разработал следующую функцию, но, похоже, она не работает. Может ли кто-нибудь помочь улучшить эту функцию?
// calculate cart weight for certain shipping class only
if (! function_exists('get_cart_shipping_class_weight')) {
function get_cart_shipping_class_weight() {
$weight = 0;
foreach ( $this->get_cart() as $cart_item_key => $values ) {
if ( $value['data']->get_shipping_class() == 'shipping-from-XX' ) {
if ( $values['data']->has_weight() ) {
$weight += (float) $values['data']->get_weight() * $values['quantity'];
}
}
return apply_filters( 'woocommerce_cart_contents_weight', $weight );
}
}
}
// end of calculate cart weight for certain shipping class
Обновить (ошибка опечатки была исправлена).
Чтобы это работало, вам нужно использовать выделенный woocommerce_cart_contents_weight
зацепить фильтр в пользовательской зацепленной функции следующим образом:
add_filter( 'woocommerce_cart_contents_weight', 'custom_cart_contents_weight', 10, 1 );
function custom_cart_contents_weight( $weight ) {
$weight = 0;
foreach ( WC()->cart->get_cart() as $cart_item ) {
$product = $cart_item['data'];
if ( $product->get_shipping_class() == 'shipping-from-XX' && $product->has_weight() ) {
$weight += (float) $product->get_weight() * $cart_item['quantity'];
}
}
return $weight;
}
Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Это должно работать сейчас.
Спасибо @Loic TheAztec, просто нужно удалить лишний «->», возможно, ваша ошибка опечатки, тогда все работает отлично, кредит пойдет на @LoicTheAztec! Поэтому правильный код должен быть следующим:
//Alter calculated cart items total weight for a specific shipping class
add_filter( 'woocommerce_cart_contents_weight', 'custom_cart_contents_weight', 10, 1 );
function custom_cart_contents_weight( $weight ) {
$weight = 0;
foreach ( WC()->cart->get_cart() as $cart_item ) {
$product = $cart_item['data'];
if ( $product->get_shipping_class() == 'shipping-from-xx' && $product->has_weight() ) {
// just remember to change this above shipping class name 'shipping-from-xx' to the one you want, use shipping slug
$weight += (float) $product->get_weight() * $cart_item['quantity'];
}
}
return $weight;
}