Reputation: 546
I have a custom post type of 'stories'. I have a taxonomy of 'story_categories'. I need to display the top level categories, and below these the child categories. It works fine with the following code...
<?php
$queried_object = get_queried_object();
$term_id = $queried_object->term_id;
$list_child_terms_args = array(
'taxonomy' => 'story_categories',
'title_li' => '',
'child_of' => $term_id
);
?>
<ul class="list list-links list-links-small">
<?php wp_list_categories( $list_child_terms_args ); ?>
</ul>
...up until I click one of the subcategories. Then I get 'No categories' (I assume this is because it's always looking for the subcategories of the current page, and the subcategory has none of these).
Is there a way to use the above code in a way where it always displays the subcategories of a certain level, even if I'm in a subcategory? eg:
Stories (top level)
--News (2nd level) < Always display subcats of this at all times
--Events (2nd level) < Always display subcats of this at all times
---Stuff (3rd level)
---Stuff (3rd level)
Thanks
Upvotes: 0
Views: 1621
Reputation: 14921
The problem is because you're passing child_of
the current term. To fix it, simply retrieve the root parent of your current term.
// Loop until you reach the top parent term
$root = $queried_object;
while($root->parent != '0')
$root = get_term_by('id', $root->parent, $root->taxonomy);
Then once you've retrieve the root, update your args like this:
'child_of' => $root->term_id
If you don't want to loop, you can use get_ancestors:
$parents = get_ancestors($term_id, $queried_object->taxonomy, 'taxonomy');
Then pass the last element:
'child_of' => $parents ? end($parents) : $term_id
Upvotes: 1