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

时间:2019-04-18 08:36:59

标签: php wordpress woocommerce cart shipping-method

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

woocommerce具有以下两种运输方式:

  • 免费送货
  • 预付运费($ 3)

此外,我有两个规则来决定是免费送货还是提前送货。

  • 一个简单的。如果购物车总额超过$ 50。​​
  • 复杂的。假设是根据以下功能检查的

    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中没有其他代码)

1 个答案:

答案 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 );
?>