取消设置基于购物车商品运输的 WooCommerce 运输方式 类
Unsetting WooCommerce shipping method based on cart items shipping classes
仅当购物车中有带和不带送货的产品时,我才尝试取消统一运费送货方式 class。如果购物车中的所有产品都有运费 class 那么它应该保留。
采用这种送货方式:统一运费 - (flat_rate1) (instance_id=1)
这些运输 classes:50、100 等等,以相同的方式命名为 Slugs:50、100…
统一运费运输方式已为这些运费设置成本 classes,主要成本和无运费 class 成本未设置此方法,因此它仅出现在购物车中的产品已设置发货 class。
成功了
add_filter( 'woocommerce_package_rates', 'unset_shipping_for_unmatched_items', 100, 2 );
function unset_shipping_for_unmatched_items( $rates, $package ) {
// Initialisation
$shipping_classes = array( 50, 100, 150, 200, 250, 300 );
$cart_items = WC()->cart->get_cart();
$cart_items_count = WC()->cart->get_cart_contents_count();
$items_match = false;
$inArray = 0;
$notInArray = 0;
foreach( $cart_items as $cart_item ){
if( in_array( $cart_item[ 'data' ]->get_shipping_class(), $shipping_classes ) && $cart_items_count > 1 ) {
$inArray++;
} else {
$notInArray++;
}
}
if( ( $cart_items_count == $notInArray ) || ( $cart_items_count == $inArray ) ){
$items_match = false;
} else {
$items_match = true;
}
if( $items_match )
unset( $rates['flat_rate:6'] );
return $rates;
}
在 WooCommerce 中,运输方式 ID 标签略有不同,我的意思是存在拼写错误。您需要在 slug 中的名称和数字之间添加 :
:'flat_rate6'
.
此外,一旦您获得匹配的购物车商品 class,您就可以 break
循环。
最后一件事:这个钩子有 2 个可用参数:$rates
和 $package
.
因此您的代码将是:
add_filter( 'woocommerce_package_rates', 'hide_shipping_when_class_is_in_cart', 100, 2 );
function hide_shipping_when_class_is_in_cart( $rates, $package ) {
// Initialisation
$shipping_classes = array( 50, 100, 150, 200, 250, 300 );
$class_exists = false;
foreach( WC()->cart->get_cart() as $cart_item )
if( in_array( $cart_item[ 'data' ]->get_shipping_class_id(), $shipping_classes ) ) {
$class_exists = true;
break; // Stop the loop
}
if( $class_exists )
unset( $rates['flat_rate:6'] );
return $rates;
}
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
现在应该可以了。
仅当购物车中有带和不带送货的产品时,我才尝试取消统一运费送货方式 class。如果购物车中的所有产品都有运费 class 那么它应该保留。
采用这种送货方式:统一运费 - (flat_rate1) (instance_id=1)
这些运输 classes:50、100 等等,以相同的方式命名为 Slugs:50、100…
统一运费运输方式已为这些运费设置成本 classes,主要成本和无运费 class 成本未设置此方法,因此它仅出现在购物车中的产品已设置发货 class。
成功了
add_filter( 'woocommerce_package_rates', 'unset_shipping_for_unmatched_items', 100, 2 );
function unset_shipping_for_unmatched_items( $rates, $package ) {
// Initialisation
$shipping_classes = array( 50, 100, 150, 200, 250, 300 );
$cart_items = WC()->cart->get_cart();
$cart_items_count = WC()->cart->get_cart_contents_count();
$items_match = false;
$inArray = 0;
$notInArray = 0;
foreach( $cart_items as $cart_item ){
if( in_array( $cart_item[ 'data' ]->get_shipping_class(), $shipping_classes ) && $cart_items_count > 1 ) {
$inArray++;
} else {
$notInArray++;
}
}
if( ( $cart_items_count == $notInArray ) || ( $cart_items_count == $inArray ) ){
$items_match = false;
} else {
$items_match = true;
}
if( $items_match )
unset( $rates['flat_rate:6'] );
return $rates;
}
在 WooCommerce 中,运输方式 ID 标签略有不同,我的意思是存在拼写错误。您需要在 slug 中的名称和数字之间添加 :
:'flat_rate6'
.
此外,一旦您获得匹配的购物车商品 class,您就可以 break
循环。
最后一件事:这个钩子有 2 个可用参数:$rates
和 $package
.
因此您的代码将是:
add_filter( 'woocommerce_package_rates', 'hide_shipping_when_class_is_in_cart', 100, 2 );
function hide_shipping_when_class_is_in_cart( $rates, $package ) {
// Initialisation
$shipping_classes = array( 50, 100, 150, 200, 250, 300 );
$class_exists = false;
foreach( WC()->cart->get_cart() as $cart_item )
if( in_array( $cart_item[ 'data' ]->get_shipping_class_id(), $shipping_classes ) ) {
$class_exists = true;
break; // Stop the loop
}
if( $class_exists )
unset( $rates['flat_rate:6'] );
return $rates;
}
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
现在应该可以了。