在WooCommerce中检索最高的运输类别并打折其他类别

时间:2018-10-22 10:55:20

标签: php wordpress woocommerce

我正在尝试为购物车中除最高运费类别之外的所有运费类别提供50%的折扣。

如果我的购物车中有3种产品,每种产品都有自己的运输等级价格,例如P1 = $ 150; P2 = $ 200; P3 = $ 300。预期的运费总和为:(P1 / 50%)+(P2 / 50%)+ P3(最昂贵的)= 475美元

ID1,ID2,ID3的产品,即使其运输等级比购物车中的其他产品便宜,也不应打折。这些产品的运输应始终充满电。

首先,我尝试使用运输舱塞为单个运输舱添加折扣,我的问题可以在此处找到[问题]:Shipping cost discount based on a shipping classes in Woocommerce

但是我不知道如何在购物车中检索最高(最昂贵)的运输类别,并将所有其他运输类别的折扣降低50%,因为每次每次运输中可能会有不同的运输类别(带有不同的弹头)最昂贵的购物车。

我一直在研究https://docs.woocommerce.com/wc-apidocs/class-WC_Shipping_Method.html处的WooCommerce API文档,但无法确定哪种方法对我的情况会有帮助。

与这个未回答的问题Woocommerce shipping - multiple item discount with different prices per class

的请求非常相似

除了最昂贵的购物车以外,是否有一种方法可以在购物车上打折所有运输级别的价格?

1 个答案:

答案 0 :(得分:1)

这可能不是最好的方法,但是可以。由于我无法以更明智的方式获得运费类别的费用,因此我使用了运费类别描述字段作为值。因此,如果“中级”课程的费用为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;

}

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

  

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