Magento 2: Retrieve Parent Categories, Subcategories, and Product Counts
This article explains how to retrieve parent categories, subcategories, and the total number of products within a category in Magento 2.
The following code demonstrates a block class for a custom module Mavenbird_HelloWorld. It utilizes \Magento\Catalog\Model\CategoryFactory, \Magento\Catalog\Helper\Category, and \Magento\Catalog\Model\CategoryRepository to manage categories effectively.
Block Class Implementation
The block class is defined in the custom module Mavenbird_HelloWorld. Below is the implementation:
app/code/Mavenbird/HelloWorld/Block/HelloWorld.php
namespace Mavenbird\HelloWorld\Block; class HelloWorld extends \Magento\Framework\View\Element\Template { protected $_categoryFactory; protected $_category; protected $_categoryHelper; protected $_categoryRepository; public function __construct( \Magento\Backend\Block\Template\Context $context, \Magento\Catalog\Model\CategoryFactory $categoryFactory, \Magento\Catalog\Helper\Category $categoryHelper, \Magento\Catalog\Model\CategoryRepository $categoryRepository, array $data = [] ) { $this->_categoryFactory = $categoryFactory; $this->_categoryHelper = $categoryHelper; $this->_categoryRepository = $categoryRepository; parent::__construct($context, $data); } /** * Get category object using $_categoryFactory * * @return \Magento\Catalog\Model\Category */ public function getCategory($categoryId) { $this->_category = $this->_categoryFactory->create(); $this->_category->load($categoryId); return $this->_category; } /** * Get category object using $_categoryRepository * * @return \Magento\Catalog\Model\Category */ public function getCategoryById($categoryId) { return $this->_categoryRepository->get($categoryId); } /** * Retrieve current store categories * * @return \Magento\Framework\Data\Tree\Node\Collection or array */ public function getStoreCategories($sorted = false, $asCollection = false, $toLoad = true) { return $this->_categoryHelper->getStoreCategories(); } /** * Get parent category object * * @return \Magento\Catalog\Model\Category */ public function getParentCategory($categoryId = false) { if ($this->_category) { return $this->_category->getParentCategory(); } else { return $this->getCategory($categoryId)->getParentCategory(); } } /** * Get parent category identifier * * @return int */ public function getParentId($categoryId = false) { if ($this->_category) { return $this->_category->getParentId(); } else { return $this->getCategory($categoryId)->getParentId(); } } /** * Get all parent categories ids * * @return array */ public function getParentIds($categoryId = false) { if ($this->_category) { return $this->_category->getParentIds(); } else { return $this->getCategory($categoryId)->getParentIds(); } } /** * Get all children categories IDs * * @param boolean $asArray return result as array instead of comma-separated list of IDs * @return array|string */ public function getAllChildren($asArray = false, $categoryId = false) { if ($this->_category) { return $this->_category->getAllChildren($asArray); } else { return $this->getCategory($categoryId)->getAllChildren($asArray); } } /** * Retrieve children ids comma separated * * @return string */ public function getChildren($categoryId = false) { if ($this->_category) { return $this->_category->getChildren(); } else { return $this->getCategory($categoryId)->getChildren(); } } }
Key Functionalities
- Getting Category Objects: Fetching category details using CategoryFactory and CategoryRepository.
- Retrieving Store Categories: Accessing the list of current store categories with options for sorting and loading them as a collection.
- Accessing Parent Category Details: Retrieving parent category objects, IDs, and all parent IDs.
- Fetching Child Categories: Getting all child category IDs as an array or a comma-separated list.
- Getting Children IDs: Extracting child category IDs in a comma-separated format.
Using Object Manager
The following example demonstrates how to use Magento’s Object Manager to perform similar operations:
$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $appState = $objectManager->get('\Magento\Framework\App\State'); $appState->setAreaCode('frontend'); $categoryFactory = $objectManager->get('\Magento\Catalog\Model\CategoryFactory'); $categoryHelper = $objectManager->get('\Magento\Catalog\Helper\Category'); $categoryRepository = $objectManager->get('\Magento\Catalog\Model\CategoryRepository'); $categoryId = 21; // YOUR CATEGORY ID $category = $categoryFactory->create()->load($categoryId); //var_dump($category->getData()); $parentCategories = $category->getParentCategories(); $childrenCategories = $category->getChildrenCategories(); $storeCategories = $categoryHelper->getStoreCategories();
Conclusion
By following this guide, you can efficiently manage and display category structures and product counts in your Magento 2 store. Whether using dependency injection or the Object Manager, these methods ensure flexibility and consistency in category management.