You can apply custom conditions to Product Collection before load by creating a plugin in Magento 2. Some situation in your project need to add some conditions before product collection loaded you can achieve it by below way,
In Magento\Catalog\Model\ResourceModel\Product\Collection file load() method is used for load the product collection globally.
For Apply custom condition before product collection loaded, you need to create a di.xml file for plugin definition and plugin PHP file for add your custom logic.
Under the di.xml file, You need to add plugin definition to create plugin beforeLoad( ) method.
Let’s create a simple module, Rbj_Product where Rbj is Vendor name and Product is the module name.
Our Module resides under app/code/Rbj/Product location.
Path: app/code/Rbj/Product/registration.php
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Rbj_Product', __DIR__ );
Path: app/code/Rbj/Product/etc/module.xml file,
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Rbj_Product" setup_version="1.0.0"> <sequence> <module name="Magento_Catalog" /> </sequence> </module> </config>
Path: app/code/Rbj/Product/etc/frontend/di.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Catalog\Model\ResourceModel\Product\Collection"> <plugin name="beforeproductCollectionPlugin" type="Rbj\Product\Plugin\Catalog\Model\ResourceModel\Product\CollectionPlugin" /> </type> </config>
You need to create a plugin file under the below location,
Path : Rbj\Product\Plugin\Catalog\Model\ResourceModel\Product\CollectionPlugin.php
<?php namespace Rbj\Product\Plugin\Catalog\Model\ResourceModel\Product; class CollectionPlugin { /** * @param Collection $subject * @param bool $printQuery * @param bool $logQuery */ public function beforeLoad(\Magento\Catalog\Model\ResourceModel\Product\Collection $subject, $printQuery = false, $logQuery = false) { if (!$subject->isLoaded()) { // you can do your customzation/custom logic with $subject object } return [$printQuery, $logQuery]; } }