WordPress: Récupérer les informations sur la taxonomie

Lorsque l’on développe un plugin pour WordPress, l’une des tâches les plus courantes est de récupérer des informations à partir de la base de données.
Pour les objets principaux tels que les pages, les articles, les catégories, l’API de WordPress nous fournit un ensemble de fonctions assez simples, et qui nous permettent de récupérer à peu près ce que l’on veut.
Pour d’autres objets, les fonctions sont plus rares, moins souples, ou peu documentées, et nous sommes assez vite tentés de requêter directement la base, ce qui est fortement déconseillé. Je viens de découvrir deux fonctions assez pratiques pour récupérer les objets de la taxonomie de WordPress, sans faire de requêtes directe à la base de données.

Je me suis confronté récemment à deux questions:

  • Comment récupérer la liste des catégories des liens?
  • Comment récupérer la liste des tags pour une liste d’articles données?

Dans les deux, j’ai cherché une fonction qui puisse m’éviter de requêter directement la base de données. J’ai fini par écrire ces fameuses requêtes, faute d’avoir trouvé les fonctions requises.

Et puis, j’ai finalement trouvé deux fonctions qui répondent à mes questions. Il s’agit de wp_get_object_terms, et de get_terms.

Pour wp_get_object_terms, la syntaxe exacte est la suivante:
wp_get_object_terms( $object_id, $taxonomies, $args = array()))

Avec

  • $object_id (entier ou tableau), un identifiant ou une liste d’identifiant,
  • $taxonomies (chaîne de caractère ou tableau), une taxonomie ou une liste de taxonomie. Les valeurs possibles dépendent des taxonomies enregistrées. Dans le cas d’une installation standard de WordPress, la liste est la suivante:
    • category,
    • link_category
    • post_tag
  • $args (chaîne de caractère ou tableau), les paramètres définissant la liste que l’on souhaite récupérer (les champs, l’ordre … La liste des valeurs possibles est:
    • orderby, valeur par défaut: name, valeurs possibles: count, name, slug, term_group, term_order,
    • order, valeur par défaut: asc,
    • fields, liste des champs, valeur par défaut:all, valeurs possibles: all, ids, names, all_with_object_id,

Pour get_terms:
&get_terms($taxonomies, $args = array()))

Avec

  • $taxonomies (chaîne de caractère ou tableau), une taxonomie ou une liste de taxonomie. Les valeurs possibles dépendent des taxonomies enregistrées. Dans le cas d’une installation standard de WordPress, la liste est la suivante:
    • category,
    • link_category
    • post_tag
  • $args (chaîne de caractère ou tableau), les paramètres définissant la liste que l’on souhaite récupérer (les champs, l’ordre … La liste des valeurs possibles est:
    • orderby, valeur par défaut: name, valeurs possibles: count, name, slug, term_group, term_order,
    • order, valeur par défaut: asc,
    • fields, liste des champs, valeur par défaut:all, valeurs possibles: all, ids, names,
    • hide_empty, valeur par défaut: TRUE. Ne renvoie rien s’il n’y a pas encore de termes dans la taxonomie,
    • exclude, include, permet de spécifier ou d’exclure des termes,
    • number nombre maximum de termes à afficher (par défaut tous),
    • slug permet de spécifier le terme que l’on recherché par son identifiant.
    • Autres paramètres: parent, hierarchical, get, name__like, pad_counts, offset, search

Prenons les deux questions initiales:

Récupérer toutes les catégories des liens

En requêtant directement la base de données:

1
2
3
4
5
6
7
global $wpdb;
$results = $wpdb->get_results('SELECT ter.term_id,ter.name FROM '.$wpdb->term_taxonomy.' AS tax, '.$wpdb->terms.' AS ter WHERE tax.taxonomy="link_category" AND ter.term_id=tax.term_id');
if ($results) {
   foreach ($results as $result) {
      echo $result->term_id.' '.$result->name.'<br />';
   }
}

En utilisant get_terms, le code devient:

1
2
3
4
5
6
$results = get_terms('link_category');
if ($results) {
   foreach ($results as $result) {
      echo $result->term_id.' '.$result->name.'<br />';
   }
}

Récupérer tous les tags d’une liste d’articles
L’exemple suivant va collecter tous les tags des articles actuellement affichés.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
global $posts;	
foreach ($posts as $post_values) {
   $array_id[] = $post_values->ID;
}
$list_id = implode('","', $array_id);
$sql_query = 'SELECT DISTINCT name	'.
             'FROM '.$wpdb->term_relationships.' AS rel,'.
                     $wpdb->term_taxonomy.' AS tax,'.
                     $wpdb->terms.' AS ter '.
             'WHERE tax. taxonomy = "post_tag" '.
                    'AND rel.object_id IN ("'. $list_id.'") '.
                    'AND rel.term_taxonomy_id = tax.term_taxonomy_id '.
                    'AND tax.term_id = ter.term_id ORDER BY tax.count';
$results = $wpdb->get_results($sql_query);
If ($results) {
    echo 'Tags: '.implode(', ', $results);
}

Avec la fonction wp_get_object_terms, le code devient:

1
2
3
4
5
6
7
8
global $posts;	
foreach ($posts as $post_values) {
   $array_id[] = $post_values->ID;
}
$results = wp_get_object_terms($array_id, 'post_tag', 'fields=names' );
if ($results) {
    echo 'Tags: '.implode(', ', $results);
}

Conclusion

Mes recherches initiales étaient donc incomplètes :- :$ . En réfléchissant un peu, il est clair que WordPress doit forcement disposer de toutes les fonctions nécessaires pour accéder à la base, sinon il ne fonctionnerait pas très bien.
Il faut donc persévérer pour trouver les fonctions qui conviennent. Une lecture du code de WordPress s’avèrent, dans ce cas, assez utile.
Les deux fonctions présentée dans cet article permettent déjà de récupérer l’ensemble des objets liés à la taxonomie de notre outil préféré.

6 thoughts on “WordPress: Récupérer les informations sur la taxonomie”

  1. Effectivement, si la requete porte sur plusieurs articles, il vaut mieux « arranger » la liste (suppression des doublons, tri …).

  2. Si je peux me permettre je rajouterai un « $results = array_unique ($results); »

    Lors de l’utilisation de wp_get_object_terms car sinon les mots-clefs utilisés en commun sur plusieurs articles sont repris.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *