Add an Observer for Category Restriction
events.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd"> <event name="controller_action_predispatch_catalog_category_view"> <observer name="restrict_category_access_observer" instance="JJRestrictPageObserverRestrictCategoryAccess"/> </event> </config>
Implement the Observer to Block the Category
RestrictCategoryAccess.php
<?php
namespace JJRestrictPageObserver;
use MagentoFrameworkEventObserver;
use MagentoFrameworkEventObserverInterface;
use MagentoCustomerModelSession as CustomerSession;
use MagentoFrameworkAppResponseRedirectInterface;
use MagentoFrameworkAppActionFlag;
use MagentoFrameworkAppRequestInterface;
use MagentoCatalogModelCategoryRepository;
use MagentoFrameworkControllerResultForwardFactory;
class RestrictCategoryAccess implements ObserverInterface
{
protected $customerSession;
protected $redirect;
protected $actionFlag;
protected $request;
protected $categoryRepository;
protected $resultForwardFactory;
public function __construct(
CustomerSession $customerSession,
RedirectInterface $redirect,
ActionFlag $actionFlag,
RequestInterface $request,
CategoryRepository $categoryRepository,
ForwardFactory $resultForwardFactory
) {
$this->customerSession = $customerSession;
$this->redirect = $redirect;
$this->actionFlag = $actionFlag;
$this->request = $request;
$this->categoryRepository = $categoryRepository;
$this->resultForwardFactory = $resultForwardFactory;
}
public function execute(Observer $observer)
{
$customerGroupId = $this->customerSession->getCustomerGroupId(); // Get user group
$isLoggedIn = $this->customerSession->isLoggedIn(); // Check if user is logged in
$categoryId = (int) $this->request->getParam('id'); // Get requested category ID
try {
$category = $this->categoryRepository->get($categoryId);
if ($category->getName() == "Best selling" && (!$isLoggedIn || $customerGroupId != 4)) {
// Show 404 Page
$this->actionFlag->set('', MagentoFrameworkAppActionAction::FLAG_NO_DISPATCH, true);
$resultForward = $this->resultForwardFactory->create();
$resultForward->setModule('cms')->setController('noroute')->setAction('index');
$observer->getControllerAction()->getResponse()->setBody($resultForward->renderResult());
}
} catch (Exception $e) {
// Do nothing if category doesn't exist
}
}
}