How I can get all categories and subcategories?

Donnie picture Donnie · Jan 11, 2013 · Viewed 35.8k times · Source

How I can get all categories and subcategories if the category is active, but "Include in Navigation Menu" is set to "No"?

I try to use this:

<?php 
$_categories = Mage::getBlockSingleton('catalog/navigation'); 
foreach ($_categories->getStoreCategories() as $_category) { 
$category = Mage::getModel('catalog/category'); 
$category->load($_category->getId()); 
$subcategories = explode(',', $category->getChildren()); 
?> 
<dl> 
<dt><?php echo $this->htmlEscape($_category->getName()); ?></dt> 
<dd> 
<ol> 
<?php 
foreach ($subcategories as $subcategoryId) { 
$category->load($subcategoryId); 
echo '<li><a href="' . $category->getURL() . '">' . $category->getName() . '</a></li>'; 
} 
?> 
</ol> 
</dd> 
</dl> 
<?php

} 
?> 

But if a category's “Include in Nav menu" is "No”, it won't show on the front page!

Answer

1000Nettles picture 1000Nettles · Jan 12, 2013

You only need to change one thing! When you call $_categories = Mage::getBlockSingleton('catalog/navigation') you're actually grabbing the categories from the catalog/navigation model specifically - the filtering out of "non navigation" categories is already complete. Instead, we can grab a collection from the catalog/category model to make sure we get all categories available on the site:

$categories = Mage::getModel('catalog/category')
        ->getCollection()
        ->addAttributeToSelect('*')
        ->addIsActiveFilter();

Note that I am using addIsActiveFilter() to make sure we only get categories that are currently active / enabled.