I have created custom post type and 4 taxonomies. First, second and third taxonomy is hierachical, the last is not. Is there any possibility to display separetly hierarchical and non-hierarchical taxonomies, without using their names?

For better understand: CPT has 4 taxonomies. 1, 2 and 3 are hierarchical, 4 taxonomy is non-hierachical. Now in span#one I want to display all hierarchical terms and in span#two all non-hierarchical terms of specific post.

How can I do that?

  • the OP is not clear about what he want to achieve please explain the things more clearly
    – siddhesh
    May 15, 2019 at 8:21
  • Do you want to display all terms from these taxonomies or only the terms assigned to current post? May 15, 2019 at 8:34
  • What are you having trouble with, specifically? Terms assigned to a post need to be output separately for each taxonomy anyway, so you'd just put them in different elements. Are you just having trouble listing terms at all? May 15, 2019 at 8:38
  • @KrzysiekDróżdż take a look above I updated my post. I just want to separate hierarchical and non-hierarchical terms of specific post. May 15, 2019 at 8:56

1 Answer 1


At the beginning, get taxonomies registered for a given type of post with get_object_taxonomies(). Then check which ones are hierarchical, e.g. using is_taxonomy_hierarchical() conditional tag. The last step is to display the lists.

// current post ID
$post_id = get_the_ID();
// taxonomies registered for this type of posts
$taxonomies = get_object_taxonomies( get_post_type() );

$taxs_tree = [];   // hierarchical taxonomies
$taxs_flat = [];   // non-hierarchical taxonomies
foreach ( $taxonomies as $tax )
    if ( is_taxonomy_hierarchical( $tax ) )
        $taxs_tree[] = $tax;
        $taxs_flat[] = $tax;

Get terms from each taxonomy and display them.

// get terms as links
$terms_flat = $terms_tree = [];
foreach ( $taxs_tree as $tax ) {
    $terms_tree[] = get_the_term_list( $post_id, $tax );
foreach ( $taxs_flat as $tax ) {
    $terms_flat[] = get_the_term_list( $post_id, $tax );

echo '<span id="one">';
foreach ( $terms_tree as $links ) {
   echo $links;
echo '</span>';


// terms assigned to post, ordered by name, from all hierarchical taxonomies
$args = [
   'taxonomy'   => $taxs_tree,   // here you can pass array of taxonomies
   'object_ids' => get_the_ID(), // get only terms assigned to this post (current post)
   //'orderby.  => 'name',       // default
$terms_tree = get_terms( $args ); // array of WP_term objects

// terms assigned to post, ordered by name, from all non-hierarchical taxonomies
$args['taxonomy'] = $taxs_flat;
$terms_flat = get_terms( $args ); // array of WP_term objects

// display 
echo '<span id="one">';
foreach ( $terms_tree as $term ) {
    $link = get_term_link( $term );
    if ( is_wp_error( $link ) ) {
    echo '<a href="' . esc_url( $link ) . '" rel="tag">' . $term->name . '</a> ';
echo '</span>';

// the same with $terms_flat

The second solution (with get_terms) sort terms from all hierarchical taxonomies by name, while the first one (with get_the_term_list) sort terms from each hierarchical taxonomy separately.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.