Magento 2: Get list of all Categories & Store Categories

This article shows how we can get list of all categories and all category of current store in Magento 2.

Below is a block class of my custom module (Chapagain_HelloWorld). I have injected object of \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory and \Magento\Catalog\Helper\Category classes in the constructor of my module’s block class.

app/code/Chapagain/HelloWorld/Block/HelloWorld.php


<?php
namespace Chapagain\HelloWorld\Block;
class HelloWorld extends \Magento\Framework\View\Element\Template
{	
	protected $_categoryCollectionFactory;
	protected $_categoryHelper;
		
	public function __construct(
		\Magento\Backend\Block\Template\Context $context,		
		\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoryCollectionFactory,
		\Magento\Catalog\Helper\Category $categoryHelper,
		array $data = []
	)
	{
		$this->_categoryCollectionFactory = $categoryCollectionFactory;
		$this->_categoryHelper = $categoryHelper;
		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;
	}
	
	/**
     * Retrieve current store categories
     *
     * @param bool|string $sorted
     * @param bool $asCollection
     * @param bool $toLoad
     * @return \Magento\Framework\Data\Tree\Node\Collection or
     * \Magento\Catalog\Model\ResourceModel\Category\Collection or array
     */
	public function getStoreCategories($sorted = false, $asCollection = false, $toLoad = true)
	{
		return $this->_categoryHelper->getStoreCategories($sorted = false, $asCollection = false, $toLoad = true);
	}
}
?>

Now, we fetch and print the category collection.


$categories = $block->getCategoryCollection(); 
foreach ($categories as $category) {
	//print_r($category->getData());
	echo $category->getName() . '<br />';
}

// get categories sorted by category 'name'
$categories = $block->getCategoryCollection(true, false, 'name', false);
foreach ($categories as $category) {	
	echo $category->getName() . '<br />';
}

// get current store's categories
$categories = $block->getStoreCategories();
foreach ($categories as $category) {	
	echo $category->getName() . '<br />';
}

Using Object Manager


$objectManager =  \Magento\Framework\App\ObjectManager::getInstance();		

$appState = $objectManager->get('\Magento\Framework\App\State');
$appState->setAreaCode('frontend');

$categoryCollection = $objectManager->get('\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory');
$categories = $categoryCollection->create();
$categories->addAttributeToSelect('*');

foreach ($categories as $category) {
    //print_r($category->getData());
    echo $category->getName() . '<br />';
}

$categoryHelper = $objectManager->get('\Magento\Catalog\Helper\Category');
$categories = $categoryHelper->getStoreCategories();

foreach ($categories as $category) {    
    echo $category->getName() . '<br />';
}

Hope this helps. Thanks.