我正在尝试为购物车中除最高运费类别之外的所有运费类别提供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
的请求非常相似除了最昂贵的购物车以外,是否有一种方法可以在购物车上打折所有运输级别的价格?
答案 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;
}
再一次,这是一个可行的解决方案,但不是最佳解决方案。
注意:后端中的“运输类别描述”字段必须与“运输成本”字段具有完全相同的值!