我想看看当购物车中有特定运输类别的产品时是否可以禁用所有/特定运输选项。但是,此规则仅适用于特定产品是购物车中的唯一商品时。如果存在任何其他产品,则会显示默认的运输选项。这是我以前用过的
add_filter( 'woocommerce_package_rates', 'custom_hide_shipping_for_shipping_class', 9999, 2 );
function custom_hide_shipping_for_shipping_class( $rates, $package ) {
$shipping_class_target = 569; // shipping class ID
$in_cart = false;
foreach ( WC()->cart->get_cart_contents() as $key => $values ) {
if ( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) {
$in_cart = true;
break;
}
}
if ( $in_cart ) {
unset( $rates['free_shipping:8'] ); // shipping method with ID
}
return $rates;
}
但是,尽管购物车中有其他产品,上述代码仍然有效。我只希望当特定产品是购物车中的唯一商品时才可以使用此功能。
上面的代码可以调整还是需要不同的方法?
任何帮助/建议将不胜感激。
要使其正常工作,仅当特定产品是购物车中的唯一商品时,请尝试以下操作:
add_filter( 'woocommerce_package_rates', 'custom_hide_shipping_for_shipping_class', 900, 2 );
function custom_hide_shipping_for_shipping_class( $rates, $package ) {
$targeted_shipping_class = 569; // shipping class ID
$targeted_shipping_method = 'free_shipping:8'; // shipping method rate ID
$found = false;
foreach ( $package['contents'] as $item ) {
if ( $item['data']->get_shipping_class_id() == $targeted_shipping_class ) {
$found = true;
} else {
return $rates;
}
}
if ( $found && isset($rates[$targeted_shipping_method]) ) {
unset($rates[$targeted_shipping_method]);
}
return $rates;
}
应该可以。