代码之家  ›  专栏  ›  技术社区  ›  Tony Tan

更改Woocommerce中特定装运类别的计算购物车项目总重量

  •  2
  • Tony Tan  · 技术社区  · 6 年前

    实例:一位客户在购物车中购买了以下产品:

    1. 产品A,重量:0.2kg,数量:2,装运类别:免费装运
    2. 产品B,重量:0.6kg,数量:3,装运类别:重量装运
    3. 产品C,重量:0.8kg,数量:1,装运类别:基于重量的装运

    我的客户使用的是一个table rate shipping插件,它只能通过使用购物车内容的总重量来计算运费,在这种情况下是3.0kg。

    但真正的可收费重量只有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 回复  |  直到 5 年前
        1
  •  1
  •   LoicTheAztec    6 年前

    使现代化 (打字错误已更正) .

    为了让它工作,你需要使用专用的 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;
    }
    

    代码进入函数。活动子主题(或活动主题)的php文件。现在应该可以了。

        2
  •  0
  •   LoicTheAztec    6 年前

    谢谢@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;
     }