Tutorial: lista taxonomy terms

,

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;

© Noteworkweb