我正在使用WooCommerce的WordPress网站上工作。我发现这段代码使我可以根据重量设置货运选项。如果在产品上选择了货运类别,则效果很好,直到客户也希望使用相同的货运选项。
add_filter( 'woocommerce_package_rates', 'bbloomer_woocommerce_tiered_shipping', 10, 2 );
function bbloomer_woocommerce_tiered_shipping( $rates, $package ) {
if ( WC()->cart->cart_contents_weight < 300 ) {
if ( isset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'], $rates['fedex:FEDEX_GROUND'] ) );
} else {
if ( isset( $rates['flat_rate:10'] ) ) unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND'] );
}
return $rates;
}
然后,我发现了另一段代码,可以将运输类别设置为运输选项。我发现的代码是指unset
可用的运输选项,但是我想isset
进行货运,因为我们是通过购物车重量unset
进行运输的。但是,我遇到了一个问题,即在不引起重大问题的情况下,无法再将货运类别设置为isset
。以下是我尝试进行的货运。
add_filter( 'woocommerce_package_rates', 'freight_shipping_class_only', 10, 2 );
function freight_shipping_class_only( $rates, $package ) {
$shipping_class_target = 193;
$in_cart = false;
foreach( WC()->cart->cart_contents as $key => $values ) {
if( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) {
$in_cart = true;
break;
}
}
if( $in_cart ) {
unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND'] ); // shipping method with ID (to find it, see screenshot below)
isset( $rates['flat_rate:10'] );
}
return $rates;
}
是否可以在一个功能中同时设置购物车重量和货运等级?这将是理想的,因为我希望他们两个通过unset
所有FedEx运送选项和isset
货运选项来做完全相同的事情。
请让我知道您是否需要我更清楚或有任何提示。
谢谢!
答案 0 :(得分:0)
我找到了一个解决方案,它不是我想要的,但它可以工作。我所做的就是将购物车的重量更改为超过300磅unset
的FedEx运送选项。然后为货运类别使用unset
FedEx货运选项。仍然使货运选项在非货运项目上可见,我使用CSS隐藏了该选项。
我仍然愿意寻求一种更好的方法。因此,如果您有建议,请发送给我。
下面是我最后要做的事情。
add_filter( 'woocommerce_package_rates', 'bbloomer_woocommerce_tiered_shipping', 10, 2 );
function bbloomer_woocommerce_tiered_shipping( $rates, $package ) {
if ( WC()->cart->cart_contents_weight < 300 ) {
if ( isset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'], $rates['fedex:FEDEX_GROUND'] ) );
} else {
if ( isset( $rates['flat_rate:10'] ) ) unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND'] );
}
return $rates;
}
/** Freight Shipping Class Only **/
add_filter( 'woocommerce_package_rates', 'freight_shipping_class_only', 10, 2 );
function freight_shipping_class_only( $rates, $package ) {
$shipping_class_target = 193;
$in_cart = false;
foreach( WC()->cart->cart_contents as $key => $values ) {
if( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) {
$in_cart = true;
break;
}
}
if( $in_cart ) {
unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND'] );
}
return $rates;
}
答案 1 :(得分:0)
由于您使用2次相同的钩子,因此可以简单地将函数合并为一个。
现在使用php
[isset()][1]
,您需要在IF
语句中使用它作为条件来检查变量是否已设置(存在),但仅在您的IF语句之外没有作用您的功能。因此在您的第一个函数中,以下内容无效:
if ( isset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'], $rates['fedex:FEDEX_GROUND'] ) );
因此,您可以尝试使用此紧凑高效的代码:
add_filter( 'woocommerce_package_rates', 'freight_shipping_class_only', 20, 2 );
function freight_shipping_class_only( $rates, $package ) {
// HERE the targeted shipping class ID
$targeted_shipping_class = 193;
// Loop through cart items and checking
$found = false;
foreach( $package['contents'] as $item ) {
if( $item['data']->get_shipping_class_id() == $targeted_shipping_class ){
$found = true;
break;
}
}
// The condition
if ( isset( $rates['flat_rate:10'] ) && ( WC()->cart->get_cart_contents_weight() >= 300 || $found ) ){
unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'], $rates['fedex:FEDEX_GROUND'] );
}
return $rates;
}
代码进入活动子主题(或活动主题)的function.php文件中。应该可以。