运输方式更改的 Woocommerce 更新费用
Woocommerce update fee on shipping method change
我有一个网店,有 2 种运输方式和 3 个支付网关。我设法配置了它们的依赖项,因此它们的工作方式如下:
- local_pickup 仅允许 "cop"
- wbs 允许 "cod" 和 "bacs"
- "cod" 仅适用于我的国家,因此对于其他国家 wbs 仅允许 "bacs"
"cod" 有一个固定的附加费用,当我点击 "cod" 时它被正确应用。当我将付款方式从 "cod" 切换到 "bacs" 时,费用会按预期从购物车中移除。当客户选择 "cod" 并从 wbs 切换到 local_pickup 或当他在 "cod" 被选中。购物车已刷新,但费用仍然存在。我试图为 $woocommerce->session->fees
设置空数组,但没有帮助。我感觉是session值没有更新造成的,因为刷新浏览器费用就消失了。
这是我的支付网关条件代码和额外费用代码:
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');
因此,在努力解决这个问题之后,我找到了一个非常简单的解决方案,有点 "dirty hack",但它确实有效,所以我们开始吧..
首先,jQuery 代码取自用于 "Pay for Payment" 费用的插件。后来我意识到,不需要 $.ajax
部分,它根本不起作用:)
其次,删除插件时添加了shipping_method
部分来触发购物车刷新,因为可以通过一个小功能添加费用。后来我发现,这不行,因为输入的名称是shipping_method[0]
(这就是为什么运输方式总是一个数组,而支付网关是一个字符串)
最后,在结合所有发现之后,我找到了一个解决方案,我只是 "fake" 刷新购物车之前的支付网关,因此 Woocommerce 认为选择了正确的网关(而事实上它没有' t 存在于当前视图中)并删除 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);
}
});
我有一个网店,有 2 种运输方式和 3 个支付网关。我设法配置了它们的依赖项,因此它们的工作方式如下:
- local_pickup 仅允许 "cop"
- wbs 允许 "cod" 和 "bacs"
- "cod" 仅适用于我的国家,因此对于其他国家 wbs 仅允许 "bacs"
"cod" 有一个固定的附加费用,当我点击 "cod" 时它被正确应用。当我将付款方式从 "cod" 切换到 "bacs" 时,费用会按预期从购物车中移除。当客户选择 "cod" 并从 wbs 切换到 local_pickup 或当他在 "cod" 被选中。购物车已刷新,但费用仍然存在。我试图为 $woocommerce->session->fees
设置空数组,但没有帮助。我感觉是session值没有更新造成的,因为刷新浏览器费用就消失了。
这是我的支付网关条件代码和额外费用代码:
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');
因此,在努力解决这个问题之后,我找到了一个非常简单的解决方案,有点 "dirty hack",但它确实有效,所以我们开始吧..
首先,jQuery 代码取自用于 "Pay for Payment" 费用的插件。后来我意识到,不需要 $.ajax
部分,它根本不起作用:)
其次,删除插件时添加了shipping_method
部分来触发购物车刷新,因为可以通过一个小功能添加费用。后来我发现,这不行,因为输入的名称是shipping_method[0]
(这就是为什么运输方式总是一个数组,而支付网关是一个字符串)
最后,在结合所有发现之后,我找到了一个解决方案,我只是 "fake" 刷新购物车之前的支付网关,因此 Woocommerce 认为选择了正确的网关(而事实上它没有' t 存在于当前视图中)并删除 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);
}
});