如何在 WooCommerce 中添加自定义运输方式

已发表: 2020-09-01

WooCommerce 添加自定义运输方式 如果您熟悉 WooCommerce,您就会知道它是一个很棒的免费电子商务解决方案,具有一组非常有用的功能。 突出的是 WooCommerce 在开发时考虑了可扩展性,类似于 WordPress 的模块化。

但是,如果您需要 WooCommerce 提供的额外内容,您通常会发现 WooCommerce 无法满足您的所有需求,例如,如果您想添加自定义运输方式。 不过,不要担心,因为在这个简短的教程中,您将学习如何为 WooCommerce 创建一个简单的运输方法,它将计算运输成本。

此外,您将学习如何为我们的插件添加一些限制,以便某些国家/地区可以使用运输方式。

运输方式的自定义运输规则

在本节中,我们将为我们将用于创建代码的运输方式创建自定义运输规则。 我们将定义运输方式如何计算成本以及它可以运送到哪里。 这意味着成本将取决于我们需要运送到的重量和区域。

对于这个例子,我们将运送到美国、加拿大、德国、英国、意大利、西班牙和肯尼亚。 肯尼亚将成为我们的 0 区 10 美元,意大利 1 区 30 美元,西班牙 2 区 50 美元,英国 2 区 50 美元,美国和加拿大 3 区 70 美元。

对于重量,我们将定价如下:0-10公斤免费,11-30公斤5美元,31-50公斤10美元,51-100公斤20美元。

您可能已经准备好开始编码,但还没有! 首先,您需要了解WooCommerce Shipping API 。 当您想要创建自定义运输方式时,您需要从 WooCommerce 抽象类 WC_Shipping_Method 扩展该类。 它有一些定义的属性,它们是:

  • $id :我们的运输的 ID(slug,关键字),这是必需的。
  • $number :这是一个整数 ID。
  • $method_title :我们在管理员中显示的运输名称。
  • $method_description :在管理员中显示的我们运输的简短描述(可选)。
  • $enabled : String Boolean,“yes”或“no”,它提供了我们的运输是否启用以及是否可以使用的信息。
  • $title :用于在我们的网站上显示我们的运输名称。
  • $availability :这定义了运输是否可用。
  • $countries :启用此方法的国家/地区数组。 默认值为空数组。
  • $tax_status :默认值是应税的。 如果一个项目是应税的,那么将收取税款。
  • $fee : 默认值为 0
  • $minimum_fee :该方法的最低费用,默认值为 null。
  • $has_settings :这定义了这个方法是否有任何设置。 默认值是true。
  • $supports :包含此方法支持的功能的数组。 默认值为空数组。
  • $rates :一系列费率,必须填充以注册运费。 默认值为空数组。

WC_Shipping_Method 中定义的方法是:

  • is_taxable() :这将返回我们是否需要在运费之上计算税金。
  • add_rate( $args = array() ) :这会将参数 $args 中定义的运费推送到属性 $rates 中。
  • has_settings() :这将返回属性 $has_settings 的值。
  • is_available() :如果可以送货,并且在属性 $countries 中设置了国家,并且属性 $availability 设置为包括、特定或排除的值,则返回 true 或 false .
  • get_title() :这将返回此运输的标题。
  • get_fee( $fee, $total ) :这将根据解析的 $fee 和 $total 返回此次运输的费用值。
  • supports( $feature ) :如果此运输方法支持某个功能,则返回。

因为WC_Shipping_Method类扩展了WC_Settings_API类,所以属性和方法比较多,为了简单起见,这里不做解释。

此外,还需要定义其他方法,以便运输可以获取或设置设置并计算运输的实际成本。 此处列出的这些方法:

  • init() :这将创建表单字段和设置。 但是,它可以有不同的命名,只要我们使用它里面的方法,并在__constructor方法中调用它。
  • calculate_shipping( $package ) :此方法用于计算此运输的成本,而 package 是一个包含要运输的产品的数组。

我想把重点放在calculate_shipping 方法上。 对于我们的示例,我们将使用此方法并将其添加到 add_rate 方法中。 此方法将接受具有多个选项的数组,例如:

  • id :这是费率的 ID。
  • label :这是费率的标签。
  • cost : 运费金额。
  • taxes :它接受一系列税或不接受税,因此税由 WooCommerce 计算。 如果你不希望它接受税收,它可以接受虚假。
  • calc_tax :这接受 per_order 或 per_item。 如果您使用 per_item,则需要提供一系列成本。

我们将使用 WordPress 过滤器来获取将我们的运输方法添加到已注册方法的数组中的数组,方法是使用在 WooCommerce 插件中定义的 WordPress 过滤器传递我们的类的名称。 该过滤器称为 woocommerce_shipping_methods。

有了这些,现在让我们进入这个简短教程的编码部分,这样您就可以理解我将要分享的 PHP 片段中的整个概念。

a) 创建新运输类别的步骤

在本节中,我们将创建我们的运输方式作为扩展 WooCommerce 的新插件。

  1. 首先,您需要打开wp-content > plugins并创建一个新文件夹。 为此,我将使用名称njengah -shipping
  2. 然后,您需要创建一个同名的文件njengah –shipping.php
  3. 在此文件中添加以下代码:
 <?php

/**
* 插件名称:Njengah Shipping
* 插件 URI:https://njengah.com/plugins/
* 描述: 
* 版本:1.0.0
* 作者:乔恩杰加
* 作者 URI:https://njengah.com
s
*/

如果(!定义('WPINC')){

死;

}
/*
* 检查 WooCommerce 是否处于活动状态
*/
如果(in_array('woocommerce/woocommerce.php',apply_filters('active_plugins',get_option('active_plugins')))){

功能 njengahplus_shipping_method() {

如果(!class_exists('NjengahPlus_Shipping_Method')){

类 NjengahPlus_Shipping_Method 扩展 WC_Shipping_Method {

/**

*您的运输类别的构造函数

*

* @访问公共

* @return 无效

*/

公共函数 __construct() {

$this->id = 'njengahplus';

$this->method_title = __( 'NjengahPlus Shipping', 'njengahplus' );

$this->method_description = __( 'NjengahPlus 的自定义运输方式', 'njengahplus' );

$this->init();

$this->enabled = isset($this->settings['enabled']) ? $this->settings['enabled'] : '是';

$this->title = isset($this->settings['title']) ? $this->settings['title'] : __( 'NjengahShipping', 'njengahplus' );

}

/**
* 初始化你的设置
*
* @访问公共

* @return 无效

*/

函数初始化(){

// 加载设置 API

$this->init_form_fields();

$this->init_settings();

// 如果您有任何定义,请在管理员中保存设置

add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );

}


/**

* 定义此运输的设置字段

* @return 无效

*/

函数 init_form_fields() {

// 我们将在这里添加我们的设置

}

/**
* 此功能用于计算运费。 在这个函数中,我们可以检查重量、尺寸和其他参数。
*
* @访问公共
* @param 混合 $package
 @return 无效
*/

公共功能calculate_shipping($包){


// 我们将在这里添加成本、费率和逻辑

}

}

}

}


add_action('woocommerce_shipping_init', 'njengahplus_shipping_method');

功能 add_njengahplus_shipping_method( $methods ) {

$methods[] = 'NjengahPlus_Shipping_Method';
返回$方法;
}

add_filter(“woocommerce_shipping_methods”,“add_njengahplus_shipping_method”);

}

怎么运行的

  • 我们首先检查是否定义了常量 WPINC。 如果未定义,则表示有人试图直接或从某个位置(不是 WordPress)访问此文件。
  • 然后我们需要检查 WooCommerce 是否处于活动状态。 在这里,我们正在检查 woocommerce.php 是否在活动插件数组中,这些插件保存在数据库中的选项 active_plugins 下。
  • woocommerce_shipping_init 是 WooCommerce Shipping 的主要操作,其中包括实例化之前的所有运输类。 使用此操作将确保在 WooCommerce 初始化后包含我们的运输方式,并且在 WooCommerce 使用它的正确位置。
  • __construct 方法设置了一些通用属性,其中一些属性在方法 init 从数据库中加载后很容易被覆盖。
  • 其他方法留空,因为我们将在本教程后面定义它们。

然后,您需要使用以下步骤激活插件:

  1. 登录您的 WordPress 站点并以管理员用户身份访问仪表板
  2. 从仪表板菜单中,单击插件并激活 Njengah shipping,如下所示: 激活插件
  3. 激活插件后转到WooCommerce > Settings 。 单击 WooCommerce 选项卡,然后单击NjengahPlus shipping 。 你应该能够看到这个: 第一个代码的结果

b) 设置国家可用性

我们创建的运输方式仅在先前确定的国家列表中可用。

  1. 在方法 __construct 中添加
 <?php

//...

$this->method_description = __( 'NjengahPlus 的自定义运输方式', 'njengahplus' );

// 可用性和国家

$this->availability = '包括';

$this->国家=数组(

'US', // 美利坚合众国

'CA', // 加拿大

'DE', // 德国

'GB', // 英国

'IT', // 意大利

'ES', // 西班牙

'HR' // 肯尼亚

);

$this->init();

//...

代码如何运作

可用性属性设置为“包括”,因此此运输仅适用于国家属性中的国家/地区。

WooCommerce 将检查发货国家/地区是否包含在属性国家/地区中。

创建设置

您只需复制此代码并填充我们的方法 init_form_fields:

 <?php



函数 init_form_fields() {

$this->form_fields = 数组(

'启用' => 数组(

'title' => __('启用', 'njengahplus' ),

'类型' => '复选框',

'description' => __('启用此运输。', 'njengahplus' ),

'默认' => '是'

),


'标题' => 数组(

'标题' => __( '标题', 'njengahplus' ),

'类型' => '文本',

'description' => __( '要在网站上显示的标题', 'njengahplus' ),

'默认' => __( 'NjengahPlus Shipping', 'njengahplus' )

),


);


}

要检查结果,请按照下列步骤操作:

  1. 登录到您的 WordPress 网站并以管理员用户身份访问仪表板从仪表板菜单中,单击WooCommerce > 设置
  2. 单击Shipping选项卡,然后单击 NjengahPlus Shipping,如下所示: Njengah加运费
  3. 启用复选框并保存更改。

我们可以将运输方式设置为最大 100 公斤。 然后,如果该规则很快发生变化,我们将允许在设置中对其进行编辑。 设置后,设置代码将如下所示:

 <?php




函数 init_form_fields() {

$this->form_fields = 数组(

'启用' => 数组(

'title' => __('启用', 'njengahplus' ),

'类型' => '复选框',

'description' => __('启用此运输。', 'njengahplus' ),

'默认' => '是'

),


'标题' => 数组(

'标题' => __( '标题', 'njengahplus' ),

'类型' => '文本',

'description' => __( '要在网站上显示的标题', 'njengahplus' ),

'默认' => __( 'NjengahPlus Shipping', 'njengahplus' )

),


'重量' => 数组(

'title' => __( '体重 (kg)', 'njengahplus' ),

'类型' => '数字',

'description' => __('最大允许重量', 'njengahplus' ),

'默认' => 100

),


);

}

在上面的代码中,我们现在已经在设置下设置了最大权重。 这是结果: 最大重量

c) 计算运费

为了计算运费,我们将一步一步更新方法calculate_shipping,以便您了解每一步。

  1. 首先,我们需要按重量计算成本。 为此,只需将此代码添加到方法 calculate_shipping:
 <?php

//...

公共功能calculate_shipping($包){


$重量 = 0;

$成本 = 0;

$country = $package["destination"]["country"];

foreach ( $package['contents'] as $item_id => $values )

{

$_product = $values['data'];

$weight = $weight + $_product->get_weight() * $values['quantity'];

}

$weight = wc_get_weight($weight, 'kg' );

如果($重量<= 10){

$成本 = 0;

} elseif( $重量 <= 30 ) {

$成本 = 5;


} elseif( $重量 <= 50 ) {


$成本 = 10;


} 别的 {

$成本 = 20;

}

}
  1. 从上面的代码中,我们得到了基于购物车重量的成本,我们必须计算所选运输国家的成本。 为此,请添加以下代码:
 <?php


公共功能calculate_shipping($包){


$countryZones = 数组(

'HR' => 0,

'美国' => 3,

'GB' => 2,

'CA' => 3,

'ES' => 2,

'DE' => 1,

'它' => 1

);


$zonePrices = 数组(

0 => 10,

1 => 30,

2 => 50,

3 => 70

);


$zoneFromCountry = $countryZones[ $country ];

$priceFromZone = $zonePrices[ $zoneFromCountry ];


$cost += $priceFromZone;

}

  1. 我们已经按总重量计算了成本,我们还加上了运输国家的成本。 最后一步是添加此代码以注册费率。

代码如何运作

在本节的第一个片段中,我们定义了一些起始变量: $weight$cost$country 。 为了获得总数,我们通过迭代购物车并将购物车中每个产品的重量添加到变量$weight来获得总重量。

获得总重量后,我们使用function wc_get_weight将重量转换为公斤,因为这是我们的运输方法设置的单位,因此限制了重量。 然后最后一件事是将限制设置为100公斤。

在第二个片段中,数组$countryZones保存每个国家/地区的区域,第二个数组$zonePrices保存每个区域的价格。

这将是意大利 1 区的结果: 结果意大利

这将是西班牙 2 区的结果: 结果西班牙

这将是加拿大区的结果:

最终结果

如果你很难实现这段代码,这里是完整的代码:

 <?php


公共功能calculate_shipping($包){

$重量 = 0;

$成本 = 0;

$country = $package["destination"]["country"];

foreach ( $package['contents'] as $item_id => $values )

{

$_product = $values['data'];

$weight = $weight + $_product->get_weight() * $values['quantity'];

}
$weight = wc_get_weight($weight, 'kg' );

如果($重量<= 10){

$成本 = 0;

} elseif( $重量 <= 30 ) {

$成本 = 5;

} elseif( $重量 <= 50 ) {

$成本 = 10;

} 别的 {

$成本 = 20;

}

$countryZones = 数组(

'HR' => 0,

'美国' => 3,

'GB' => 2,

'CA' => 3,

'ES' => 2,

'DE' => 1,

'它' => 1

);




$zonePrices = 数组(

0 => 10,

1 => 30,

2 => 50,

3 => 70

);


$zoneFromCountry = $countryZones[ $country ];

$priceFromZone = $zonePrices[ $zoneFromCountry ];

$cost += $priceFromZone;

$率 = 数组(

'id' => $this->id,

'标签' => $this->title,

'成本' => $成本

);

$this->add_rate($rate);

}

结论

在这篇文章中,我们创建了一个自定义插件来在 WooCommerce 中添加自定义运输方式。 此外,我与您分享了 WooCommerce Shipping API,它使您能够通过简单的步骤创建您的运输方式。 此外,在计算运输方式的可用性或成本时,可以在运输方式中设置限制和可用性。 但是,可以使用 WooCommerce 操作在运输方式之外设置它们。 我希望本教程提供了在 WooCommerce 中添加自定义运输方式的解决方案。

类似文章