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:
wp_terms
wp_term_relationships
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
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.