代码之家  ›  专栏  ›  技术社区  ›  Rhob Gatchalian

我如何建立一个特定的支付网关,以便在woocommerce上免费发货

  •  3
  • Rhob Gatchalian  · 技术社区  · 8 年前

    -其他支付网关的“统一费率” .

    我的问题是:

    例如,如本截图所示:

    See Screenshot


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

    1 回复  |  直到 8 年前
        1
  •  3
  •   Kodaloid    8 年前

    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');
      }
    }
    

    将上述代码另存为 bacs免费送货。php

    基本上,这做的是检查会话以查看选择了哪种付款方式,然后如果 bacs 选择的方法是加上一笔费用,该费用减去总运费。这是可行的,但因为购物车使用AJAX更新,所以需要触发 update_checkout 每次付款方式更改时,都会以JavaScript将事件附加到正文,以查看上面购物车中反映的更改。

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