How can I block access to a specific category in Magento 2 for users who are not logged in or belong to a specific customer group using an observer?

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
        }
    }
}


Leave a comment

Your email address will not be published. Required fields are marked *