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: ': '
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( '» ' )
And this will work
$args = [
'display_tax_name' => true,
'hierarchical' => false,
'taxonomy_sep' => html_entity_decode( '» ' )
]
The function
function get_taxonomies_terms_links( $args = '' ){
global $post;
$defaults = [
'before' => '',
'sep' => '',
'after' => '',
'display_tax_name' => false,
'taxonomy_sep' => ': ',
'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( '» ' ) ); ?>
</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( '» ' )
],
);
?>
</span>