在 Magento 2 中設置高級發貨限制
已發表: 2017-05-17在本文中,我們將解釋如何在應用某些條件時隱藏運輸方式。
在某些情況下,店主可能希望限制運輸選項,因為:
- 產品尺寸和重量很大,因此不能以任何標準方式運輸,
- 冷凍儲存條件不允許及時交付產品
- 由於客戶所在的位置(國家、地區、城市),運輸受到限制
- C art Total不允許購物者有資格獲得任何運輸優惠,
- 等等
Magento 運輸選項的默認選擇不提供太大的靈活性。 只有在某些縣和地區或購物車總數小於設定金額時,才可以限制發貨。
如果您認為這還不夠,請繼續閱讀。
我會告訴你如何創建你自己的插件,讓你根據你的商業模式、目標和條件限制運輸選項。
筆記
我不會介紹為 Magento 2 創建擴展所需的具體步驟。您可以在此處或此處查看如何執行此操作。
為了動態禁用任何給定的運輸方式,我們需要在我們的擴展中添加一組新的類——它們是2 個插件。 第一個負責運輸方式驗證,第二個負責過濾它們。
簡而言之,每個未通過驗證的方法都將被標記為“ is_disabled ”,並且在下一步中,所有“ is_disabled ”方法都會被過濾並從主列表中刪除。
來吧。
* 由於我將要描述的方法基於Shipping Suite擴展中使用的原則,因此我將使用供應商的名稱“Mageworx”和擴展名“ShippingRules”。 筆記! 為了避免錯誤,你需要用你自己的名字替換那些!
首先,讓我們創建一個用於過濾的插件(類)。 以下是如何:
> MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\Append
命名空間 MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result; 類追加 { /** * @var \Magento\Checkout\Model\Session|\Magento\Backend\Model\Session\Quote */ 受保護的$會話; /** * @param \Magento\Checkout\Model\Session $checkoutSession * @param \Magento\Backend\Model\Session\Quote $backendQuoteSession * @param \Magento\Framework\App\State $state * @internal 參數會話 $session */ 公共函數 __construct( \Magento\Checkout\Model\Session $checkoutSession, \Magento\Backend\Model\Session\Quote $backendQuoteSession, \Magento\Framework\App\State $state ) { if ($state->getAreaCode() == \Magento\Framework\App\Area::AREA_ADMINHTML) { $this->session = $backendQuoteSession; } 別的 { $this->session = $checkoutSession; } } /** * 在附加之前驗證每種運輸方式。 * 如果驗證成功,則應用規則操作。 * 可以將某些規則標記為禁用。 禁用的規則將在課程中刪除 * @see MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates * 通過在 rate 對像中檢查此標記的值。 * * 注意:如果您對規則和運輸方式有一些問題,請從這裡開始調試。 * * @param \Magento\Shipping\Model\Rate\Result $subject * @param \Magento\Quote\Model\Quote\Address\RateResult\AbstractResult|\Magento\Shipping\Model\Rate\Result $result * @return 數組 */ 公共函數 beforeAppend($subject, $result) { if (!$result instanceof \Magento\Quote\Model\Quote\Address\RateResult\Method) { 返回[$結果]; } $filtableMethods = [ 'flatrate_flatrate', 'ups_XDM', 'ups_XPR', 'ups_WXS', 'carrier_method', // ... 在此處添加您的方法代碼 ]; $methodCode = $result->getCarrier() 。 '_' 。 $result->getMethod(); if (!in_array($methodCode, $filtableMethods)) { 返回[$結果]; } /** @var \Magento\Quote\Model\Quote $quote */ $quote = $this->session->getQuote(); $quoteItems = $quote->getAllItems(); $heavyWeightFlag = 假; foreach ($quoteItems as $item) { if ($item->getWeight() > 100) { $heavyWeightFlag = true; 繼續; } } if ($heavyWeightFlag == true) { $result->setIsDisabled(true); } 返回[$結果]; } }
我們在插件主體中運行 3 次檢查:
1.
!$result instanceof \Magento\Quote\Model\Quote\Address\RateResult\Method
– 確保在入口點我們得到我們需要的東西:這是運輸方法的一個實例。 如果不是,我們就按原樣返回。
2.
!in_array($methodCode, $filtableMethods)
– 接下來,我們檢查當前方法是否在方法列表中進行過濾。 如果不是,我們按原樣返回。
3.
$heavyWeightFlag == 真
– 是最後也是主要的檢查。 如果標誌應用於實際值,則當前方法被禁用: $result->setIsDisabled(true);
我們將嘗試過濾至少一種添加到購物車且重量超過 100 個標准單位(磅或公斤)的產品。
可用於過濾的方法是'flatrate_flatrate','ups_XDM','ups_XPR','ups_WXS','carrier_method' 。 它們被硬編碼並存儲在數組$filtableMethods中。
我們使用整個運輸方式代碼對代碼進行操作,該代碼通常由承運人代碼($result->getCarrier())和方法本身的代碼 ($result- >getMethod())組成,通過“ _” 。
檢查所需的產品直接取自當前客戶的報價。
筆記
數組類構造函數中的一小段代碼可以讓您在前端和後端定義報價(假設在管理面板中創建了訂單)。
使用 \Magento\Framework\App\State 我們可以檢查我們目前所處的區域,並選擇必要的報價:
1. \Magento\Backend\Model\Session\Quote for Admin
2. 前端的 \Magento\Checkout\Model\Session
而已!
現在我們可以驗證運輸方式並可以進入下一階段——創建一個插件來禁用無效(根據我們的條件)運輸方式。
這是如何:
> MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates
/** * 版權所有 2016 MageWorx。 版權所有。 * 有關許可證的詳細信息,請參閱 LICENSE.txt。 */ 命名空間 MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result; 類 GetAllRates { /** *禁用標記的運費。 * * 注意:如果您看不到某些運費,請從這裡開始調試。 首先,檢查“is_disabled” * 運費對像中的參數。 * * @param \Magento\Shipping\Model\Rate\Result $subject * @param 數組 $result * @return 數組 */ 公共函數 afterGetAllRates($subject, $result) { foreach ($result as $key => $rate) { if ($rate->getIsDisabled()) { 未設置($result[$key]); } } 返回$結果; } }
該插件用於獲取所有可用的運輸方式數據並檢查它們中的每一個。 如果某些方法帶有“is_disabled”標記,我們只需將其從列表中排除,這使我們只能看到那些與驗證器中創建的條件相對應的方法。 這些方法在網站的任何頁面上都被排除在外,無論是購物車中的估計運輸塊,還是結帳頁面。

現在,要檢查插件如何工作,我們需要在文件中註冊它們:
> MageWorx/ShippingRules/etc/di.xml
<?xml 版本="1.0"?> <config xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Shipping\Model\Rate\Result"> <plugin name="mageworx_shippingrules_update_rate_result" type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\Append" 排序順序="10" 禁用=“假”/> <plugin name="mageworx_shippingrules_update_disabled_or_enabled_rates" type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates" 排序順序="11" 禁用=“假”/> </類型> </配置>
筆記
出於描述性原因,插件分為 2 個不同的類。 在一般情況下,您可以只使用 1 個類來修改 Magento\Shipping\Model\Rate\Result 類的 2 個不同方法。
為什麼它會這樣工作?
Magento\Shipping\Model\Rate\Result是 Magento 2 的主要類,負責處理運輸方法。 它的getAllRates方法用於獲取運輸方式列表。
同時,添加運輸方式通常是在“附加”方法的幫助下完成的。 在追加時驗證方法,並從集合中排除它們,我們可以獲得有效方法的列表。
驗證本身也可以修改。
我們的擴展有一個很大的特殊類,它存儲了一組具有不同條件的自定義過濾器(例如store_id、customer_group_id、日期從/到、星期幾等)。 它還有一個單獨的類,其中包含一組應應用於運輸方法的操作(例如,啟用或禁用它,根據不同的條件重寫其成本,添加額外的成本或折扣等)
調試中第一個插件的結果看起來有點像這樣(對於重量為 1 單位的產品):
這是它在購物車中的樣子(ups_WXS 仍然可用,因為沒有超過重量限制):
但是,如果您將產品重量更改為 101,則此運輸方式將不可用:
如果您將其從列表中排除,它將再次可用:
在結帳時:
筆記
您可以通過以下方式在代碼中獲取所有可用系統運輸方式的列表:
/** * 返回運營商數組。 * 如果 $isActiveOnlyFlag 設置為 true,將只返回活躍的運營商 * * @param bool $isActiveOnlyFlag * @return 數組 */ 公共函數 getAvailableMethods($isActiveOnlyFlag = false) { $carriers = $this->shippingConfig->getAllCarriers(); foreach ($carriers as $carrierCode => $carrierModel) { if (!$carrierModel->isActive() && (bool)$isActiveOnlyFlag === true) { 繼續; } $carrierMethods = $carrierModel->getAllowedMethods(); if (!$carrierMethods) { 繼續; } foreach ($carrierMethods as $methodCode => $methodTitle) { $methods[] = $carrierCode 。 '_' 。 $方法代碼; } } 返回 !empty($methods) ? $方法:[]; }
其中`$this->shippingConfig`是`Magento\Shipping\Model\Config`類的一個實例。 使用此代碼,您可以在擴展設置中為運輸方式選擇器創建源模型(因此,您不必在插件中對其進行硬編碼)。
最後但並非最不重要。
如果您不想創建自己的擴展來禁用運輸方式,您可以使用我們針對 Magento 2 的運輸套件解決方案。
該擴展程序可讓您在需要時排除任何運輸方式,只需單擊幾下鼠標即可。
1. 創建一個新的運輸規則,條件如下:
2. 在列表中選擇隱藏運輸方式操作,並選擇應禁用哪些方式:
筆記
如果您在條件列表中沒有找到“權重”屬性,請檢查它是否可以在促銷規則中使用:
如果您對如何進一步改進我們的擴展有任何疑問或想法,請在下面的評論部分分享您的意見。