Wordpress - How to show a hierarchical terms list?
I realize, this is a very old question, but if you have a need to build up an actual structure of terms, this might be a useful method for you:
/**
* Recursively sort an array of taxonomy terms hierarchically. Child categories will be
* placed under a 'children' member of their parent term.
* @param Array $cats taxonomy term objects to sort
* @param Array $into result array to put them in
* @param integer $parentId the current parent ID to put them in
*/
function sort_terms_hierarchically(Array &$cats, Array &$into, $parentId = 0)
{
foreach ($cats as $i => $cat) {
if ($cat->parent == $parentId) {
$into[$cat->term_id] = $cat;
unset($cats[$i]);
}
}
foreach ($into as $topCat) {
$topCat->children = array();
sort_terms_hierarchically($cats, $topCat->children, $topCat->term_id);
}
}
Usage is as follows:
$categories = get_terms('my_taxonomy_name', array('hide_empty' => false));
$categoryHierarchy = array();
sort_terms_hierarchically($categories, $categoryHierarchy);
var_dump($categoryHierarchy);
Use wp_list_categories
with the 'taxonomy' => 'taxonomy'
argument, it's built for creating hierarchical category lists but will also support using a custom taxonomy..
Codex Example:
Display terms in a custom taxonomy
If the list comes back looking flat, it's possible you just need a little CSS to add padding to the lists, so you can see their hierarchical structure.
I dont know of any function that does what you want but you can build up something like this:
<ul>
<?php $hiterms = get_terms("my_tax", array("orderby" => "slug", "parent" => 0)); ?>
<?php foreach($hiterms as $key => $hiterm) : ?>
<li>
<?php echo $hiterm->name; ?>
<?php $loterms = get_terms("my_tax", array("orderby" => "slug", "parent" => $hiterm->term_id)); ?>
<?php if($loterms) : ?>
<ul>
<?php foreach($loterms as $key => $loterm) : ?>
<li><?php echo $loterm->name; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ul>
I haven't tested this but you can see what I'm getting at. What the above code will do is give you only two levels
EDIT: ahh yes you can use wp_list_categories() to do what you after.