J’ai récemment eu besoin de créer un système de vote sur un site sous WordPress et d’afficher les articles les plus votés, j’ai donc utilisé un plugin de vote, cependant celui ci ne me permettait pas de pouvoir voter pour les articles d’une catégorie seulement. Il me proposait uniquement par l’intermédiaire d’un widget d’afficher les articles les plus votés sans distinction de catégorie. J’ai donc eu recours à un “custom query” une requète personnalisée qui m’a permis dans ce cas de recuperer les articles de la catégorie voulue mais triés par nombre de votes.

 

Afficher la requète par défaut de wordpress

Pour commencer il s’agit de savoir quelle requête est effectuée par WordPress afin de pouvoir la modifier. Il faut pour cela insérer dans nore page category.php le code suivant.

<?php echo $GLOBALS['wp_query']->request; ?>

Nous voyons donc s’afficher dans notre page la requète en SQL pur.

SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (13,14) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10

Il suffit à présent de construire notre propre requète à partir de celle ci.

 

Construire sa propre requète

Nous allons dans l’exemple suivant créer une requète qui nous affichera la liste des articles de la catégorie voulu mais classés par auteurs. Pour bien comprendre comment construire cette requète il faut utiliser le shema de base de donée de wordpress ici.

Dans notre cas la requète personnalisée sera la suivante :

SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (13,14) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_author DESC

Vous pouvez constater que l’on à modifié le ORDER BY à la fin de la requète, vous pouvez de cette manière apporter toutes sortes de modifications à condition d’être familer du SQL.

 

Jouer notre requête personnalisée

Pour exécuter cette requête WordPress met à notre disposition la méthode “get_results”

$pageposts = $wpdb->get_results($querystr, OBJECT);

Dans le cas présent nous exécutons notre requête préalablement stockée dans la variable $querystr. La connexion à la base de donnée est stockée par défaut dans la variable $wpdb.

 

Exploiter notre record set

Ce record set ne possède pas de sélecteur nous devons donc utiliser une boucle “foreach” pour extraire les résultats dans ce cas un simple “while” ne fonctionnera pas. Voici donc a quoi ressemblera notre boucle basée sur notre requête personnalisée:

<?php if ($pageposts): ?>
 <?php global $post;
  ?>
 <?php foreach ($pageposts as $post): ?>
 <?php setup_postdata($post); ?>

 <?php endforeach; ?>
<?php endif; ?>

Les fonctions habituelles de WordPress fonctionnent bien entendu à l’intérieur de la boucle, exemple:

<?php if ($pageposts): ?>
 <?php global $post;
  ?>
 <?php foreach ($pageposts as $post): ?>
 <?php setup_postdata($post); ?>

<?php the_post_thumbnail()?>
<h1><?php the_title();?></h1>
<a href="?<php the permalink()?>lire</a>

 <?php endforeach; ?>
<?php endif; ?>

 

Télécharger un exemple

Vous trouverez ici un fichier d’exemple. Ce type de manœuvre est bien entendue conseillé aux personnes familières des fonctions de wordpress ainsi que du SQL.

Une réponse à Créer une boucle wordpress basée sur une requète personalisée

  1. Tony dit :

    Très bon tutoriel, c’est complet et plutôt bien expliqué même pour les personnes ayant de petites connaissances en PHP/SQL. Il faut presque copier/coller pour que ça fonctionne. Merci pour le partage des connaissances.

Laisser un commentaire

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