This blog shows how we can get list of all categories from current product or any particular product as well.
Both mode (Dependency Injection & Object Manager way) are shown below:
Using Dependency Injection (DI)
Below is a block class of my custom module (Mtutorials_HelloWorld). I have injected object of \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory, \Magento\Catalog\Model\ProductRepository and \Magento\Framework\Registry classes in the constructor of my module’s block class.
app/code/Mtutorials/HelloWorld/Block/HelloWorld.php
_categoryCollectionFactory = $categoryCollectionFactory; $this->_productRepository = $productRepository; $this->_registry = $registry; parent::__construct($context, $data); } /** * Get category collection * * @param bool $isActive * @param bool|int $level * @param bool|string $sortBy * @param bool|int $pageSize * @return \Magento\Catalog\Model\ResourceModel\Category\Collection or array */ public function getCategoryCollection($isActive = true, $level = false, $sortBy = false, $pageSize = false) { $collection = $this->_categoryCollectionFactory->create(); $collection->addAttributeToSelect('*'); // select only active categories if ($isActive) { $collection->addIsActiveFilter(); } // select categories of certain level if ($level) { $collection->addLevelFilter($level); } // sort categories by some value if ($sortBy) { $collection->addOrderField($sortBy); } // select certain number of categories if ($pageSize) { $collection->setPageSize($pageSize); } return $collection; } public function getProductById($id) { return $this->_productRepository->getById($id); } public function getCurrentProduct() { return $this->_registry->registry('current_product'); } } ?>
To get the current product, we use getCurrentProduct() function. Otherwise, to get any particular product, we use getProductById($id) function.
We then fetch the category ids associated with that product. After that, we fetch the category collection data for those category ids. Here’s the code to be written in template (.phtml) file.
$productId = 1; // YOUR PRODUCT ID $product = $block->getProductById($productId); // for current product // $product = $block->getCurrentProduct(); $categoryIds = $product->getCategoryIds(); $categories = $block->getCategoryCollection() ->addAttributeToFilter('entity_id', $categoryIds); foreach ($categories as $category) { echo $category->getName() . '
'; }
Using Object Manager
$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $categoryCollection = $objectManager->get('\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory'); $productRepository = $objectManager->get('\Magento\Catalog\Model\ProductRepository'); $appState = $objectManager->get('\Magento\Framework\App\State'); $appState->setAreaCode('frontend'); $productId = 1; // YOUR PRODUCT ID FOR LOAD $product = $productRepository->getById($productId); $categoryIds = $product->getCategoryIds(); $categories = $categoryCollection->create() ->addAttributeToSelect('*') ->addAttributeToFilter('entity_id', $categoryIds); foreach ($categories as $category) { echo $category->getName() . '
'; }
Hope this will helps you!