I need to update category page collection by filtering restricted SKUs. As like
$collection->getSelect()->where("`e`.`sku` IN('24-MB04', '24-MB03', '24-MB02')");
Above query gives collection exatly what i need. But it won't update pagination block and layered navigation in category page
How to achieve this thing in Magento 2
I have tried to achieve these by Plugin, below are my code files
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\Block\Product\ListProduct">
<plugin name="mynamespace-myextension-block-product-list"
type="Mynamespace\Myextension\Plugin\ProductList"
sortOrder="10" />
</type>
</config>
And Plugin/ProductList.php
<?php
namespace Mynamespace\Myextension\Plugin;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Search\Request\EmptyRequestDataException;
class ProductList
{
protected $scopeConfig;
protected $_objectManager;
protected $_catalogLayer;
public function __construct(
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Framework\ObjectManagerInterface $objectManager,
\Magento\Catalog\Model\Layer\Resolver $layerResolver
)
{
$this->scopeConfig = $scopeConfig;
$this->_objectManager = $objectManager;
$this->_catalogLayer = $layerResolver->get();
}
public function beforeToHtml(
\Magento\Catalog\Block\Product\ListProduct $subject
)
{
$skus = array('24-MB04', '24-MB03', '24-MB02');
$pcollection = $this->_catalogLayer->getProductCollection()->addAttributeToFilter('sku', array('in' => $skus));
$pcollection->getSize();
$subject->setCollection($pcollection);
}
}
Please advise what I am missing
Best Answer
I have found answer to my question
To apply custom filter in category, please do as below
1] create custom SKU filter with the help of
search_request.xml
create search_request.xml file in
MyNamespace/MyModule/etc/search_request.xml
2] Override
\Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection
in to your module=>
MyNamespace/MyModule/etc/di.xml
=>
MyNamespace\MyModule\Model\ResourceModel\Fulltext\Collection.php
Note: Replase
$skus
array with your SKU values,$skus = array('24-MB04', '24-MB03', '24-MB02');