Tout savoir sur WordPress
Loop

WP Query : créez des requêtes personnalisées dans vos thèmes WordPress

WordPress vous permet de créer vos propres requêtes et de récupérer toutes les données que vous souhaitez. Découvrez comment modifier la requête principale ou comment créer une toute nouvelle requête de données

J’aimerais pouvoir récupérer les données WordPress de mon choix, c’est possible ?

Cet article est une mise à jour de mon article sur les boucles WP, avec les bonnes pratiques les plus récentes.

Fonctionnement des boucles WordPress (The Loop)

A chaque page que vous affichez, WordPress exécute automatiquement une requête en fonction de la page à afficher, conformément au schéma de hierarchie de template : template hierarchy WP.

Par exemple, si vous cliquez sur une catégorie, WordPress sait qu’il doit : afficher la liste des articles de cette catégorie, dans l’ordre chronologique, au nombre de 10. chacun de ces éléments est un paramètre de la requête.

wp-template-hierarchy

Voici la hiérarchie de base. Si elle ne vous parle pas, ce n’est pas trop génant pour le moment, mais pensez à prendre un peu de temps pour l’étudier, ça vous servira à coup sûr !

Les paramètres de WP Query

WordPress sait donc quoi aller chercher en fonction de l’URL jointe. Vous allez pouvoir donc influencer la requête principale de la page, ou alors créer la votre en supplément.

Voyons tout d’abord quelques paramètres de requête WordPress. Vous trouverez la liste exhaustive sur la page du codex : WP Query. (Tout ça !!)

Pour reprendre l’exemple plus haut, en français : afficher la liste des articles de la catégorie films, dans l’ordre chronologique, au nombre de 10.

En terme d’arguments et code PHP ça donne :

$args = array(
    'post_type' => 'post',
    'category_name' => 'films',
    'posts_per_page' => 10,
    'order' => 'DESC',
);

Compris ? Vous pouvez maintenant affiner avec tous les paramètres de WP Query :  Ajoutons que nous voulons seulement les articles de l’auteur Maxime, qui sont encore à l’état de brouillon, et qui ont le mot-clé action ou trhiller:

$args = array(
    'post_type' => 'post',
    'category_name' => 'films',
    'posts_per_page' => 10,
    'order' => 'DESC',
    'author_name' => 'maxime',
    'post_status' => 'draft', 
    'tag_slug__in' => array('action', 'thriller'),
);

Et ainsi de suite !

Requêtes avancées…

…Sur les champs personnalisés

Vous pouvez aller très loin avec ces paramètres ! Par exemple, vous pourrez sélectionner des articles par rapport à la valeur de leurs champs additionnels (custom fields) très utile si vous utilisez ACF ! 

Cela peut s’avérer utile si par exemple vous avez un site immobilier avec un type de publication biens et qu’un champ surface stocke la surface en m2. Si vous voulez récupérer un bien entre 50 et 80m2  :

$args = array(
	'post_type'  => 'biens',
        'meta_query' => array(
            'relation' => 'AND',
	    array(
		'key'     => 'surface',
                'value'   => '50',
                'type'    => 'numeric',
                'compare' => '>=',
	    ),
	    array(
                'key' => 'surface',
		'value'   => '80',
		'type'    => 'numeric',
		'compare' => '<',
	    ),
      ),
);

Pour les requêtes plus simple, il y a une écriture simplifiée. Ici on cherche une valeur située dans un intervalle.

…Sur les dates

Vous souhaitez récupérer les articles publiés il y a plus d’un an et modifiés le mois dernier ?

$args = array(
	'date_query' => array(
		array(
			'column' => 'post_date_gmt',
			'before' => '1 year ago',
		),
		array(
			'column' => 'post_modified_gmt',
			'after'  => '1 month ago',
		),
	),
	'posts_per_page' => -1,
);

Sympa non ?

Créer une requête personnalisée

Bon c’est bien beau tout ça mais maintenant je la lance comment ma requête ? C’est facile !

// 1. on défini ce que l'on veut
$args = array(
    'post_type' => 'post',
    'category_name' => 'films',
    'posts_per_page' => 10,
);

// 2. on exécute la query
$my_query = new WP_Query($args);

// 3. on lance la boucle !
if($my_query->have_posts()) : while ($my_query->have_posts() ) : $my_query->the_post();
    
    the_title();
    the_content();
    the_post_thumbnail();

endwhile;
endif;

// 4. On réinitialise à la requête principale (important)
wp_reset_postdata();

En 4 étapes simples :

  1. Définissez vos arguments
  2. Lancez la requête
  3. Lancez la boucle pour afficher vos résultats. Vous reconnaissez, c’est comme les boucles standard !
  4. Réinitialisez les valeurs pour ne pas perdre la requête principale.

Dans quel cas utiliser une nouvelle requête ? Imaginez que vous souhaitez afficher plein de choses sur votre page d’accueil, par exemple le contenu de votre page Accueil, les 4 derniers articles, et les 4 derniers biens immobiliers. Maintenant vous pouvez !

Modifier la requête existante

Parfois, vous aurez simplement besoin d’ajouter ou modifier des paramètres de la requête principale de votre WordPress. Dans ce cas, nul besoin d’en créer une autre. Nous allons intercepter la requête avant son exécution grâce à un Hook et injecter nos nouveaux paramètres. Dans votre functions.php :

function pimp_ma_query($wp_query) {

    if($wp_query->is_main_query() and !is_admin() and is_home() )):
        
        $wp_query->set('posts_per_page', 20);

    endif;

}
add_action('pre_get_posts', 'pimp_ma_query');

Ici on indique que pour la page d’accueil seulement (is_home()) on veut afficher 20 articles au lieu des 10 configurés par défaut dans WordPress. Ce paramètre est modifiable dans les options de WordPress.

Pour connaitre toutes les fonctions conditionnelles de template, rendez-vous ici :  Conditional templates tags. Il y a aussi l’article de Julio Potier qui vous explique ça en détails et en FR : Marqueurs Conditionnels

Et voilà, vous avez tous les éléments pour personnaliser vos requêtes et en créer de nouvelles personnalisées.

Cet article a été mis à jour il y a 434 jours

Article écrit par Maxime BJ

Développeur, bloggeur et formateur Web spécialisé WordPress. 31 ans. Grenoblois. Co-fondateur de WPChef, l’organisme de formation WordPress.

Organisateur de WPInAlps, le meetup WordPress Grenoblois. Vous pouvez me rencontrer lors d’événements tels que WordCamp Paris et Europe. Traducteur Français de l’extension Advanced Custom Fields. Également développeur d’applications web avec MeteorJs. Je m’occupe un site pour apprendre l’informatique aux débutants gratuitement.

J’aime les jeux vidéo, la rando, la bouffe bien grasse et les voyages.

13 Commentaires

Laisser un commentaire

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

  1. Bonjour Maxime,

    J’ai essayé de bidouiller en combinaison de l’ACF, ça fonctionne sur la homepage pour des articles par date mais je suis bloqué dans mes arguments PHP, parce que je veux aussi afficher les dates futures comme ici : http://bit.ly/1iSPkkU

    Une piste pour m’éclairer? merci ;)

    • Merci bcp;

      Je vais tester l’idée trouvée sur ce lien,il y a une piste intéressante.

      Sinon pour le display future post, il y a quelques plugins qui le fait bien mais le seul hic c’est que ça affiche les posts sur la page d’accueil en avance. Par exemple, les posts du jeudi O1 Oct. sont déjà affichés (en avance on va dire) alors que j’aurais aimé que ça soit affiché sur la homepage le jour J et pas avant ;)

      Encore merci

  2. Bonjour,
    je souhaite comprendre pourquoi on utilise différents codes pour les requêtes:
    je lis vos articles et ceux cités en liens afin de pouvoir appréhender les possibilités de php
    pour moi, les explications sont un peu difficiles.
    ainsi par exemple je ne comprends pas à quel moment on utilise « array »
    un peu plus loin dans les code, pour afficher sur la homepage 20 articles on utilise « set »
    à d autres endroits, on utilise « get », ou bien une foultitude d’autres codes…
    je suis un peu perdu. pouvez vous me dire ou pouvoir avoir ces infos que je puisse les mémoriser et les assimiler de façon pas trop hard.
    pour résumer les différences sont que:
    -on utilise « array » pour les requetes (query) où on demande a wp de récupérer et d’afficher en les integrant dans une nouvelle boucle, des informations spécifiques.
    -tandis que dans le cas où on intègre dans une boucle existante des informations relatives au même type de post, on n a pas besoin de faire un requete, mais on ajoute simplement une déclaration en plus dans la boucle.
    est-ce bien celà?
    merci de me corriger si ce qu e je dis n ‘est pas juste.
    Cordialement

    • Salut,
      pour faire court : les arrays sont des tableaux de données qui vont te permettre de définir plusieurs variables en une.
      Les fonctions set et get ont été définiées arbitrairement dans la classe WP_Query. Parfois on a besoin d’insérer une seule donnée, parfois plusieurs, d’où le tableau. C’est la documentation de WP_query sur le Codex qui pourra t’aider à définir quelles valeurs à envoyer.
      Il y a effectivement un cas où tu modifie simplement la requête déjà crée par WordPress, afin de la contraindre un peu plus ou la modifier. Tu utilises ça dans le cas où tu veux modifier ce que la page va afficher.
      Tu utiliseras par contre les requêtes personnalisées en plus de la requête principale par exemple lorsque la principale est chargée d’afficher la page d’un film par exemple, et toi tu veux à la fin afficher une liste de films de la même catégorie : Tu utiliseras donc une nouvelle requête !

  3. Bonjour,

    Je suis en train de concevoir un site web avec de la géolocalisation.
    Je vais devoir effectuer des requêtes sur des champs ACF ajoutés à « store locator » (en fait pas des boutiques mais des espaces partagés)
    Ces requêtes vont devoir me permettre d’additionner des valeurs de champs.
    Par exemple :
    Dans chaque contenu post-type « store locator »
    1 Champ « Région » – Lot ou Rhône ou Bourgogne
    1 Champ « Nombre de participants »

    Je vais devoir afficher le nombre de participants situé dans le Lot = donc additionner les valeurs du champ « Nombre de participants » de tous les « articles » ou le champ « Région » est rempli avec « Lot ».

    Avez vous des pistes de réflexion pour répondre à mon besoin ?

    Merci pour vos articles bien costauds ! (je ne sais pas si c’est grâce aux voyages, à la rando, aux jeux vidéos ou à la bouffe bien grasse … mais c’est costaud !)

    • Il faut que tu utilise la meta_query et indiquer le nom du champ ACF que tu veux alors ! Et si tu as utilisé un champ relationnel tu peux te servir de la reverse query de ACF pour retrouver les infos liées. Ca dépend vraiment de la structure de tes données. Je t’invite à rejoindre le slack WordPress FR pour qu’on en discute en direct, ce sera plus simple :)

  4. Bonjour Maxime et merci pour cet article qui m’a bien aidé.
    J’ai repris ton exemple pour construire une requête sauf que j’ai une différence avec toi, je souhaiterai combiner dans ma requête 2 post type different.
    Je m’explique, j’ai un type de post qui sont des films et un type de post qui sont des séries.
    J’aimerai afficher les teaser des films et séries au même endroit en faisant une seule boucle par la suite.
    J’ai donc construit 2 requêtes du style :

    ‘serie’,
    ‘meta_query’ => array(
    array(
    ‘key’ => ‘teaser’,
    ‘value’ => ‘Oui’,
    ),
    ),
    );
    $queryserie = new WP_Query( $serie );
    ?>

    ‘film’,
    ‘meta_query’ => array(
    array(
    ‘key’ => ‘teaser’,
    ‘value’ => ‘Oui’,
    ),
    ),
    );
    $queryfilm = new WP_Query( $film );

    ?>

    Je récupère les films et séries dont l’option « Teaser » est sur oui.
    Dois je faire une seule requête qui combine les 2? Si oui, sais tu comment je dois construire la requête?
    Ou dois je ensuite fusionner les tableaux? J’ai testé avec un array_merge mais sans succès, je pense que je m’égare un peu.

    Que préconiserais tu?

    D’avance merci pour ton aide.
    Cordialement,

    • Salut !
      Oui tu peux ne faire qu’une seule requête en mettant dans post_type tes 2 types :
      'post_type' => array('film','serie'),

      Si cependant tu veux faire 2 listes bien distinctes (l’une après l’autre ou dessous l’autre) il faudra alors faire 2 WP query différentes

  5. Bonjour maxime
    Merci pour ce tuto mais j’ai une question, comment obtenir un argument d’une WP_Query.
    Par exemple avec
    $args = array(
    ‘post_type’ => ‘post’,
    ‘category_name’ => ‘films’,
    ‘posts_per_page’ => 10,
    );

    $my_query = new WP_Query($args); si je veux avoir le category_name de $my_query est ce qu’il faut que je fasse $wp_query->category_name ?

    • Normalement si tu as fait toi une requête tu dois être en possession de ces informations, tu peux alors les stocker dans une variable pour plus tard. Sinon regarde du côté de get_query_var qui te permet de récupérer ces infos !