如何在 WooCommerce 中添加自定义运输方式
已发表: 2020-09-01如果您熟悉 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 的新插件。
- 首先,您需要打开wp-content > plugins并创建一个新文件夹。 为此,我将使用名称njengah -shipping
- 然后,您需要创建一个同名的文件njengah –shipping.php
- 在此文件中添加以下代码:
<?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 从数据库中加载后很容易被覆盖。
- 其他方法留空,因为我们将在本教程后面定义它们。
然后,您需要使用以下步骤激活插件:
- 登录您的 WordPress 站点并以管理员用户身份访问仪表板。
- 从仪表板菜单中,单击插件并激活 Njengah shipping,如下所示:
- 激活插件后转到WooCommerce > Settings 。 单击 WooCommerce 选项卡,然后单击NjengahPlus shipping 。 你应该能够看到这个:
b) 设置国家可用性
我们创建的运输方式仅在先前确定的国家列表中可用。
- 在方法 __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' ) ), ); }
要检查结果,请按照下列步骤操作:
- 登录到您的 WordPress 网站并以管理员用户身份访问仪表板从仪表板菜单中,单击WooCommerce > 设置
- 单击Shipping选项卡,然后单击 NjengahPlus Shipping,如下所示:
- 启用复选框并保存更改。
我们可以将运输方式设置为最大 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,以便您了解每一步。
- 首先,我们需要按重量计算成本。 为此,只需将此代码添加到方法 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; } }
- 从上面的代码中,我们得到了基于购物车重量的成本,我们必须计算所选运输国家的成本。 为此,请添加以下代码:
<?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; }
- 我们已经按总重量计算了成本,我们还加上了运输国家的成本。 最后一步是添加此代码以注册费率。
代码如何运作
在本节的第一个片段中,我们定义了一些起始变量: $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 中添加自定义运输方式的解决方案。
类似文章
- 如何在 WooCommerce 中的产品上添加 GTIN 编号
- 如何删除已添加到您的购物车消息 WooCommerce
- 如何在 WooCommerce 结帐页面上添加信任或安全徽标
- WooCommerce 注销而不确认:如何删除“您确定要注销吗?”
- 如何在没有插件的情况下重定向 WordPress 页面?
- 如何添加产品图片 WooCommerce 结帐页面
- 如何在 WooCommerce 中设置特色产品
- 如何隐藏 WooCommerce 优惠券代码字段
- 如何按类别显示 WooCommerce 产品
- 如何在 WooCommerce 的商店页面中隐藏所有产品
- 如何对 WooCommerce 类别进行排序以获得更好的用户体验
- 如何使用 WooCommerce 销售数字产品
- 如何更改 WooCommerce 的“已添加到购物车”通知
- 如何禁用特定类别的付款方式
- 为您的商店提供 30 多个最佳 WooCommerce 插件(大多数是免费的)
- 如何在 WooCommerce 中重命名订单状态消息
- 用于结帐页面定制的 23 个最佳 WooCommerce 插件
- 如何删除默认产品排序 WooCommerce
- 如何检查插件在 WordPress 中是否处于活动状态 [3 种方式]