为WooCommerce添加自定义快递/物流方法 (Shipping Method)

quality,Q 70

WooCommerce为我们提供了一个物流 API,可以让我们添加快递/物流方法,相对于WooCommerce支付网关API,这个API我们使用得不多,不过在一些特殊情况下,还是需要使用这个API 来加自定义物流/快递方法,实现一些特殊快递/物流方法的对接,比如我们下面要介绍的Ezship代取货付款服务,添加并启用 Ezship支付方法后,效果如下图所示。

1649823100 23b045b6bd984a40d663faf48d08483c

添加WooCommerce自定义物流方法的基础代码

前段时间我为台湾一家提供代取货送货上门、代付款收款服务的Ezship网站开发了一款WooCommece插件,该插件集成了Ezship的支付网关,快递方法到WooCommece,并且在后台订单列表集成了Ezship实时物流状态。下面的示例代码就是其中添加快递/物流方式的主要代码。

<?php
/**
 * 判断WooCommerce是否已经激活
 */
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {

   add_action( 'woocommerce_shipping_init', 'your_shipping_method_init' );

   /**
    * 添加自定义物流方法
    */
   function your_shipping_method_init() {

      if ( ! class_exists( 'WC_Ezship_Shipping_Method' ) ) {

         /**
          * Ezship 快递方法
          *
          * A simple shipping method for Ezship.
          *
          * @class   WC_Shipping_Method
          * @version 2.6.0
          */
         class WC_Ezship_Shipping_Method extends WC_Shipping_Method {

            /**
             * WC_Ezship_Shipping_Method constructor.
             *
             * @param int $instance_id int 实例 ID
             */
            public function __construct( $instance_id = 0 ) {

               $this->id                 = 'ezship_shipping_method';
               $this->instance_id        = absint( $instance_id );
               $this->method_title       = 'Ezship 代取货';
               $this->method_description = 'Ezship 是台湾的一家提供商店代取货付款的快递服务公司。';

               $this->supports = [
                  'shipping-zones',
                  'instance-settings',
                  'instance-settings-modal',
               ];

               $this->init();

               $this->enabled = $this->get_option( 'enabled', 'yes' );
               $this->title   = $this->get_option( 'title', __( 'Ezship Shipping', 'woocommerce' ) );

            }


            /**
             * 初始化物流方法
             */
            public function init() {
               // 加载设置
               $this->init_form_fields();
               $this->init_settings();

               // 设置变量
               $this->min_amount = $this->get_option( 'min_amount', 0 );
               $this->requires   = $this->get_option( 'requires' );

               // Actions.
               add_action( 'woocommerce_update_options_shipping_' . $this->id, [ $this, 'process_admin_options' ] );
            }


            //... 此处省略了一些方法
            // 快递方法是否可用
            // 快递费计算

         }

      }

   }
}

上面的代码只是添加了快递方式,并没有把快递方式添加到可用的配送方式中,我们需要通过 woocommerce_shipping_methods Filter 钩子,把上面添加的自定义快递方式添加到可用的配送方式中,我们自定义的快递方式才会出现在添加配送方式的下拉选项中。

/**
 * 添加自己物流方法到WooCommerce物流方法中
 */
add_filter( 'woocommerce_shipping_methods', function ( $methods ) {
   $methods[ 'ezship_shipping_method' ] = 'WC_Ezship_Shipping_Method';

   return $methods;
} );
1649823100 ce16bdbe50303709ef4a5dfa1b416fae

添加自定义物流方法设置

如果需要为自定义快递方法添加一些设置,我么可以使用WooCommerce设置API 来添加一些自定义设置。比如下面的的代码,我们添加了是否启用物流方法的开关、物流方法的标题。在真实的插件中,还有是否启用物流跟踪的开关,最多代收多少费用的设置。

/**
 * 初始化表单字段
 */
public function init_form_fields() {

   $this->instance_form_fields = [

      'enabled' => [
         'title'       => '启用',
         'type'        => 'checkbox',
         'default'     => 'yes',
      ],

      'title' => [
         'title'       => '快递方法名称',
         'type'        => 'text',
         'default'     => $this->method_title,
         'desc_tip'    => true,
      ],

   ];

}

篇幅所限,上面的代码不是完整的添加WooCommerce快递/物流方法的代码,因为这个插件是为客户定制开发的,也没有开源插件代码的权利。如果上面的参考代码在使用过程中有什么不明白的,可以在留言中提出,我会尽量为大家说明。

类似文章