1

Ok so I have a custom post type of "Products" and a custom taxonomy of "Types". Now in the types taxonomy I have dozens of categories and sub categories assigned to custom post types.

Custom Post Type Item: Blue Car

Categories assigned to car: Honda > Accord > LX

So what I am trying to achieve is when I go to a specific custom post types single.php like "Blue Car" I want to see all of the cateogies assigned to "Blue Car" listed as so:

Categories: Honda, Accord, LX

I have tried using get_terms_by get_terms and wp_list_categories but it doesn't seem to be working out or im not using some of them correctly. Heres what I have feel free to let me know if there is a better way or another way to do this:

<ul>
<?php

//get the current term
$current_term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) );

//set the args for wp_list_categories
 $args = array(
  'child_of' => $current_term->term_id,
  'taxonomy' => 'types',
  'hide_empty' => 1,
  'order'      => 'ASC',
  'show_count'     => 1,
  'hierarchical' => true,
  'depth'  => 1,
  'title_li' => ''
    );
 wp_list_categories( $args );
?>
</ul>

2 Answers 2

3

SIDENOTE: This function can be used even if have posts belongs to one taxonomy only. You don't need to have a post that belongs to two or more taxonomies within the same hierarchy. I have made this function very flexible

It is always a problem for me to display a category list or term list for a post if the following conditions occur

  • Having a post having terms that belongs to two different taxonomies

  • Using one template to display posts, and you have posts that have terms belonging to more that one taxonomy

You come to a situation where you need to duplicate functions, one for each taxonomy. For instance, a post belongs to terms in two taxonomies, mytax1 and mytax2. To display the term list, you have to do

echo get_the_term_list( $post->ID, 'mytax1' );
echo get_the_term_list( $post->ID, 'mytax2' );

This become a mess when the next post belongs to the default taxonomy category

I went and wrote a function that combines all in one, one function to display all terms of all taxonomies belonging to a post, and this function can be used to display any taxonomy of the build in taxonomies (except post_format)

Here is how the function works:

1.) This function makes use of get_the_term_list() to display the term list, so this function uses the same functionality as get_the_term_list()

2.) Must be used inside the loop. This function will not work outside the loop

3.) The post ID and taxonomy name are passed by default to the get_the_term_list() function

4.) Here is the list of the arguments

before (string)(optional) Leading text

Default: empty string

sep (string)(optional) String to separate tags

Default: empty string

after (string)(optional) Trailing text

Default: empty string

display_tax_name (bool)(optional) Should the taxonomy name be displayed in front of the list.

Default: false

taxonomy_sep (string)(optional) Text used to separate the taxonomy name from the term list

Default: '&colon; &nbsp; &nbsp;'

multi_tax_sep (string)(optional) If the post have terms that belongs to more than one taxonomy, the text used to separate the two or more term lists

Default: </br>

hierarchical (bool)(optional) Should the list display hierarchical taxonomies (like categories ) or non-hierarchical taxonomies (like post tags)

Default: true

5.) The arguments can be passed as an array or as a string to the function

6.) Needs PHP 5.4+

This will work (string)

'display_tax_name=' . true .'&hierarchical=' . false . '&taxonomy_sep=' . html_entity_decode( '&raquo;&nbsp;&nbsp;' )

And this will work

$args = [
    'display_tax_name' => true,
    'hierarchical' => false,
    'taxonomy_sep' => html_entity_decode( '&raquo;&nbsp;&nbsp;' ) 
] 

The function

function get_taxonomies_terms_links( $args = '' ){
    global $post;
    
    $defaults = [
        'before'            => '', 
        'sep'               => '', 
        'after'             => '',
        'display_tax_name'  => false,
        'taxonomy_sep'      => '&colon; &nbsp; &nbsp;',
        'multi_tax_sep'     => '</br>',
        'hierarchical'      => true
    ];
    $args = wp_parse_args( $args, $defaults );

    $post_type = $post->post_type;
    $taxonomies = get_object_taxonomies( $post_type, 'objects' );

    $returned_list = [];
    foreach ( $taxonomies as $taxonomy_slug => $taxonomy ){
        if( $args['hierarchical'] == $taxonomy->hierarchical && has_term( '', $taxonomy_slug ) && 'post_format' != $taxonomy_slug ) {
            $term_list = get_the_term_list( $post->ID, $taxonomy_slug, $args['before'], $args['sep'], $args['after'] );
            
            if( true == $args['display_tax_name'] ){
                $returned_list[] = strtoupper($taxonomy_slug) . $args['taxonomy_sep'] . $term_list;
            }else{
                $returned_list[] = $term_list;
            }
        }
    }

    if( $returned_list ) {  
        $count =  count($returned_list); 
        if( 1 === $count ) {
            return implode( '', $returned_list );
        }else{
            $multi_list = [];
            foreach ( $returned_list as $key=>$value ) {
                if (array_key_exists($key + 1, $returned_list)) {
                    $multi_list[] = $value . $args['multi_tax_sep'];
                }else{
                    $multi_list[] = $value;
                }
            }
            return implode( '', $multi_list );
        }
    }
}

Example of use in a template to display the term list. You can either make use of the normal reading characters or HTML entities in conjunction with html_entity_decode() and the character chart

Arguments as string

<span class="cat-links">
    <?php echo get_taxonomies_terms_links('sep=, &display_tax_name=' . true .'&taxonomy_sep=' . html_entity_decode( '&raquo;&nbsp;&nbsp;' ) ); ?>
</span>

Arguments as an array

<span class="cat-links">
    <?php 
        echo get_taxonomies_terms_links(
            [
            'sep'               => ', ',
            'display_tax_name'  => true,
            'taxonomy_sep'      => html_entity_decode( '&raquo;&nbsp;&nbsp;' ) 
            ],
        );
    ?>
</span>
5
  • wow someone give this man a medal Commented Nov 12, 2014 at 0:51
  • I used <?php echo get_the_term_list( $post->ID, 'types', ' ', ', ', ' ' ); ?> and it worked great because I only need to list for one taxonomy, but GREAT function above incase I ever want to display a posts list of both taxonomy categories it has. Thank you! Commented Nov 12, 2014 at 0:54
  • Glad it worked out for you. Enjoy :-) Commented Nov 12, 2014 at 4:15
  • hey @PerterGoosen im curious about this function I want to ask you something over chat. Commented Nov 13, 2014 at 8:40
  • I cant seem to figure out how to start a chat, by any chance can you start one? @PieterGoosen Commented Nov 13, 2014 at 8:47
0

The functions you have tried are for terms by themselves, just existing in site.

What you are looking for is get_the_terms(), which retrieves terms of specific taxonomy, assigned to specific post.

1
  • hmm so if it's get_the_terms( $post, $taxonomy ); how can I specify the $post. Can you possibly give an example. My taxonomy is Types. Commented Nov 12, 2014 at 0:45

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.