隐藏特定运费的免费送货 类 仅在 Woocommerce 中
Hide free shipping for specific shipping classes exclusively in Woocommerce
我们在 WooCommerce 中有各种各样的产品,其中一些不是我们自己提供的。我正在尝试设置一项功能,如果购物车中的产品属于“额外”运费 class exclusively.
,则禁用免费送货
如果有任何其他产品不在运费范围内 class 'Extra',仍然适用免费送货。因此,如果购物车中有 5 件产品全部带运费 class 'Extra' 而没有其他产品,则需支付 5 美元的费用。如果有任何其他产品不在该运送范围内 class,则再次适用免费运送。
我在互联网上搜索了解决方案,这是我目前得到的:
function hide_shipping_methods( $available_shipping_methods, $package ) {
$shipping_classes = array( 'Extra', 'some-shipping-class-2' );
$excluded_methods = array( 'free_shipping' );
$found = $others = false;
$shipping_class_exists = false;
foreach( $package['contents'] as $key => $value )
if ( in_array( $value['data']->get_shipping_class(), $shipping_classes ) ) {
$shipping_class_exists = true;
break;
}else {
$others = true; // NOT the shipping class
break;
}
if ( $shipping_class_exists && !others) {
$methods_to_exclude = array();
foreach( $available_shipping_methods as $method => $method_obj )
if ( in_array( $method_obj->method_id, $excluded_methods ) )
$methods_to_exclude[] = $method;
if ( $methods_to_exclude )
foreach ( $methods_to_exclude as $method )
unset( $available_shipping_methods[$method] );
}
return $available_shipping_methods;
}
add_filter( 'woocommerce_package_rates', 'hide_shipping_methods', 10, 2 );
但是它似乎不起作用。我的产品已经在发货 class Extra,但是每当我将它们添加到购物车时仍然免费送货。
有一些错误,您的代码可以简化。要禁用特定送货 类 独家 的免费送货,请尝试以下重新访问的代码:
add_filter( 'woocommerce_package_rates', 'hide_free_shipping_conditionally', 10, 2 );
function hide_free_shipping_conditionally( $rates, $package ) {
// Define the targeted shipping classes slugs (not names)
$targeted_classes = array( 'extra' );
$found = $others = false; // Initializing
// Loop through cart items for current shipping package
foreach( $package['contents'] as $item ) {
if ( in_array( $item['data']->get_shipping_class(), $targeted_classes ) ) {
$found = true;
} else {
$others = true;
}
}
// When there are only items from specific shipping classes exclusively
if ( $found && ! $others ) {
// Loop through shipping methods for current shipping package
foreach( $rates as $rate_key => $rate ) {
// Targetting Free shipping methods
if ( 'free_shipping' === $rate->method_id ) {
unset($rates[$rate_key]); // Remove free shipping option(s)
}
}
}
return $rates;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。应该可以。
别忘了清空购物车以刷新运输缓存数据。
我们在 WooCommerce 中有各种各样的产品,其中一些不是我们自己提供的。我正在尝试设置一项功能,如果购物车中的产品属于“额外”运费 class exclusively.
,则禁用免费送货如果有任何其他产品不在运费范围内 class 'Extra',仍然适用免费送货。因此,如果购物车中有 5 件产品全部带运费 class 'Extra' 而没有其他产品,则需支付 5 美元的费用。如果有任何其他产品不在该运送范围内 class,则再次适用免费运送。
我在互联网上搜索了解决方案,这是我目前得到的:
function hide_shipping_methods( $available_shipping_methods, $package ) {
$shipping_classes = array( 'Extra', 'some-shipping-class-2' );
$excluded_methods = array( 'free_shipping' );
$found = $others = false;
$shipping_class_exists = false;
foreach( $package['contents'] as $key => $value )
if ( in_array( $value['data']->get_shipping_class(), $shipping_classes ) ) {
$shipping_class_exists = true;
break;
}else {
$others = true; // NOT the shipping class
break;
}
if ( $shipping_class_exists && !others) {
$methods_to_exclude = array();
foreach( $available_shipping_methods as $method => $method_obj )
if ( in_array( $method_obj->method_id, $excluded_methods ) )
$methods_to_exclude[] = $method;
if ( $methods_to_exclude )
foreach ( $methods_to_exclude as $method )
unset( $available_shipping_methods[$method] );
}
return $available_shipping_methods;
}
add_filter( 'woocommerce_package_rates', 'hide_shipping_methods', 10, 2 );
但是它似乎不起作用。我的产品已经在发货 class Extra,但是每当我将它们添加到购物车时仍然免费送货。
有一些错误,您的代码可以简化。要禁用特定送货 类 独家 的免费送货,请尝试以下重新访问的代码:
add_filter( 'woocommerce_package_rates', 'hide_free_shipping_conditionally', 10, 2 );
function hide_free_shipping_conditionally( $rates, $package ) {
// Define the targeted shipping classes slugs (not names)
$targeted_classes = array( 'extra' );
$found = $others = false; // Initializing
// Loop through cart items for current shipping package
foreach( $package['contents'] as $item ) {
if ( in_array( $item['data']->get_shipping_class(), $targeted_classes ) ) {
$found = true;
} else {
$others = true;
}
}
// When there are only items from specific shipping classes exclusively
if ( $found && ! $others ) {
// Loop through shipping methods for current shipping package
foreach( $rates as $rate_key => $rate ) {
// Targetting Free shipping methods
if ( 'free_shipping' === $rate->method_id ) {
unset($rates[$rate_key]); // Remove free shipping option(s)
}
}
}
return $rates;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。应该可以。
别忘了清空购物车以刷新运输缓存数据。