如何使特定支付网关在woocommerce上免费送货

时间:2017-09-08 17:08:25

标签: wordpress woocommerce payment-gateway checkout shipping

对于那些运输方式,我希望:   - "免运费"仅适用于货到付款(COD)付款方式(我只是将其重命名为其他标签,但我使用的是COD网关)。   - "统一费率"其他支付网关(当然不包括COD支付方式)

我的问题:如何选择特定支付网关免费送货?

例如,在此屏幕截图中:

See Screenshot

类似的未回答的问题:Woocommerce free shipping based on payment gateway selected

1 个答案:

答案 0 :(得分:2)

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事件,以便查看上方购物车中反映的更改。

所以作为一个黑客,我添加了一个循环,每隔500毫秒重新添加一个更改处理程序到页脚事件(如果你的主题没有实现wp_footer钩子,请确保添加它),这可以而且应该改进,如果您决定使用此代码,因为有更好的方法来检查更改事件是否需要重新添加,这只是我今天没有很多时间。