N44
N44

Reputation: 15

Display a list of taxonomies, only if they are hierarchical

I am trying to show a list of the taxonomies a custom post type is in, excluding those which aren't hierarchical.

The code below currently works but shows all taxonomies, however I can't get it to check if the taxonomy is hierarchical before running it through the loop.

I know there is a WordPress function that runs this check, but as I usually work front-end, I can't seem figure out where to put it in order for it to take effect:

is_taxonomy_hierarchical( $taxonomy )

The following is the function I am using to output a list of the taxonomies:

// get taxonomies terms links
function custom_taxonomies_terms_links(){

  // get post by post id
  $post = get_post( $post->ID );

  // get post type by post
  $post_type = $post->post_type;

  // get post type taxonomies
  $taxonomies = get_object_taxonomies( $post_type, 'objects' );

  $out = array();

    echo '<a href="';
    echo '/';
    echo '">';
    echo 'Home';
    echo "</a> / ";

  foreach ( $taxonomies as $taxonomy_slug => $taxonomy ){

    // get the terms related to post
    $terms = get_the_terms( $post->ID, $taxonomy_slug );

    if (!empty( $terms )) {     
      foreach ( $terms as $term ) {
        $out[] =
          '<a href="'
        .    get_term_link( $term->slug, $taxonomy_slug ) .'">'
        .    $term->name
        . "</a> / ";
      }
      $out[] = " ";
    }
  }
return implode('', $out );
}

Upvotes: 0

Views: 632

Answers (1)

user488187
user488187

Reputation:

If I understand your correctly, couldn't you just test the taxonomy like the following:

foreach ( $taxonomies as $taxonomy_slug => $taxonomy ){

    if ($taxonomy->hierarchical) {
        // get the terms related to post
        $terms = get_the_terms( $post->ID, $taxonomy_slug );

        if (!empty( $terms )) {     
           foreach ( $terms as $term ) {
               $out[] =
              '<a href="'
             .    get_term_link( $term->slug, $taxonomy_slug ) .'">'
             .    $term->name
             . "</a> / ";
           }
           $out[] = " ";
        }
    }
}

When you use 'objects' as the second parameter in:

get_object_taxonomies( $post_type, 'objects' );

what you get back is an array of taxonomy objects, as opposed to just taxonomy names (the other option). The taxonomy object has a property "hierarchical" that indicates whether that taxonomy is hierarchical or not. You can test this to choose the types of taxonomies (hierarchical or not) that you want.

Upvotes: 1

Related Questions