Remove Specific Category From Category Menu programmatically in Magento 2
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 🙂
Tags:
Remove category from menu Remove Specific Category From Category Menu programmatically Remove specific category from navigation programmatically Removing Specific Category From Category Menu programmatically
View Comments
Comment or Ask a Question
Quick Links