为WooCommerce添加自定义快递/物流方法 (Shipping Method)
WooCommerce为我们提供了一个物流 API,可以让我们添加快递/物流方法,相对于WooCommerce支付网关API,这个API我们使用得不多,不过在一些特殊情况下,还是需要使用这个API 来加自定义物流/快递方法,实现一些特殊快递/物流方法的对接,比如我们下面要介绍的Ezship代取货付款服务,添加并启用 Ezship支付方法后,效果如下图所示。
添加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;
} );
添加自定义物流方法设置
如果需要为自定义快递方法添加一些设置,我么可以使用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快递/物流方法的代码,因为这个插件是为客户定制开发的,也没有开源插件代码的权利。如果上面的参考代码在使用过程中有什么不明白的,可以在留言中提出,我会尽量为大家说明。