运输方式更改的Woocommerce更新费用

时间:2017-06-08 19:22:47

标签: php woocommerce hook-woocommerce

我有一个拥有2种送货方式和3个支付网关的电子商店。我设法配置它们的依赖项,因此它们的工作方式如下:

  1. local_pickup 允许"警察"仅
  2. wbs 允许" cod"和" bacs"
  3. "鳕鱼"仅适用于我的国家/地区,因此对于其他人来说 wbs 允许" bacs"仅
  4. "鳕鱼"有一个固定的额外费用,当我点击" cod"时正确应用。当我从" cod"切换付款时至" bacs",按预期从购物车中移除费用。当客户有" cod"选择并从 wbs 切换到 local_pickup ,或者当他在" cod"被选中。购物车刷新,但费用仍然存在。我试图为$woocommerce->session->fees设置空数组,但它没有帮助。我觉得它是由未更新的会话值引起的,因为在浏览器刷新时费用会消失。

    以下是支付网关条件和额外费用的代码:

    function wc_local_available_payment_gateways( $gateways ) {
      global $woocommerce;
      $chosen_shipping_rates = $woocommerce->session->get('chosen_shipping_methods' );
      $country = $woocommerce->customer->get_country();
    
      if($country == "SK") {
        $method = (is_array($chosen_shipping_rates)) ? $chosen_shipping_rates : 
        array($chosen_shipping_rates);
        if (in_array('local_pickup:1', $chosen_shipping_rates )) {
            unset( $gateways['bacs'] );
            unset( $gateways['cod'] );
        }
      }
      else {
        unset( $gateways['cod'] );
      }
      return $gateways;
    }
    add_filter( 'woocommerce_available_payment_gateways', 'wc_local_available_payment_gateways' );
    
    function add_extra_cart_fee( $cart_object ) {
      global $woocommerce;
      $payment = $woocommerce->session->get('chosen_payment_method');
      $spfee = 0.60;
      if($payment == "cod") $woocommerce->cart->add_fee( 'Extra fee', $spfee, false );
    }
    add_action( 'woocommerce_cart_calculate_fees', 'add_extra_cart_fee' ,10,1 );
    
    function print_autoload_js(){
      ?><script type="text/javascript">
        jQuery(document).ready(function($){
          $(document.body).on('change', 'input[name="payment_method"]', function() {
          $('body').trigger('update_checkout');
          $.ajax( $fragment_refresh );
        });
        $(document.body).on('change', 'input[name="shipping_method"]', function() {
          $('body').trigger('update_checkout');
          $.ajax( $fragment_refresh );
        });
       });
      </script><?php 
    }
    add_action( 'woocommerce_review_order_after_submit' , 'print_autoload_js');
    

1 个答案:

答案 0 :(得分:0)

所以,在努力解决这个问题之后,我找到了一个非常简单的解决方案,这个解决方案有点像肮脏的黑客&#34;,但是它在我们这里工作了......

首先,jQuery代码取自用于&#34;支付付款的插件&#34;费用。后来我意识到,$.ajax部分不需要,而且根本不工作:)

其次,添加shipping_method部分以在我删除插件时触发购物车刷新,因为费用可以通过小功能添加。后来我意识到,它不起作用,因为输入名称是shipping_method[0](这就是为什么送货方法总是一个数组,而支付网关是一个字符串)

最后,在结合所有调查结果后,我找到了一个解决方案,我只是简单地假装&#34;购物车刷新之前的支付网关,因此Woocommerce认为选择了正确的网关(实际上它并不存在于当前视图中)并且取消了cod网关的费用。

$(document.body).on('change', 'input[name="shipping_method[0]"], #shipping_country, #billing_country', function() {
  if($('#shipping_method_0_local_pickup1').is(':checked')) {
    $('#payment_method_bacs').val('cp').prop('checked', true);
  }
});