【问题标题】:Woocommerce update fee on shipping method changeWoocommerce 更改运输方式的更新费
【发布时间】:2017-06-08 19:22:46
【问题描述】:

我有一个具有 2 种运输方式和 3 个支付网关的 eshop。我设法配置了它们的依赖关系,因此它们的工作方式如下:

  1. local_pickup 只允许“警察”
  2. wbs 允许“cod”和“bacs”
  3. “cod”仅适用于我的国家/地区,因此对于其他国家/地区 wbs 仅允许“bacs”

“cod”有一个固定的附加费用,当我点击“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');

【问题讨论】:

  • 我刚刚回答了我的问题,但我仍然愿意接受另一种解决此行为的方法

标签: php woocommerce hook-woocommerce


【解决方案1】:

所以,在解决了这个问题之后,我找到了一个非常简单的解决方案,它有点“肮脏的黑客”,但它确实有效,所以我们开始吧..

首先,jQuery 代码取自一个用于“支付付款”费用的插件。后来我意识到,$.ajax 部分是不需要的,它根本不起作用:)

其次,在我删除插件时添加了shipping_method部分以触发购物车刷新,因为可以通过一个小功能添加费用。后来才知道,不行,因为输入的名字是shipping_method[0](所以发货方式总是数组,而支付网关是字符串)

最后,在综合所有发现后,我找到了一个解决方案,我只是在购物车刷新之前“伪造”支付网关,因此 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);
  }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2018-04-27
    • 2022-01-20
    相关资源
    最近更新 更多