In WordPress capita moltissime volte la necessità di mostrare la lista delle tassonomie (taxonomy terms).
Chissà quante volte avrete avuto bisogno di mostrare una semplice lista delle categorie dei post e sarete andati a cercare plugin vari per farlo.
Vediamo come è possibile mostrare la taxonomy terms nel nostro template WordPress con un breve snippet di codice, con il quale, volendo possiamo anche metterla in ordine a piacere
Cominciamo col riportare uno snippet di codice, sotto, che produrrà un elenco di nomi di termini (taxonomy terms) collegati agli archivi corrispondenti e magari anche il numero di post in quel termine della tassonomia specificata.
<?php
$terms = get_terms( array(
'taxonomy' => 'product_cat', // set your taxonomy here
'hide_empty' => false, // default: true
) );
if ( empty( $terms ) || is_wp_error( $terms ) ) {
return;
}
echo '<ul>';
foreach( $terms as $term ) {
printf(
'<li><a href="%s">%s</a> <span class="term-count">(%s)</span></li>',
esc_url( get_term_link( $term ) ),
esc_attr( $term->name ),
$term->count
);
}
echo '</ul>';
?>
Vediamo come funziona questo codice. Per prima cosa forniamo un array di parametri alla funzione predefinita di WordPress get_terms(), che andiamo ad usare per il nostro scopo.
In pratica questa funzione molto funzionale (scusate il gioco di parole), recupera tutti i termini in una data tassonomia o elenco di tassonomie, per capirci se fossero delle categorie di articoli recupererebbe tutte le categorie di articoli.
Infatti, guarda caso, il primo parametro fornito alla funzione è la tassonomia ‘product_cat’, ma ovviamente sostituendolo con la vostra tassonomia recupererete la vostra particolare lista.
Dopo di che indichiamo come secondo parametro ‘hide_empty’ ‘false‘, ovvero mostraci anche le categorie vuote, infatti di default il suo valore è ‘true‘.
E di default i valori della lista che ci verrà mostrata sono in ordine ascendente.
Se volete conoscere i valori che è possibile passare all’array della funzione get_terms() e le loro impostazioni di default sono questi:
$get_terms_default_attributes = array (
'taxonomy' => 'category', //empty string(''), false, 0 don't work, and return empty array
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => true, //can be 1, '1' too
'include' => 'all', //empty string(''), false, 0 don't work, and return empty array
'exclude' => 'all', //empty string(''), false, 0 don't work, and return empty array
'exclude_tree' => 'all', //empty string(''), false, 0 don't work, and return empty array
'number' => false, //can be 0, '0', '' too
'offset' => '',
'fields' => 'all',
'name' => '',
'slug' => '',
'hierarchical' => true, //can be 1, '1' too
'search' => '',
'name__like' => '',
'description__like' => '',
'pad_counts' => false, //can be 0, '0', '' too
'get' => '',
'child_of' => false, //can be 0, '0', '' too
'childless' => false,
'cache_domain' => 'core',
'update_term_meta_cache' => true, //can be 1, '1' too
'meta_query' => '',
'meta_key' => array(),
'meta_value'=> '',
);
Poi nel nostro snippet di codice non facciamo altro che usare un ciclo foreach per creare una lista html contenente il nome della tassonomia e un valore (count) del numero di post o custom post appartenenti a quella tassonomia.
Se poi volessimo mostrare la lista ordinata in altro modo, ad esempio per ID in ordine discendente, quello che dobbiamo fare è modificare la parte in cui si fornisce l’array a get_terms() in questo modo:
$terms = get_terms( array(
'taxonomy' => 'product_cat',
'orderby' => 'ID', // default: 'orderby' => 'name',
'order' => 'DESC',
'hide_empty' => false, // default: true
) );
Un’altra interessante opzione che potrebbe servire in caso la nostra lista fosse composta di un gran numero di categorie con molti sottolivelli, è quella di mostrare solo il livello principale, nel qual caso bisogna fornire all’array il parametro ‘parent’ in questo modo:
$terms = get_terms( array(
'taxonomy' => 'product_cat',
'parent' => 0
) );
Sempre nel caso di molte categorie con diversi sottolivelli al contrario magari vogliamo mostrare i sottolivelli e magari vogliamo anche mostrare il tutto in un campo select di un form ed in questo caso il recupero è un po’ più complicato quindi dobbiamo ricorrere a più cicli foreach come in questo snippet di codice:
$taxonomies = get_terms( array(
'taxonomy' => 'product_cat',
'hide_empty' => false
) );
if ( !empty($taxonomies) ) :
$output = '<select>';
foreach( $taxonomies as $category ) {
if( $category->parent == 0 ) {
$output.= '<optgroup label="'. esc_attr( $category->name ) .'">';
foreach( $taxonomies as $subcategory ) {
if($subcategory->parent == $category->term_id) {
$output.= '<option value="'. esc_attr( $subcategory->term_id ) .'">
'. esc_html( $subcategory->name ) .'</option>';
}
}
$output.='</optgroup>';
}
}
$output.='</select>';
echo $output;
endif;