WooCommerce中的有条件免费送货方式

问题描述 投票:-3回答:1

编辑我的问题以便更好地理解

woocommerce有以下两种运输方式:

  • 免费送货
  • 提前发货($ 3)

另外,我有两个规则来决定我是否会免费送货或提前发货。

  • 一个简单的。如果购物车总额超过50美元。
  • 一个复杂的。假设基于以下函数检查 function complex_rule(){//简化示例 if(get_current_user_id()<50){return true;别的{return 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中没有其他代码)

php wordpress woocommerce cart shipping-method
1个回答
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 );
?>
© www.soinside.com 2019 - 2024. All rights reserved.