编辑了我的问题以更好地理解
woocommerce具有以下两种运输方式:
此外,我有两个规则来决定是免费送货还是提前送货。
复杂的。假设是根据以下功能检查的
function complex_rule(){
//简化示例
如果(get_current_user_id()<50){
返回true;
其他{
返回false;
}
}
我第一次失败的尝试是:
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 );
不幸的是,它不起作用。我没有特定的错误。它只是忽略了这两个规则。
我也基于following answer进行了尝试,但是为了简化问题,并确保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中没有其他代码)
答案 0 :(得分:0)
据我了解,您正试图在结帐时选择一定数量的免费送货。
您可以运行类似于以下功能的过滤器。这将隐藏其他送货方式,并在可用时选择免费送货。
<?php
function site_my_hide_shipping_when_free_is_available( $rates ) {
$free = array();
foreach ( $rates as $rate_id => $rate ) {
if ( 'free_shipping' === $rate->method_id ) {
$free[ $rate_id ] = $rate;
break;
}
}
return ! empty( $free ) ? $free : $rates;
}
add_filter( 'woocommerce_package_rates', 'site_my_hide_shipping_when_free_is_available', 100 );
?>