Hello Friends!!!
In this blog, we are going to learn how we can remove a specific category from the category menu at the frontend.
Here, in the following example, I have added a filter of category name to remove from the menu.
I have created a preference for the class Magento\Catalog\Plugin\Block\Topmenu
Please follow the below steps to achieve the desired result.
Step1: Create di.xml file inside the app/code/Webkul/CustomModule/etc/ directory.
<?xml version="1.0"?> <!-- /** * Webkul Software. * * @category Webkul * @package Webkul_CustomModule * @author Webkul Software Private Limited * @copyright Webkul Software Private Limited (https://webkul.com) * @license https://store.webkul.com/license.html */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Catalog\Plugin\Block\Topmenu" type="Webkul\CustomModule\Plugin\Catalog\Block\Topmenu"/> </config>
Step2: Now, create the Topmenu.php file inside the app/code/Webkul/CustomModule/Plugin/Catalog/Block/ directory.
<?php /** * Webkul Software. * * @category Webkul * @package Webkul_CustomModule * @author Webkul Software Private Limited * @copyright Webkul Software Private Limited (https://webkul.com) * @license https://store.webkul.com/license.html */ declare(strict_types=1); namespace Webkul\CustomModule\Plugin\Catalog\Block; use Magento\Catalog\Model\Category; use Magento\Framework\Data\Collection; use Magento\Framework\Data\Tree\Node; use Magento\Catalog\Model\ResourceModel\Category\StateDependentCollectionFactory; /** * Plugin for top menu block */ class Topmenu extends \Magento\Catalog\Plugin\Block\Topmenu { /** * @var StateDependentCollectionFactory */ private $collectionFactory; /** * Initialize dependencies. * * @param \Magento\Catalog\Helper\Category $catalogCategory * @param StateDependentCollectionFactory $categoryCollectionFactory * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Catalog\Model\Layer\Resolver $layerResolver * @return void */ public function __construct( \Magento\Catalog\Helper\Category $catalogCategory, StateDependentCollectionFactory $categoryCollectionFactory, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Catalog\Model\Layer\Resolver $layerResolver ) { $this->catalogCategory = $catalogCategory; $this->collectionFactory = $categoryCollectionFactory; $this->storeManager = $storeManager; $this->layerResolver = $layerResolver; parent::__construct( $catalogCategory, $categoryCollectionFactory, $storeManager, $layerResolver ); } /** * Get Category Tree * * @param int $storeId * @param int $rootId * @return \Magento\Catalog\Model\ResourceModel\Category\Collection * @throws \Magento\Framework\Exception\LocalizedException */ protected function getCategoryTree($storeId, $rootId) { /** @var \Magento\Catalog\Model\ResourceModel\Category\Collection $collection */ $collection = $this->collectionFactory->create(); $collection->setStoreId($storeId); $collection->addAttributeToSelect('name'); ////add category name filter//// $collection->addAttributeToFilter('name', ["neq"=>"Shoes"]); /////// $collection->addFieldToFilter('path', ['like' => '1/' . $rootId . '/%']); //load only from store root $collection->addAttributeToFilter('include_in_menu', 1); $collection->addIsActiveFilter(); $collection->addNavigationMaxDepthFilter(); $collection->addUrlRewriteToResult(); $collection->addOrder('level', Collection::SORT_ORDER_ASC); $collection->addOrder('position', Collection::SORT_ORDER_ASC); $collection->addOrder('parent_id', Collection::SORT_ORDER_ASC); $collection->addOrder('entity_id', Collection::SORT_ORDER_ASC); return $collection; } }
Now, look into the first image in which category Shoes is being displayed in the menu. And in the second image, the category Shoes is removed from the menu.
Hope this will be helpful.
Thanks 🙂
Be the first to comment.