如果购物车中有超过 4 件来自特定运输的商品,则隐藏一些运输方式 class
Hide some shipping methods if cart has more than 4 items from specific shipping class
场景如下:
我使用 UPS 运输成托盘的饮料。但是,要将 5 托盘的饮料装到盒子里变得非常困难。因此,我想禁用 UPS 运输方式,并且仅在客户订购 5 盘或更多托盘的饮料时才显示 Flat Rate Shipping。我有大约 7 种不同的饮料,但我可以将这些饮料添加到运输中 class 以简化代码。
我想扩展此代码以包含特定 class 中的产品数量,或者可能是运输中 class 中产品出现的次数。因此,如果购物车中有 5 种或更多的产品在此特定运输 class,它应该删除我在数组下指定的运输方式。
如何扩展此代码以包含产品数量?
// 如果我们发现运费class & 运费class中的产品数量等于或大于5.
add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package )
{
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Shipping Class To Find
$class = 182;
// Number Of Shipping Class Items In Cart
$amount = 5;
// Shipping Methods To Hide
$method_key_ids = array('wf_shipping_ups:07', 'wf_shipping_ups:08', 'wf_shipping_ups:11', 'wf_shipping_ups:54', 'wf_shipping_ups:65', 'wf_shipping_ups:70', 'wf_shipping_ups:74', 'free_shipping:2', 'request_shipping_quote');
// Checking In Cart Items
foreach( $package['contents'] as $item ) {
// If We Find The Shipping Class and Number of Items
if( $item['data']->get_shipping_class_id() == $class && count($package['contents']) >= $amount ){
foreach( $method_key_ids as $method_key_id ){
unset($rates[$method_key_id]); // Remove Targeted Methods
}
break; // Stop The Loop
}
}
return $rates;
}
编辑 - 添加:
自从我从 PluginHive 购买了“WooCommerce UPS Shipping Plugin with Print Label”后,我就可以访问他们的“Manage Shipping Methods”插件,它允许我执行以下操作:
设置多个规则以从各种运输方式中排除各种运输方式 classes。
第一次出现时打断顺序。
我设置的规则如下:
- 对于 Class 150(第一次出现时中断)- 未设置:
wf_shipping_ups:07,
wf_shipping_ups:08,
wf_shipping_ups:11,
wf_shipping_ups:54,
wf_shipping_ups:65,
wf_shipping_ups:70,
wf_shipping_ups:74,
free_shipping:2,
request_shipping_quote.
- 对于 Class 151 - 未设置:
flat_rate:20,
flat_rate:21.
我在上面的代码中为我要定位的产品创建了第三个 class 182。仅当添加到购物车的 class 中的商品少于 5 件时,才应将其视为 class 151。
但如果将 5 件或更多商品添加到购物车,则应视为 Class150。
这是我的困境。
可能的解决方案 - 添加:
我想出了解决问题的方法。如果购物车中的产品数量为 5 件或更多,代码 @LoicTheAztec 帮助我取消给定运输 class 的运输方式。
我现在需要做的是取消设置导致冲突的其他两种送货方式(flat_rate:20 和 flat_rate:21),对于相同的送货方式 class (182) 但是这购物车中产品数量为 4 或更少的时间 (=<)。
然后我可以使用现有的插件创建以下规则:
第一次出现中断(检查)
- 对于 Class 150 - 未设置:
wf_shipping_ups:07,
wf_shipping_ups:08,
wf_shipping_ups:11,
wf_shipping_ups:54,
wf_shipping_ups:65,
wf_shipping_ups:70,
wf_shipping_ups:74,
free_shipping:2,
request_shipping_quote.
- 对于 Class 182 - 未设置:
没有 - 因为两个代码都会创建逻辑
- 对于 Class 151 - 未设置:
flat_rate:20,
flat_rate:21.
这应该可以解决由插件引起的冲突。
百万美元的问题是......我能以某种方式使用@LoicTheAztec 的解决方案来设置某种最小数量吗?
如果来自特定运送 class 的商品总数为 5 件或更多,以下将隐藏特定定义的运送方式:
add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package ) {
$targeted_class_ids = array(182); // Shipping Class To Find
$allowed_max_qty = 4; // Max allowed quantity for the shipping class
$shipping_rates_ids = array( // Shipping Method rates Ids To Hide
'wf_shipping_ups:07',
'wf_shipping_ups:08',
'wf_shipping_ups:11',
'wf_shipping_ups:54',
'wf_shipping_ups:65',
'wf_shipping_ups:70',
'wf_shipping_ups:74',
'free_shipping:2',
'request_shipping_quote'
);
$related_total_qty = 0;
// Checking cart items for current package
foreach( $package['contents'] as $key => $cart_item ) {
if( in_array( $cart_item['data']->get_shipping_class_id(), $targeted_class_ids ) ){
$related_total_qty += $cart_item['quantity'];
}
}
// When total allowed quantity is more than allowed (for items from defined shipping classes)
if ( $related_total_qty > $allowed_max_qty ) {
// Hide related defined shipping methods
foreach( $shipping_rates_ids as $shipping_rate_id ) {
if( isset($rates[$shipping_rate_id]) ) {
unset($rates[$shipping_rate_id]); // Remove Targeted Methods
}
}
}
return $rates;
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。未经测试,它应该可以工作。
Refresh the shipping caches:
- This code is already saved on your functions.php file.
- In a shipping zone settings, disable / save any shipping method, then enable back / save.
You are done and you can test it.
处理物品数量而不是物品累计数量:
替换:
$related_total_qty += $cart_item['quantity'];
来自
$related_total_qty++;
场景如下:
我使用 UPS 运输成托盘的饮料。但是,要将 5 托盘的饮料装到盒子里变得非常困难。因此,我想禁用 UPS 运输方式,并且仅在客户订购 5 盘或更多托盘的饮料时才显示 Flat Rate Shipping。我有大约 7 种不同的饮料,但我可以将这些饮料添加到运输中 class 以简化代码。
我想扩展此代码以包含特定 class 中的产品数量,或者可能是运输中 class 中产品出现的次数。因此,如果购物车中有 5 种或更多的产品在此特定运输 class,它应该删除我在数组下指定的运输方式。
如何扩展此代码以包含产品数量?
// 如果我们发现运费class & 运费class中的产品数量等于或大于5.
add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package )
{
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Shipping Class To Find
$class = 182;
// Number Of Shipping Class Items In Cart
$amount = 5;
// Shipping Methods To Hide
$method_key_ids = array('wf_shipping_ups:07', 'wf_shipping_ups:08', 'wf_shipping_ups:11', 'wf_shipping_ups:54', 'wf_shipping_ups:65', 'wf_shipping_ups:70', 'wf_shipping_ups:74', 'free_shipping:2', 'request_shipping_quote');
// Checking In Cart Items
foreach( $package['contents'] as $item ) {
// If We Find The Shipping Class and Number of Items
if( $item['data']->get_shipping_class_id() == $class && count($package['contents']) >= $amount ){
foreach( $method_key_ids as $method_key_id ){
unset($rates[$method_key_id]); // Remove Targeted Methods
}
break; // Stop The Loop
}
}
return $rates;
}
编辑 - 添加:
自从我从 PluginHive 购买了“WooCommerce UPS Shipping Plugin with Print Label”后,我就可以访问他们的“Manage Shipping Methods”插件,它允许我执行以下操作:
设置多个规则以从各种运输方式中排除各种运输方式 classes。 第一次出现时打断顺序。
我设置的规则如下:
- 对于 Class 150(第一次出现时中断)- 未设置:
wf_shipping_ups:07, wf_shipping_ups:08, wf_shipping_ups:11, wf_shipping_ups:54, wf_shipping_ups:65, wf_shipping_ups:70, wf_shipping_ups:74, free_shipping:2, request_shipping_quote.
- 对于 Class 151 - 未设置: flat_rate:20, flat_rate:21.
我在上面的代码中为我要定位的产品创建了第三个 class 182。仅当添加到购物车的 class 中的商品少于 5 件时,才应将其视为 class 151。
但如果将 5 件或更多商品添加到购物车,则应视为 Class150。
这是我的困境。
可能的解决方案 - 添加:
我想出了解决问题的方法。如果购物车中的产品数量为 5 件或更多,代码 @LoicTheAztec 帮助我取消给定运输 class 的运输方式。
我现在需要做的是取消设置导致冲突的其他两种送货方式(flat_rate:20 和 flat_rate:21),对于相同的送货方式 class (182) 但是这购物车中产品数量为 4 或更少的时间 (=<)。
然后我可以使用现有的插件创建以下规则:
第一次出现中断(检查)
- 对于 Class 150 - 未设置:
wf_shipping_ups:07, wf_shipping_ups:08, wf_shipping_ups:11, wf_shipping_ups:54, wf_shipping_ups:65, wf_shipping_ups:70, wf_shipping_ups:74, free_shipping:2, request_shipping_quote.
- 对于 Class 182 - 未设置:
没有 - 因为两个代码都会创建逻辑
- 对于 Class 151 - 未设置:
flat_rate:20, flat_rate:21.
这应该可以解决由插件引起的冲突。
百万美元的问题是......我能以某种方式使用@LoicTheAztec 的解决方案来设置某种最小数量吗?
如果来自特定运送 class 的商品总数为 5 件或更多,以下将隐藏特定定义的运送方式:
add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package ) {
$targeted_class_ids = array(182); // Shipping Class To Find
$allowed_max_qty = 4; // Max allowed quantity for the shipping class
$shipping_rates_ids = array( // Shipping Method rates Ids To Hide
'wf_shipping_ups:07',
'wf_shipping_ups:08',
'wf_shipping_ups:11',
'wf_shipping_ups:54',
'wf_shipping_ups:65',
'wf_shipping_ups:70',
'wf_shipping_ups:74',
'free_shipping:2',
'request_shipping_quote'
);
$related_total_qty = 0;
// Checking cart items for current package
foreach( $package['contents'] as $key => $cart_item ) {
if( in_array( $cart_item['data']->get_shipping_class_id(), $targeted_class_ids ) ){
$related_total_qty += $cart_item['quantity'];
}
}
// When total allowed quantity is more than allowed (for items from defined shipping classes)
if ( $related_total_qty > $allowed_max_qty ) {
// Hide related defined shipping methods
foreach( $shipping_rates_ids as $shipping_rate_id ) {
if( isset($rates[$shipping_rate_id]) ) {
unset($rates[$shipping_rate_id]); // Remove Targeted Methods
}
}
}
return $rates;
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。未经测试,它应该可以工作。
Refresh the shipping caches:
- This code is already saved on your functions.php file.
- In a shipping zone settings, disable / save any shipping method, then enable back / save.
You are done and you can test it.
处理物品数量而不是物品累计数量:
替换:
$related_total_qty += $cart_item['quantity'];
来自
$related_total_qty++;