如何在 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 中添加自定義運輸方式的解決方案。

類似文章