WordPress: tag, categorie, tassonomie e struttura delle tabelle del database correlate

WordPress: tag, categorie, tassonomie e struttura delle tabelle del database correlate

Provando a creare una funzione che, elencati i tag di WordPress, mostrasse anche i relativi primi cinque post, ho notato un limite della funzione get_the_tags(). Questa funzione infatti opera solo nel Loop. Mi sono chiesto come WordPress organizzi i tag nel suo database, anche perchè le soluzioni al problema richiedono tutte l'uso di una query al database. Ecco cosa ho scoperto.

Tag, categorie e tassonomie

WordPress usa tre tabelle per gestire questi tre elementi:

  1. wp_terms
  2. wp_term_relationships
  3. wp_term_taxonomy

wp_terms

Questa tabella ha la seguente struttura:

term_id name slug term_group
1 Filosofia pratica filosofia-pratica 0

Il primo valore è l'ID univoco del termine. Il secondo è il nome esteso del termine (per esempio Filosofia pratica). Il terzo valore invece è il risultato della formattazione operata da WordPress sul nome esteso per renderlo adatto agli URL (per esempio filosofia-pratica). Il quarto e ultimo valore fa riferimento al gruppo a cui appartiene il termine.

Questa tabella da sola non può dirci se un valore fa riferimento ad un tag o ad una categoria. Va incrociata con la tabella wp_term_taxonomy.

wp_term_taxonomy

Questa tabella ha la seguente struttura:

term_taxonomy_id term_id taxonomy description parent count
1 1 category 0 10

I primi due valori si riferiscono rispettivamente all'ID del termine in relazione alla tabella corrente e in relazione ad altre tabelle (stesso nome della tabella precedente, term_id). Il campo taxonomy ci dice se il termine è una categoria, un tag, un link o qualsiasi altro tipo di termine. description è la descrizione che possiamo assegnare al termine tramite il pannello di controllo. parent ci dice quale sia il termine genitore del termine corrente. count, infine, è il numero di post associati a ciascun termine.

Confrontando quindi le due tabelle ora sappiamo che Filosofia pratica è una categoria a cui sono associati 10 post. Il suo ID è 1 e non ha un genitore, ossia non è una sottocategoria di un'altra categoria definita da noi.

wp_term_relationships

Questa tabella ha la seguente struttura:

object_id term_taxonomy_id term_order
1 1 0

Come si può notare, questa terza tabella è collegata alla precedente dalla presenza del campo term_taxonomy_id. Si tratta di una tabella il cui scopo è quello di ordinare in modo logico i termini memorizzati nelle altre due tabelle.

Query sul database

Possiamo dire che nel nostro caso specifico il modo migliore per ottenere quello che vogliamo è eseguire una query sul database:


function display_tags_tree() {

	global $wpdb;
	
	$results = $wpdb->get_results("SELECT * FROM $wpdb->term_taxonomy, 
	$wpdb->terms WHERE taxonomy = 'post_tag' 
	AND $wpdb->term_taxonomy.term_id = $wpdb->terms.term_id");
	
	$html = '<ul>';
	
	foreach($results as $result) {
	
		$id = $result->term_id;
		$name = $result->name;
		$posts = $result->count;
		
		$html .= '<li><a href="' . get_tag_link($id) . '">' . $name . '</a> (' . $posts . ')</li>';
	
	
	}
	
	$html .= '</ul>';	

	return $html;
}

Abbiamo eseguito un semplice join su due tabelle per ottenere l'elenco di tutti i tag con il loro URL, il nome e il numero di post associati.

Torna su