代码之家  ›  专栏  ›  技术社区  ›  Mario83

在WooCommerce中检索最高的运输等级并折扣其他等级

  •  1
  • Mario83  · 技术社区  · 6 年前

    我想给购物车里所有的运输类加上50%的折扣,除了最高的运输类。

    如果我在购物车中有3种产品,每种产品都有自己的运输类定价,比如p1=150美元;p2=200美元;p3=300美元。预计运费总额为:(p1/50%)+(p2/50%)+p3(最贵)=475美元

    带有ID1、ID2、ID3的产品不应打折,即使它们的运输类别比购物车中的其他产品便宜。这些产品的运输应始终全额收费。

    首先,我尝试使用Shipping Class Slug为单个Shipping Class添加折扣,我的问题可以在这里找到[问题]: Shipping cost discount based on a shipping classes in Woocommerce

    但我不知道如何在购物车中找到最高(最昂贵)的运输等级,并将所有其他运输等级的折扣率降低50%,因为每次在最昂贵的购物车中都可能有不同的运输等级(具有不同的段塞)。

    我一直在研究在这里找到的WoomCommerce API文档 https://docs.woocommerce.com/wc-apidocs/class-WC_Shipping_Method.html 但我不知道哪种方法对我的情况有帮助。

    这是一个与这个未回答的问题非常相似的请求。 Woocommerce shipping - multiple item discount with different prices per class

    除了最贵的那种,有没有办法把所有的运输类价格都打折?

    1 回复  |  直到 6 年前
        1
  •  1
  •   code_learn    6 年前

    这可能不是最好的方法,但它是有效的。由于我无法以更聪明的方式获得运输类成本,我使用了 运输类别描述字段 作为一个值。所以如果“中等”课程的成本是80,我的描述也是80。

    假设您只使用一种运输方式“统一费率”,这就是有效的代码。

    add_filter('woocommerce_package_rates', 'shipping_costs_discounted_based_on_shipping_class', 10, 2);
    function shipping_costs_discounted_based_on_shipping_class( $rates, $package ){
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return $rates;
        $shipping           = new \WC_Shipping();
        $shipping_classes   = $shipping->get_shipping_classes();
        $all_shipping_costs = array();
    
        foreach( $package['contents'] as $cart_item ) {
            foreach($shipping_classes as $shipping_class) {
                if( $cart_item['data']->get_shipping_class() == $shipping_class->slug )
                array_push($all_shipping_costs, $shipping_class->description);
            }
        }
        $max_value=max($all_shipping_costs);
        $new_rate=$max_value + (array_sum($all_shipping_costs)-$max_value)*0.50;
        foreach ( $rates as $rate_key => $rate ){
                if( 'flat_rate' === $rate->method_id  ){
                $rates[$rate_key]->cost = $new_rate;
                }
            }
    
        return $rates;
    
    }
    

    再一次,这是一个可行的解决方案,但不是最好的。

    注意:后端的“运输类别描述”字段需要与“运输成本”字段具有完全相同的值!