Phill
Phill

Reputation: 546

Wordpress: Display only 2nd level taxonomy terms

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

Answers (1)

Chin Leung
Chin Leung

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.

Option 1

// 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

Option 2

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

Related Questions