I have a hierarchical custom taxonomy which I can display using print_r(get_the_terms( $post->ID, 'taxonomic_rank' ));
:
Array
(
[46] => stdClass Object
(
[term_id] => 46
[name] => Aplocheilidae
[slug] => aplocheilidae
[term_group] => 0
[term_taxonomy_id] => 53
[taxonomy] => taxonomic_ranks
Custom taxonomy, get_the_terms, listing in order of parent > child =>
[parent] => 39
[count] => 1
[object_id] => 443
)
[47] => stdClass Object
(
[term_id] => 47
[name] => Aplocheilus
[slug] => aplocheilus
[term_group] => 0
[term_taxonomy_id] => 54
[taxonomy] => taxonomic_ranks
Custom taxonomy, get_the_terms, listing in order of parent > child =>
[parent] => 46
[count] => 1
[object_id] => 443
)
[39] => stdClass Object
(
[term_id] => 39
[name] => Cyprinodontiformes
[slug] => cyprinodontiformes
[term_group] => 0
[term_taxonomy_id] => 52
[taxonomy] => taxonomic_ranks
Custom taxonomy, get_the_terms, listing in order of parent > child =>
[parent] => 0
[count] => 1
[object_id] => 443
)
)
This taxonomy will always take the following form:
Order (parent) > Family (child of Order) > Sub-family (child of Family)
Is there a quick and easy way of displaying these taxonomies in the correct order, so that I could print out the following line? Order: <order>, Family: <family>, Sub-family: <sub-family>
Thanks in advance
7 s
There are probably some better ways to do this but you can always do a three simple foreach
loops.
I wrote an example function that does the job well and should serve you as a good starting point:
function print_taxonomic_ranks( $terms="" ){
// check input
if ( empty( $terms ) || is_wp_error( $terms ) || ! is_array( $terms ) )
return;
// set id variables to 0 for easy check
$order_id = $family_id = $subfamily_id = 0;
// get order
foreach ( $terms as $term ) {
if ( $order_id || $term->parent )
continue;
$order_id = $term->term_id;
$order = $term->name;
}
// get family
foreach ( $terms as $term ) {
if ( $family_id || $order_id != $term->parent )
continue;
$family_id = $term->term_id;
$family = $term->name;
}
// get subfamily
foreach ( $terms as $term ) {
if ( $subfamily_id || $family_id != $term->parent )
continue;
$subfamily_id = $term->term_id;
$subfamily = $term->name;
}
// output
echo "Order: $order, Family: $family, Sub-family: $subfamily";
}
Let it live in your functions.php
file and use it in your templates like this:
print_taxonomy_ranks( get_the_terms( $post->ID, 'taxonomic_rank' ) );
NOTE: Looping the same array three times around sounds a bit stupid but on the other hand it’s a quick and easy solution which is easy to read, extend and maintain.