编辑了我的问题以便更好地理解
woocommerce 有以下两种运输方式:
- 免运费
- 预付运费(3 美元)
另外,我有两条规则来决定是免费送货还是提前送货。
- 一个简单的。如果购物车总额超过 50 美元。
一个复杂的。假设基于以下功能进行检查
function complex_rule() { // 简化示例
if ( get_current_user_id() < 50 ) { return true; 否则{返回假;} }
我的第一次尝试不起作用如下:
function enable_free_shipping( $cart_object ) {
if( WC()->cart->get_subtotal() > 50 || complex_rule() ) {
WC()->session->set('chosen_shipping_methods', array( 'free_shipping' ) );
}
}
add_action( 'woocommerce_before_calculate_totals', 'enable_free_shipping', 99 );
不幸的是,它不起作用。我没有具体的错误。它只是忽略了这两个规则。
基于以下答案,我也尝试了这个,但为了简化问题并确保函数没有任何问题complex_rule()
,我只保留了最低金额规则。
这是代码:
add_filter( 'woocommerce_package_rates', 'conditional_free_shipping', 100, 2 );
function conditional_free_shipping( $rates, $package ) {
// Set the min Order amount for free shipping
$min_order_amount = 50;
$cart_subtotal = (float) WC()->cart->get_subtotal(); // Subtotal excl. taxes
$free = array();
$free_key = '';
// Loop through shipping rates
foreach ( $rates as $rate_id => $rate ) {
if ( 'free_shipping' === $rate->method_id ) {
// Your conditions goes bellow
if ( $cart_subtotal >= $min_order_amount ) {
$free[ $rate_id ] = $rate;
}
$free_key = $rate_id;
break;
}
}
// No free shipping (Other shipping methods only)
if( empty( $free ) ) {
unset($rates[$free_key]);
return $rates;
}
// Only free shipping
else
return $free;
}
通过上述方法,我得到了高于最低金额的预期结果(仅限免费送货方式),但问题在于低于该金额的情况。
预期结果:获取提前发货方式
我得到了什么:没有找到运输选项
所有这些都在带有空子主题的新 Woocommerce 安装中进行了测试(functions.php 中没有其他代码)