Изменение общего веса товаров в корзине для определенного класса доставки в Woocommerce - PullRequest
0 голосов
/ 26 мая 2018

Реальный пример: клиент купил следующие товары в корзине:

  1. продукт A, вес: 0,2 кг, Кол-во: 2, класс доставки: БЕСПЛАТНАЯ доставка
  2. продуктB, вес: 0,6 кг, Кол-во: 3, класс доставки: доставка на основе веса
  3. продукт C, вес: 0,8 кг, Кол-во: 1, класс доставки: доставка на основе веса

Мой клиент использует плагин для доставки с табличным тарифом, он может рассчитать стоимость доставки только по общему весу содержимого корзины, в данном случае это 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

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Спасибо @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;
 }
0 голосов
/ 26 мая 2018

Обновление (ошибка опечатки была исправлена) .

Чтобы это работало, вам нужно использовать выделенный 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 вашей активной дочерней темы (или активной темы).Это должно работать сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...