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