การตั้งค่าการจำกัดการจัดส่งขั้นสูงใน Magento 2
เผยแพร่แล้ว: 2017-05-17ในบทความนี้ เราจะอธิบายวิธีซ่อนวิธีการจัดส่งเมื่อมีการใช้เงื่อนไขบางประการ
ในบางสถานการณ์ เจ้าของร้านค้าอาจต้องการจำกัดตัวเลือกการจัดส่งเนื่องจาก:
- สินค้ามี ขนาด และ น้ำหนักมาก ดังนั้นจึงไม่สามารถจัดส่งด้วยวิธีมาตรฐานใดๆ ได้
- สภาพการเก็บรักษาในห้องแช่แข็ง ไม่อนุญาตให้ส่งสินค้าทันเวลา
- การจัดส่งถูกจำกัดเนื่องจากที่ตั้งของลูกค้า (ประเทศ ภูมิภาค เมือง )
- C art Total ไม่อนุญาตให้นักช้อปมีสิทธิ์รับข้อเสนอในการจัดส่งใดๆ
- เป็นต้น
การเลือกค่าเริ่มต้นของตัวเลือกการจัดส่ง Magento ไม่ได้ให้ความยืดหยุ่นมากนัก คุณสามารถจำกัดการจัดส่งสำหรับบางประเทศและบางภูมิภาคเท่านั้น หรือเมื่อยอดรวมรถเข็นน้อยกว่าจำนวนที่ตั้งไว้
ถ้าคิดว่าแค่นี้ยังไม่พอ อ่านต่อ
ฉันจะบอกวิธีสร้างปลั๊กอินของคุณเองซึ่งจะช่วยให้คุณจำกัดตัวเลือกการจัดส่งตามรูปแบบธุรกิจ เป้าหมาย และเงื่อนไขของคุณ
บันทึก
ฉันจะไม่ทำตามขั้นตอนเฉพาะที่จำเป็นในการสร้างส่วนขยายสำหรับ Magento 2 คุณสามารถดูวิธีการทำได้ที่นี่หรือที่นี่
ในการปิดใช้งานวิธีการจัดส่งที่กำหนดแบบไดนามิก เราจำเป็นต้องมีชุดคลาสใหม่ในส่วนขยายของเรา – นี่คือ 2 ปลั๊กอิน ที่ 1 จะรับผิดชอบในการตรวจสอบวิธีการจัดส่ง ในขณะที่ 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
*/
ป้องกัน $session;
/**
* @param \Magento\Checkout\Model\Session $checkoutSession
* @param \Magento\Backend\Model\Session\Quote $backendQuoteSession
* @param \Magento\Framework\App\State $state
* @internal param เซสชัน $session
*/
ฟังก์ชั่นสาธารณะ __construct(
\Magento\Checkout\Model\Session $checkoutSession,
\Magento\Backend\Model\Session\Quote $backendQuoteSession,
\Magento\Framework\App\State $state
) {
ถ้า ($state->getAreaCode() == \Magento\Framework\App\Area::AREA_ADMINHTML) {
$นี้->เซสชัน = $backendQuoteSession;
} อื่น {
$นี้->เซสชัน = $checkoutSession;
}
}
/**
* ตรวจสอบวิธีการจัดส่งแต่ละวิธีก่อนผนวก
* ใช้การดำเนินการกฎหากการตรวจสอบสำเร็จ
* สามารถทำเครื่องหมายกฎบางอย่างว่าปิดการใช้งาน กฎที่ถูกปิดใช้งานจะถูกลบออกในชั้นเรียน
* @see MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates
* โดยการตรวจสอบค่าของเครื่องหมายนี้ในวัตถุอัตรา
*
* หมายเหตุ: หากคุณมีปัญหากับกฎและวิธีการจัดส่ง ให้เริ่มแก้ไขจุดบกพร่องจากที่นี่
*
* @param \Magento\Shipping\Model\Rate\Result $ subject
* @param \Magento\Quote\Model\Quote\Address\RateResult\AbstractResult|\Magento\Shipping\Model\Rate\Result $result
* @return อาร์เรย์
*/
ฟังก์ชั่นสาธารณะก่อนผนวก($หัวเรื่อง, $ผล)
{
if (!$result instanceof \Magento\Quote\Model\Quote\Address\RateResult\Method) {
ส่งคืน [$ ผล];
}
$filtableMethods = [
'ราคาเหมา_เหมา',
'ups_XDM',
'ups_XPR',
'อัพ_WXS',
'carrier_method',
// ... เพิ่มรหัสวิธีการของคุณที่นี่
];
$methodCode = $result->getCarrier() . '_' . $result->getMethod();
if (!in_array($methodCode, $filtableMethods)) {
ส่งคืน [$ ผล];
}
/** @var \Magento\Quote\Model\Quote $quote */
$quote = $this->เซสชัน->getQuote();
$quoteItems = $quote->getAllItems(); $quoteItems = $quote->getAllItems();
$heavyWeightFlag = เท็จ;
foreach ($quoteItems เป็น $item) {
ถ้า ($item->getWeight() > 100) {
$heavyWeightFlag = จริง;
ดำเนินต่อ;
}
}
ถ้า ($heavyWeightFlag == จริง) {
$result->setIsDisabled(จริง);
}
ส่งคืน [$ ผล];
}
}เราทำการตรวจสอบ 3 ครั้งในเนื้อหาของปลั๊กอินของเรา:
1.
!$ ตัวอย่างผลลัพธ์ของ \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()) ที่เชื่อมต่อกับ “ _”
ผลิตภัณฑ์ที่จำเป็นสำหรับเช็คถูกนำมาโดยตรงจากใบเสนอราคาของลูกค้าปัจจุบัน
บันทึก
โค้ดเล็กๆ น้อยๆ ใน Constructor คลาสอาร์เรย์จะช่วยให้คุณกำหนดใบเสนอราคาได้ทั้งในส่วนหน้าและส่วนหลัง (หากมีการสร้างคำสั่งซื้อในแผงการดูแลระบบ)
การใช้ \Magento\Framework\App\State เราสามารถตรวจสอบว่าเราอยู่ในพื้นที่ใดในขณะนี้ และเลือกใบเสนอราคาที่จำเป็น:
1. \Magento\Backend\Model\Session\Quote สำหรับผู้ดูแลระบบ
2. \Magento\Checkout\Model\Session สำหรับ Frontend
แค่นั้นแหละ!
ตอนนี้เราสามารถตรวจสอบความถูกต้องของวิธีการจัดส่งและสามารถดำเนินการในขั้นตอนต่อไป – การสร้างปลั๊กอินสำหรับการปิดใช้งานวิธีการจัดส่งที่ไม่ถูกต้อง (ตามเงื่อนไขของเรา)
นี่คือวิธีการ:
> 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 array $result
* @return อาร์เรย์
*/
ฟังก์ชั่นสาธารณะ afterGetAllRates($ subject, $result)
{
foreach (ผลลัพธ์เป็น $key => $rate) {
ถ้า ($rate->getIsDisabled()) {
unset($ผล[$คีย์]);
}
}
ส่งคืนผลลัพธ์ $;
}
}ปลั๊กอินนี้ใช้เพื่อดึงข้อมูลวิธีการจัดส่งที่มีอยู่ทั้งหมด และตรวจสอบแต่ละรายการ หากวิธีการบางอย่างมีเครื่องหมาย “is_disabled” เราจะแยกมันออกจากรายการ ซึ่งทำให้เราเห็นเฉพาะวิธีการเหล่านั้นที่สอดคล้องกับเงื่อนไขที่สร้างในตัวตรวจสอบความถูกต้อง วิธีการเหล่านี้ไม่รวมอยู่ในหน้าใดๆ ของเว็บไซต์ ไม่ว่าจะเป็นบล็อกการจัดส่งโดยประมาณในตะกร้าสินค้า หรือหน้าชำระเงิน

ตอนนี้ เพื่อตรวจสอบว่าปลั๊กอินทำงานอย่างไร เราต้องลงทะเบียนในไฟล์:
> MageWorx/ShippingRules/etc/di.xml
<?xml version="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">
<ชื่อปลั๊กอิน="mageworx_shippingrules_update_rate_result"
type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\Append"
sortOrder="10"
ปิดการใช้งาน = "เท็จ"/>
<ชื่อปลั๊กอิน="mageworx_shippingrules_update_disabled_or_enabled_rates"
type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates"
sortOrder="11"
ปิดการใช้งาน = "เท็จ"/>
</type>
</config>บันทึก
ด้วยเหตุผลเชิงพรรณนา ปลั๊กอินจึงแบ่งออกเป็น 2 คลาสที่แตกต่างกัน ในสถานการณ์ปกติ คุณสามารถใช้เพียง 1 คลาสเพื่อแก้ไข 2 วิธีที่แตกต่างกันของคลาส Magento\Shipping\Model\Rate\Result
ทำไมมันทำงานด้วยวิธีนี้?
Magento\Shipping\Model\Rate\Result เป็นคลาสหลักของ Magento 2 ที่รับผิดชอบกระบวนการจัดส่งวิธีการจัดส่ง เมธอด getAllRates ใช้เพื่อดึงรายการวิธีการจัดส่ง
ในขณะเดียวกัน การเพิ่มวิธีการจัดส่งมักจะทำได้โดยใช้วิธี 'ผนวก' เมื่อมีเมธอดที่ตรวจสอบความถูกต้องขณะต่อท้าย และไม่รวมเมธอดจากคอลเล็กชัน เราสามารถรับรายการเมธอดที่ถูกต้องได้
การตรวจสอบความถูกต้องสามารถแก้ไขได้ด้วย
ส่วนขยายของเรามีคลาสพิเศษขนาดใหญ่ที่เก็บคอลเลกชันของตัวกรองที่กำหนดเองโดยมีเงื่อนไขต่างกัน (เช่น store_id, customer_group_id, วันที่จาก/ถึง, วันในสัปดาห์ ฯลฯ ) นอกจากนี้ยังมีคลาสแยกต่างหากพร้อมคอลเลกชันของการดำเนินการที่ควรนำไปใช้กับวิธีการจัดส่ง (เช่น เปิดใช้งานหรือปิดใช้งาน เขียนต้นทุนใหม่ตามเงื่อนไขที่แตกต่างกัน เพิ่มค่าใช้จ่ายเพิ่มเติมหรือส่วนลด ฯลฯ )
ผลลัพธ์ของปลั๊กอินตัวที่ 1 ในการแก้ไขจุดบกพร่องมีลักษณะดังนี้ (สำหรับผลิตภัณฑ์ที่มีน้ำหนัก 1 หน่วย): 
นี่คือลักษณะที่ปรากฏในตะกร้าสินค้า (ups_WXS ยังคงมีให้บริการ เนื่องจากน้ำหนักไม่เกินขีดจำกัด):

อย่างไรก็ตาม หากคุณเปลี่ยนน้ำหนักผลิตภัณฑ์เป็น 101 วิธีการจัดส่งนี้จะไม่สามารถใช้งานได้:

จะพร้อมใช้งานอีกครั้งหากคุณยกเว้นจากรายการ: 

ที่จุดชำระเงิน:

บันทึก
คุณสามารถรับรายการวิธีการจัดส่งของระบบที่มีอยู่ทั้งหมดโดยใช้รหัสด้วยวิธีต่อไปนี้:
/**
* ส่งคืนอาร์เรย์ของผู้ให้บริการ
* หาก $isActiveOnlyFlag ถูกตั้งค่าเป็น true จะส่งกลับเฉพาะผู้ให้บริการที่ใช้งานอยู่
*
* @param bool $isActiveOnlyFlag
* @return อาร์เรย์
*/
ฟังก์ชั่นสาธารณะ getAvailableMethods($isActiveOnlyFlag = false)
{
$carriers = $นี้->shippingConfig->getAllCarriers();
foreach ($carriers เป็น $carrierCode => $carrierModel) {
if (!$carrierModel->isActive() && (bool)$isActiveOnlyFlag === true) {
ดำเนินต่อ;
}
$carrierMethods = $carrierModel->getAllowedMethods(); $carrierMethods = $carrierModel->getAllowedMethods();
ถ้า (!$carrierMethods) {
ดำเนินต่อ;
}
foreach ($carrierMethods เป็น $methodCode => $methodTitle) {
$methods[] = $carrierCode . '_' . $methodCode;
}
}
ส่งคืน !empty($methods) ? วิธีการ $ : [];
}
โดยที่ `$this->shippingConfig` เป็นอินสแตนซ์ของคลาส `Magento\Shipping\Model\Config` เมื่อใช้โค้ดนี้ คุณสามารถสร้างโมเดลแหล่งที่มาสำหรับตัวเลือกวิธีการจัดส่งได้ในการตั้งค่าของส่วนขยาย (ดังนั้น คุณจะไม่ต้องฮาร์ดโค้ดในปลั๊กอิน)
และสุดท้ายแต่ไม่ท้ายสุด
หากคุณไม่ต้องการสร้างส่วนขยายของคุณเองสำหรับการปิดใช้งานวิธีการจัดส่ง คุณสามารถใช้ โซลูชัน Shipping Suite สำหรับ Magento 2
ส่วนขยายนี้ช่วยให้คุณยกเว้นวิธีการจัดส่งได้ทุกเมื่อที่ต้องการเพียงแค่คลิกเมาส์สองครั้ง
1. สร้างกฎการจัดส่งใหม่โดยมีเงื่อนไขดังต่อไปนี้:

2. เลือกการกระทำ ซ่อนวิธีการจัดส่ง ในรายการ และเลือกวิธีที่จะปิดใช้งาน:

บันทึก
หากคุณไม่พบแอตทริบิวต์ "น้ำหนัก" ในรายการเงื่อนไข ให้ตรวจสอบว่ามีการเปิดใช้งานเพื่อใช้ในกฎโปรโมชันหรือไม่:

หากคุณมีคำถามหรือแนวคิดเกี่ยวกับวิธีการปรับปรุง ส่วนขยายของเรา เพิ่มเติม โปรดแบ่งปันความคิดเห็นของคุณในส่วนความคิดเห็นด้านล่าง
