Display current post custom taxonomy in WordPress
How to display current post taxonomies and terms
Here is a modified code from the Codex (see link below) that will display all the taxonomies of the current post with attached terms:
<?php // get taxonomies terms linksfunction custom_taxonomies_terms_links() { global $post, $post_id; // 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); $out = "<ul>"; foreach ($taxonomies as $taxonomy) { $out .= "<li>".$taxonomy.": "; // get the terms related to post $terms = get_the_terms( $post->ID, $taxonomy ); if ( !empty( $terms ) ) { foreach ( $terms as $term ) $out .= '<a href="' .get_term_link($term->slug, $taxonomy) .'">'.$term->name.'</a> '; } $out .= "</li>"; } $out .= "</ul>"; return $out;} ?>
This is used like this:
<?php echo custom_taxonomies_terms_links();?>
Demo output
The output might look like this if the current post has the taxonomies country
and city
:
<ul> <li> country: <a href="http://example.com/country/denmark/">Denmark</a> <a href="http://example.com/country/russia/">Russia</a> </li> <li> city: <a href="http://example.com/city/copenhagen/">Copenhagen</a> <a href="http://example.com/city/moscow/">Moscow</a> </li> </ul>
Reference
The original code example in the Codex:
http://codex.wordpress.org/Function_Reference/get_the_terms#Get_terms_for_all_custom_taxonomies
Hope this helps - I'm sure you can adapt this to your project ;-)
Update
But what if I want to display only some of them and not all of them? Also, I would like to name them myself instead of it giving taxonomy names with underscores. Any idea how can I achieve that?
Here is one modification to achieve that:
function custom_taxonomies_terms_links() { global $post; // some custom taxonomies: $taxonomies = array( "country"=>"My Countries: ", "city"=>"My cities: " ); $out = "<ul>"; foreach ($taxonomies as $tax => $taxname) { $out .= "<li>"; $out .= $taxname; // get the terms related to post $terms = get_the_terms( $post->ID, $tax ); if ( !empty( $terms ) ) { foreach ( $terms as $term ) $out .= '<a href="' .get_term_link($term->slug, $tax) .'">'.$term->name.'</a> '; } $out .= "</li>"; } $out .= "</ul>"; return $out;}
Just in case someone wants to display them grouped by parent.
It's basically the same answer as above. I used this answer form another post:https://stackoverflow.com/a/12144671to group them (by id and by parent).
Function modified to use it with objects:
function object_group_assoc($array, $key) { $return = array(); foreach($array as $object) { $return[$object->$key][] = $object; } return $return;}
Final function:
// get taxonomies terms linksfunction custom_taxonomies_terms_links() { global $post, $post_id; // 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); $out = "<ul>"; foreach ($taxonomies as $taxonomy) { $out .= "<li>".$taxonomy.": "; // get the terms related to post $terms = get_the_terms( $post->ID, $taxonomy ); if ( !empty( $terms ) ) { $terms_by_id = object_group_assoc($terms, 'term_id'); $terms_by_parent = object_group_assoc($terms, 'parent'); krsort($terms_by_parent); foreach ( $terms_by_parent as $parent_id => $children_terms ){ if($parent_id != 0){//Childs //Add parent to out string $parent_term = $terms_by_id[$parent_id][0]; //[0] because object_group_assoc return each element in an array $out .= '<li><a href="' .get_term_link($parent_term->slug, $taxonomy) .'">'.$parent_term->name.'</a>'; //Add children to out string $out .= '<ul>'; foreach ($children_terms as $child_term) { $out .= '<li><a href="' .get_term_link($child_term->slug, $taxonomy) .'">'.$child_term->name.'</a></li>'; } $out .= '</ul></li>'; } else {//parent_id == 0 foreach ($children_terms as $child_term) { if(!array_key_exists($child_term->term_id, $terms_by_parent)){//Not displayed yet becouse it doesn't has children $out .= '<li><a href="' .get_term_link($child_term->slug, $taxonomy) .'">'.$child_term->name.'</a></li>'; } } $out .= '</ul></li>'; } } } $out .= "</li>"; } $out .= "</ul>"; return $out;}
Used the same way:
<?php echo custom_taxonomies_terms_links();?>
Note: just working with one level children terms.