การตั้งค่าการจำกัดการจัดส่งขั้นสูงใน 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 หน่วย):
1

นี่คือลักษณะที่ปรากฏในตะกร้าสินค้า (ups_WXS ยังคงมีให้บริการ เนื่องจากน้ำหนักไม่เกินขีดจำกัด):

2

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

3

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

5

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

f3d3cac03678318af2d569d757fc7e79

บันทึก

คุณสามารถรับรายการวิธีการจัดส่งของระบบที่มีอยู่ทั้งหมดโดยใช้รหัสด้วยวิธีต่อไปนี้:

 /**
 * ส่งคืนอาร์เรย์ของผู้ให้บริการ
 * หาก $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. สร้างกฎการจัดส่งใหม่โดยมีเงื่อนไขดังต่อไปนี้:

8

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

9

บันทึก

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

10

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