如何让特定的支付网关在 woocommerce 上免费送货
How do I make a specific payment gateway to be free shipping on woocommerce
对于那些运输方式,我想要:
- "Free shipping" 仅适用于货到付款 (COD) 付款方式(我只是将其重命名为其他标签,但我使用的是 COD 网关)。
- "Flat rate" 对于其他支付网关 (当然不包括 COD 支付方式).
我的问题:如何让特定的支付网关在选择时免运费?
例如在这个截图中:
类似的未回答问题:Woocommerce free shipping based on payment gateway selected
WooCommerce 要求在网关之前选择运输,这就是 COD 的工作方式,因为它会在提供 COD 作为选项之前检查是否选择了启用的运输方式。因此,如果 COD 方法对您不起作用,那么就没有其他方法可以做到这一点,因为您要求结帐流程从它的设计方式倒退。
由于 WooCommerce 的工作方式,一旦选择了支付网关,您就无法修改运费。您只能在每个网关的代码中添加额外费用。
想了一会儿,我很好奇,想来一场戏,看看是不是真的不可能。事实证明,通过一些粗略的黑客攻击,您实际上可以让它工作,这是一个可以完成任务的基本插件:
<?php
/**
* Plugin Name: Free Shipping For BACS
* Description: Makes shipping for BACS free.
* Version: 0.0.1
* Author: Kodaloid
* Requires at least: 4.4
* Tested up to: 4.8
*/
if (!defined('ABSPATH')) exit;
add_action('init', 'fg_init');
function fg_init() {
add_action('woocommerce_cart_calculate_fees', 'fg_add_fee');
add_action('wp_footer', 'fg_footer', 9999);
}
function fg_footer() {
?>
<script type="text/javascript">
jQuery(function($) {
setInterval(function() {
$(".input-radio[name='payment_method']").off().change(function() {
console.log('triggered');
jQuery('body').trigger('update_checkout');
});
}, 500);
});
</script>
<?php
}
function fg_add_fee($the_cart) {
global $woocommerce;
if ($woocommerce->session->chosen_payment_method == 'bacs') {
$woocommerce->cart->add_fee('Free Shipping For BACS', -($the_cart->shipping_total), true, 'standard');
}
}
将上面的代码保存为 free_shipping_for_bacs.php 并使用 WordPress 中的上传插件功能安装插件。
基本上,它所做的是检查会话以查看选择了哪种付款方式,然后如果选择了 bacs
方法,则会添加一笔费用,该费用减去运费总额。这行得通,但是因为购物车使用 AJAX 更新,所以每次付款方式更改时,您都需要触发附加到 JavaScript 正文的 update_checkout
事件,以便看到购物车中反映的更改以上。
所以作为 hack,我添加了一个循环,每 500 毫秒将更改处理程序重新添加到页脚事件(如果您的主题没有实现 wp_footer 挂钩,请确保添加它),这可以如果您决定使用此代码,应该加以改进,因为有更好的方法来检查更改事件是否需要重新添加,只是我今天没有太多时间。
幸田
对于那些运输方式,我想要: - "Free shipping" 仅适用于货到付款 (COD) 付款方式(我只是将其重命名为其他标签,但我使用的是 COD 网关)。 - "Flat rate" 对于其他支付网关 (当然不包括 COD 支付方式).
我的问题:如何让特定的支付网关在选择时免运费?
例如在这个截图中:
类似的未回答问题:Woocommerce free shipping based on payment gateway selected
WooCommerce 要求在网关之前选择运输,这就是 COD 的工作方式,因为它会在提供 COD 作为选项之前检查是否选择了启用的运输方式。因此,如果 COD 方法对您不起作用,那么就没有其他方法可以做到这一点,因为您要求结帐流程从它的设计方式倒退。
由于 WooCommerce 的工作方式,一旦选择了支付网关,您就无法修改运费。您只能在每个网关的代码中添加额外费用。
想了一会儿,我很好奇,想来一场戏,看看是不是真的不可能。事实证明,通过一些粗略的黑客攻击,您实际上可以让它工作,这是一个可以完成任务的基本插件:
<?php
/**
* Plugin Name: Free Shipping For BACS
* Description: Makes shipping for BACS free.
* Version: 0.0.1
* Author: Kodaloid
* Requires at least: 4.4
* Tested up to: 4.8
*/
if (!defined('ABSPATH')) exit;
add_action('init', 'fg_init');
function fg_init() {
add_action('woocommerce_cart_calculate_fees', 'fg_add_fee');
add_action('wp_footer', 'fg_footer', 9999);
}
function fg_footer() {
?>
<script type="text/javascript">
jQuery(function($) {
setInterval(function() {
$(".input-radio[name='payment_method']").off().change(function() {
console.log('triggered');
jQuery('body').trigger('update_checkout');
});
}, 500);
});
</script>
<?php
}
function fg_add_fee($the_cart) {
global $woocommerce;
if ($woocommerce->session->chosen_payment_method == 'bacs') {
$woocommerce->cart->add_fee('Free Shipping For BACS', -($the_cart->shipping_total), true, 'standard');
}
}
将上面的代码保存为 free_shipping_for_bacs.php 并使用 WordPress 中的上传插件功能安装插件。
基本上,它所做的是检查会话以查看选择了哪种付款方式,然后如果选择了 bacs
方法,则会添加一笔费用,该费用减去运费总额。这行得通,但是因为购物车使用 AJAX 更新,所以每次付款方式更改时,您都需要触发附加到 JavaScript 正文的 update_checkout
事件,以便看到购物车中反映的更改以上。
所以作为 hack,我添加了一个循环,每 500 毫秒将更改处理程序重新添加到页脚事件(如果您的主题没有实现 wp_footer 挂钩,请确保添加它),这可以如果您决定使用此代码,应该加以改进,因为有更好的方法来检查更改事件是否需要重新添加,只是我今天没有太多时间。
幸田