I am trying to achieve multiselect filter in custom script to be able to use it in custom REST API.
While I am able to get all filterable attributes specific to a category. But after applying filter through params (e.g. Size), the size attribute get removed from the filterable attribute list after apply (default magento behaviour).
Need filters to behave as multiselect. I tried to implement it using classes of some 3rd party modules but of no help.
Below is my code
<?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // Copyright 2009, FedEx Corporation. All rights reserved. // Version 12.0.0 use Magento\Framework\App\Bootstrap; /** * If your external file is in root folder */ require __DIR__ . '/app/bootstrap.php'; $ params = $ _SERVER; $ bootstrap = Bootstrap::create(BP, $ params); ini_set('display_errors', 1); $ obj = $ bootstrap->getObjectManager(); $ state = $ obj->get('Magento\Framework\App\State'); $ state->setAreaCode('frontend'); $ objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $ categoryFactory = $ objectManager->get('Magento\Catalog\Model\CategoryFactory'); $ storeManager = $ objectManager->get('Magento\Store\Model\StoreManagerInterface'); $ resource = $ objectManager->get('Magento\Framework\App\ResourceConnection'); $ request = $ objectManager->get('Magento\Framework\App\Request\Http'); $ params = $ request->getParams(); $ connection = $ resource->getConnection(); $ storeId = $ storeManager->getStore()->getId(); $ categoryId = 824; $ category = $ categoryFactory->create()->setStoreId($ storeId)->load($ categoryId); $ storeManager->setCurrentStore($ storeId); $ filterableAttributes = $ objectManager->get(\Magento\Catalog\Model\Layer\Category\FilterableAttributeList::class); $ appState = $ objectManager->get(\Magento\Framework\App\State::class); $ layerResolver = $ objectManager->get(\Magento\Catalog\Model\Layer\Resolver::class); $ filterList = $ objectManager->create( \Magento\Catalog\Model\Layer\FilterList::class, [ 'filterableAttributes' => $ filterableAttributes ] ); $ layer = $ layerResolver->get(); $ layer->setCurrentCategory($ category); $ allFilters = $ filterList->getFilters($ layer); $ beforefinalFilters = []; foreach ($ allFilters as $ filter) { if ($ filter->getName() != 'Category' && $ filter->getName() != 'Price'){ if ($ filter->getItemsCount()) { $ output = []; foreach ($ filter->getItems() as $ item) { if($ item->getFilter()->getData("attribute_model")){ $ flag = false; $ code = $ item->getName(); $ name = strip_tags($ item->getLabel()); $ beforefinalFilters[$ code][] = array( 'name'=> $ name, 'value'=> $ item->getValue(), 'code'=> $ item->getFilter()->getAttributeModel()->getAttributeCode(), 'isActive' => $ flag ); } } } } } echo "Before filter: \n"; echo "<pre>"; print_r($ beforefinalFilters); echo "</pre>"; echo "----------------------------------------------------------------------------------"; echo "<br>"; $ appliedFilters = array(); foreach ($ allFilters as $ filter) { if ($ filter->getName() != 'Category' && $ filter->getName() != 'Price' && $ filter->getItemsCount() && isset($ params[$ filter->getAttributeModel()->getAttributeCode()])) { $ appliedFilters[$ filter->getAttributeModel()->getAttributeCode()]['label'] = $ filter->getAttributeModel()->getFrontendLabel(); $ appliedFilters[$ filter->getAttributeModel()->getAttributeCode()]['value'] = isset($ params[$ filter->getAttributeModel()->getAttributeCode()])?$ params[$ filter->getAttributeModel()->getAttributeCode()]:''; $ appliedFilters[$ filter->getAttributeModel()->getAttributeCode()]['filter'] = $ filter; $ request->setParam($ filter->getAttributeModel()->getAttributeCode(), $ params[$ filter->getAttributeModel()->getAttributeCode()]); } } foreach ($ appliedFilters as $ key => $ value) { $ filter = $ value['filter']; $ filterValue = $ value['value']; if($ key == 'price' || $ key == 'category'){ continue; }else{ //apply filter //Magento\Catalog\Model\Layer\Filter\Attribute $ filter->apply($ request); } } $ collection = $ layer->getProductCollection(); $ collection->getSelect()->group('e.entity_id'); //get filters after applying $ allFiltersAfter = $ filterList->getFilters($ layer); $ afterfinalFilters = []; foreach ($ allFiltersAfter as $ filter) { if ($ filter->getName() != 'Category' && $ filter->getName() != 'Price'){ if ($ filter->getItemsCount()) { $ output = []; foreach ($ filter->getItems() as $ item) { if($ item->getFilter()->getData("attribute_model")){ $ flag = false; $ code = $ item->getName(); $ name = strip_tags($ item->getLabel()); $ afterfinalFilters[$ code][] = array( 'name'=> $ name, 'value'=> $ item->getValue(), 'code'=> $ item->getFilter()->getAttributeModel()->getAttributeCode(), 'isActive' => $ flag ); } } } } } echo "\n After filter: \n"; echo "<pre>"; print_r($ afterfinalFilters); echo "</pre>";