根据特定运输的购物车商品数量显示或隐藏运输方式 class
Show or hide shipping methods based on number of cart items for specific shipping class
只有当购物车中有 4 件或更少的来自特定运输方式的产品时,我才尝试取消设置两种运输方式 class。
送货方式:flat_rate:20 和 flat_rate:21
运费Class:182
这是我的:
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 = 4;
// Shipping Methods To Hide
$method_key_ids = array('flat_rate:20', 'flat_rate:21');
// 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;
}
我想把上面的逻辑和下面的逻辑结合起来:
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;
}
创建以下逻辑:
1.如果购物车有 4 个或更少的产品在运输 class 181 取消设置以下运输方式:
- 'flat_rate:20'
- 'flat_rate:21'
2。如果购物车有 5 个或更多产品在运输 class 181 取消设置以下运输方式:
- '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'
如果我单独使用这两种代码,它们都有效。但是当我尝试同时使用两者时出现错误。
我收到以下错误: 无法重新声明 hide_shipping_method_based_on_shipping_class()(之前在 /functions.php:272 中声明)
我假设您已经通过一个接一个地编写这两个代码片段来组合它们。
由于您两次使用相同的函数名称,因此出现错误:无法重新声明.....
因此,您可以尝试通过重命名第二个代码段的函数名称来修复它 -
add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class_logic_2', 10, 2 );
function hide_shipping_method_based_on_shipping_class_logic_2( $rates, $package ) {
// other stuffs
}
您应该为每个代码片段使用不同的函数名称,但最好的方法是将所有内容合并到一个唯一的函数中。
以下是使其发挥独特功能的方法(对于来自特定运输方式的商品):
- 当购物车中的商品不超过 4 件时隐藏一些送货方式
- 当购物车中的商品不超过 4 件时隐藏一些其他运输方式
代码:
add_filter( 'woocommerce_package_rates', 'show_hide_shipping_methods_based_on_shipping_class', 10, 2 );
function show_hide_shipping_methods_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_ids1 = array( // Shipping Method rates Ids To Hide if more than 4 items are in cart
'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',
);
$shipping_rates_ids2 = array( // Shipping Method rates Ids to Hide if 4 or less items are in cart
'flat_rate:20',
'flat_rate:20',
);
$related_total_qty = 0; // Initializing
// 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 (more than 4 items)
foreach( $shipping_rates_ids1 as $shipping_rate_id ) {
if( isset($rates[$shipping_rate_id]) ) {
unset($rates[$shipping_rate_id]); // Remove Targeted Methods
}
}
} else {
// Hide related defined shipping methods (4 or less items)
foreach( $shipping_rates_ids2 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++;
只有当购物车中有 4 件或更少的来自特定运输方式的产品时,我才尝试取消设置两种运输方式 class。
送货方式:flat_rate:20 和 flat_rate:21
运费Class:182
这是我的:
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 = 4;
// Shipping Methods To Hide
$method_key_ids = array('flat_rate:20', 'flat_rate:21');
// 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;
}
我想把上面的逻辑和下面的逻辑结合起来:
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;
}
创建以下逻辑:
1.如果购物车有 4 个或更少的产品在运输 class 181 取消设置以下运输方式:
- 'flat_rate:20'
- 'flat_rate:21'
2。如果购物车有 5 个或更多产品在运输 class 181 取消设置以下运输方式:
- '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'
如果我单独使用这两种代码,它们都有效。但是当我尝试同时使用两者时出现错误。
我收到以下错误: 无法重新声明 hide_shipping_method_based_on_shipping_class()(之前在 /functions.php:272 中声明)
我假设您已经通过一个接一个地编写这两个代码片段来组合它们。
由于您两次使用相同的函数名称,因此出现错误:无法重新声明.....
因此,您可以尝试通过重命名第二个代码段的函数名称来修复它 -
add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class_logic_2', 10, 2 );
function hide_shipping_method_based_on_shipping_class_logic_2( $rates, $package ) {
// other stuffs
}
您应该为每个代码片段使用不同的函数名称,但最好的方法是将所有内容合并到一个唯一的函数中。
以下是使其发挥独特功能的方法(对于来自特定运输方式的商品):
- 当购物车中的商品不超过 4 件时隐藏一些送货方式
- 当购物车中的商品不超过 4 件时隐藏一些其他运输方式
代码:
add_filter( 'woocommerce_package_rates', 'show_hide_shipping_methods_based_on_shipping_class', 10, 2 );
function show_hide_shipping_methods_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_ids1 = array( // Shipping Method rates Ids To Hide if more than 4 items are in cart
'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',
);
$shipping_rates_ids2 = array( // Shipping Method rates Ids to Hide if 4 or less items are in cart
'flat_rate:20',
'flat_rate:20',
);
$related_total_qty = 0; // Initializing
// 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 (more than 4 items)
foreach( $shipping_rates_ids1 as $shipping_rate_id ) {
if( isset($rates[$shipping_rate_id]) ) {
unset($rates[$shipping_rate_id]); // Remove Targeted Methods
}
}
} else {
// Hide related defined shipping methods (4 or less items)
foreach( $shipping_rates_ids2 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++;