Trier les articles selon une taxonomie

Pour trier des listes d’articles, WordPress propose plusieurs paramètres de base. Par défaut, les articles affichés sur la page d’accueil, comme dans les pages d’archives sont triés par date de publication. On peut facilement les trier par nom, ou encore par un custom field, ces champs d’information que l’on peut associer à un article. Mais si, comme sur mon blog personnel, on veut trier selon une date enregistrée en taxonomie personnalisée, ce n’est pas possible par défaut.

C’est un choix assumé par les concepteurs de WordPress qui considèrent que les taxonomies ne sont pas conçues pour enregistrer une information numérique, mais uniquement du texte. Un choix respectable, mais qui ne convient pas à mon cas de figure. Si je veux associer un article à une date, en l’occurrence une date de sortie pour un film, ou de publication pour une œuvre publiée, et obtenir des pages d’archive comme celle-ci, je n’ai pas le choix, je dois utiliser une taxonomie. Cette information étant particulièrement utile pour trier des articles, par exemple pour trier les films d’un réalisateur par l’ordre de sortie, je devais une solution pour le faire en fonction de cette taxonomie.

J’ai cherché une solution pendant longtemps et ma solution de replis a été jusque-là de dupliquer la taxonomie dans un custom field. Outre que c’est une solution contraignante quand on a plus de 850 articles, ce n’est pas très logique de dupliquer ainsi une information. Lors de ma dernière recherche sur le sujet, j’ai toutefois trouvé le code qui permet de trier selon n’importe quelle taxonomie. La solution provient du blog JR Nielsen et elle est très simple à mettre en place.

Copiez/collez ce code et placez-le dans le fichier functions.php de votre thème. Il est prévu pour fonctionner dans tous les cas et il n’y a qu’une seule chose à changer, ligne 6 : remplacez ce qui se trouve entre parenthèses par les identifiants de vos propres taxonomies. Dans mon cas, cela donne : $taxonomies = array('annee');

//allows queries to be sorted by taxonomy term name
add_filter('posts_clauses', 'posts_clauses_with_tax', 10, 2);
function posts_clauses_with_tax( $clauses, $wp_query ) {
global $wpdb;
//array of sortable taxonomies
$taxonomies = array('example-taxonomy', 'other-taxonomy');
if (isset($wp_query->query['orderby']) && in_array($wp_query->query['orderby'], $taxonomies)) {
$clauses['join'] .= "
LEFT OUTER JOIN {$wpdb->term_relationships} AS rel2 ON {$wpdb->posts}.ID = rel2.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} AS tax2 ON rel2.term_taxonomy_id = tax2.term_taxonomy_id
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
";
$clauses['where'] .= " AND (taxonomy = '{$wp_query->query['orderby']}' OR taxonomy IS NULL)";
$clauses['groupby'] = "rel2.object_id";
$clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
$clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ? 'ASC' : 'DESC';
}
return $clauses;
}

Vous pouvez ensuite directement utiliser la taxonomie comme critère de tri, n’importe où dans le thème. Par exemple pour lister tous les articles en les triant selon la taxonomie « Année », j’utilise :

query_posts($query_string . '&posts_per_page=-1&orderby=annee&order=ASC');

Il suffit d’ajouter une autre taxonomie, ligne 6 du code précédent pour pouvoir l’utiliser en guise de tri ailleurs. C’est simple et cela fonctionne, même s’il faut pour cela réaliser une jointure en SQL. En théorie, ce type de solution n’est pas très bonne pour les performances, mais je n’ai pas noté de différence avec la méthode par défaut de WordPress et le tri sur un custom field.

Publicités

Une recherche instantanée sur WordPress

Dans ma quête d’optimisation de mon blog personnel qui tourne sur WordPress, quête qui alimente régulièrement ce blog technique, la recherche interne est un problème particulièrement complexe. Le blog compte actuellement environ 820 articles pour un total d’un million de mots. Ajoutons à cela les mots-clés et la taxonomie, les commentaires éventuellement et j’atteins vite les limites de mon hébergement mutualisé. D’autant que, pour diverses raisons qui feront peut-être l’objet d’un article séparé, j’ai choisi de remplacer la recherche par défaut par celle fournie par Relevanssi qui indexe plus, mais est plus lente.

recherche-wordpress Lire la suite « Une recherche instantanée sur WordPress »

Préparer son blog pour les cartes Twitter

Twitter limite ses messages à 140 caractères, tout compris. Si vous voulez évoquer l’un de vos articles sur le réseau social, le lien vers l’article en question exploite déjà une vingtaine de caractères. Pour décrire le sujet ou vanter ses mérites, il ne vous reste dès lors qu’une vingtaine de caractères au mieux. C’est souvent trop peu et on est obligé de n’associer que le titre de l’article au lien original, ce qui n’est pas toujours très vendeur.

Il existe pourtant une meilleure solution. À condition de configurer correctement son blog, on peut donner à Twitter quelques informations supplémentaires pour chaque lien et les afficher en-dessous du tweet. Cette fonction, nommée « Twitter Cards » par le réseau social, est assez simple à mettre en place et elle vous permettra d’obtenir une meilleure visibilité. Sur le site et dans les logiciels officiels, on pourra obtenir quelque chose comme ça :

Une carte Twitter en action : tous les liens du blog À voir et à manger auront droit à cet aperçu avec une image et un résumé, ce qui offre plus de place dans le tweet pour présenter l'article.
Une carte Twitter en action : tous les liens du blog À voir et à manger auront droit à cet aperçu avec une image et un résumé, ce qui offre plus de place dans le tweet pour présenter l’article.

Lire la suite « Préparer son blog pour les cartes Twitter »

Récupérer l’URL de n’importe quelle page

Pour obtenir l’adresse d’un article et l’utiliser dans son thème — par exemple pour les réseaux sociaux — WordPress propose une fonction toute simple. En utilisant the_permalink();, on obtient le lien de l’article en cours et cela fonctionne parfaitement.

Le problème se pose dès que vous voulez l’URL d’une page qui n’est pas créée manuellement par vos soins (article ou page), mais générée automatiquement par WordPress. Mettons que vous voulez l’adresse d’une page d’archive, comme celle qui rassemble tous les articles publiés pendant un mois, cette fonction ne donne pas bon le résultat. Elle vous donnera l’adresse du dernier article et non celle de la page d’archive elle-même.

Pour trouver toutes les adresses du blog, quelle qu’elle soit, il existe ce code qui fonctionne très bien d’après mon expérience :

echo home_url( $wp->request );

Je dois avouer que je ne sais pas exactement comment cela marche, mais ça marche. Rendons à César, ce qui appartient à César : l’inspiration vient de ce blog. À noter que j’ai simplifié la version originale, puisqu’elle allongeait l’URL de base sans aucune raison apparente. Si quelqu’un veut m’expliquer que j’ai tort, les commentaires sont ouverts…