การตั้งค่าการจำกัดการจัดส่งขั้นสูงใน 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. เลือกการกระทำ ซ่อนวิธีการจัดส่ง ในรายการ และเลือกวิธีที่จะปิดใช้งาน:
บันทึก
หากคุณไม่พบแอตทริบิวต์ "น้ำหนัก" ในรายการเงื่อนไข ให้ตรวจสอบว่ามีการเปิดใช้งานเพื่อใช้ในกฎโปรโมชันหรือไม่:
หากคุณมีคำถามหรือแนวคิดเกี่ยวกับวิธีการปรับปรุง ส่วนขยายของเรา เพิ่มเติม โปรดแบ่งปันความคิดเห็นของคุณในส่วนความคิดเห็นด้านล่าง