Плата за обновление Woocommerce при изменении способа доставки

У меня есть интернет-магазин с двумя способами доставки и тремя способами оплаты. Мне удалось настроить их зависимости, поэтому они работают следующим образом:

  1. local_pickup разрешает только "полицейский"
  2. wbs позволяет использовать слова "cod" и "bacs".
  3. "cod" доступен только для моей страны, поэтому для других wbs допускает только "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');

person moped    schedule 08.06.2017    source источник
comment
Я только что ответил на свой вопрос, но я все еще открыт для альтернативного способа исправить это поведение   -  person moped    schedule 11.06.2017


Ответы (1)


Итак, после борьбы с этой проблемой, я пришел к довольно простому решению, которое немного похоже на «грязный хакер», но оно работает, так что поехали ...

Во-первых, код jQuery был взят из подключаемого модуля, используемого для комиссии «Pay for Payment». Позже я понял, что $.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);
  }
});
person moped    schedule 11.06.2017