Requêtes personnalisées WordPress – Utilisation de la classe WP_Query

Publié: 2021-02-06

WordPress propose un large éventail de fonctions prêtes à l'emploi qui, dans la plupart des cas, permettent de récupérer les informations nécessaires dans la base de données. Mais lors du développement d'un site Web WordPress, il existe de nombreux scénarios dans lesquels un filtre ou une action ne suffit pas pour obtenir le résultat souhaité. Dans ces cas. WordPress propose une solution de contournement sous la forme de la classe WP_Query .

Voyons comment la classe WP_Query peut être utilisée !

Cas de requête personnalisés

REMARQUE : Cet article suppose que vous avez une certaine connaissance de PHP et de MySQL/MariaDB et que vous savez travailler avec WordPress.

Quelle que soit la page que vous visitez, WordPress exécute ce qu'on appelle une « requête principale » pour afficher le contenu. Ainsi, lorsque vous visitez une page comme une vue de catégorie par exemple, un objet WP_Query est créé en coulisses et récupère toutes les données nécessaires de la base de données pour afficher la page.

Ce que fait essentiellement WP_Query , c'est vous offrir la possibilité de récupérer le contenu de la base de données de votre site Web sans avoir à utiliser de requêtes SQL.

Pour cela, il suffit de définir les arguments correspondant à nos besoins et un nouvel objet WP_Query sera créé et traduit en une requête SQL.

Un exemple utilisant WP_Query

Si nous voulons afficher les publications d'une catégorie spécifique, dans un autre modèle de catégorie, la création d'un nouvel objet de requête est nécessaire.

Pour les besoins de cet exemple, nous avons activé le thème Twenty Twenty et créé 2 publications dans une catégorie nommée « Catégorie 1 » et 2 publications dans une catégorie nommée « Services ».

De plus, nous avons créé un modèle de vue de catégorie personnalisé pour les publications de la « Catégorie 1 ». Le slug de cette catégorie est 'category-1' donc le fichier sous le dossier du thème devrait être category-CATEGORYSLUG.php qui dans notre cas est category-category-1.php .

Veuillez coller ce qui suit dans le fichier category-category-1.php .

 <?php /*** Custom Category 1 Template */ get_header(); ?> <main role="main"> <section class="site-content"> <div role="main"> <?php if ( have_posts() ) : ?> <header class="archive-header"> <h3 class="archive-title">Category: <?php single_cat_title( '', true ); ?></h3> </header> <?php while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; endif; ?> </div> </section> </main> <?php get_sidebar(); ?> <?php get_footer(); ?>

Avant la boucle, nous utilisons la méthode have_posts pour déterminer s'il y a plus de messages disponibles dans la boucle.

the_post() est nécessaire pour que la boucle parcoure les articles et indique à WordPress de passer à l'article suivant du tableau des articles.

À ce stade, notre vue frontale de la catégorie ( https://mycompanyname.com/category/category-1/ ) ressemblera à ceci :

Je sais qu'en utilisant ce morceau de code, nous avons négligé d'inclure beaucoup d'informations sur les publications, mais pour cet exemple, il est préférable de rester simple et de n'afficher que les titres des publications.

Pour voir les propriétés de l'objet de requête que WordPress a créées pour cette vue, nous pouvons simplement ajouter cette ligne dans notre code après le endif; déclaration.

 var_dump ( $wp_query->query_vars );

Maintenant, si vous actualisez votre page, vous trouverez ces informations sous la liste des publications :

 array(63) { ["category_name"]=> string(10) "category-1" ["error"]=> string(0) "" ["m"]=> string(0) "" ["p"]=> int(0) ["post_parent"]=> string(0) "" ["subpost"]=> string(0) "" ["subpost_id"]=> string(0) "" ["attachment"]=> string(0) "" ["attachment_id"]=> int(0) ["name"]=> string(0) "" ["pagename"]=> string(0) "" ["page_id"]=> int(0) ["second"]=> string(0) "" ["minute"]=> string(0) "" ["hour"]=> string(0) "" ["day"]=> int(0) ["monthnum"]=> int(0) ["year"]=> int(0) ["w"]=> int(0) ["tag"]=> string(0) "" ["cat"]=> int(16) ["tag_id"]=> string(0) "" ["author"]=> string(0) "" ["author_name"]=> string(0) "" ["feed"]=> string(0) "" ["tb"]=> string(0) "" ["paged"]=> int(0) ["meta_key"]=> string(0) "" ["meta_value"]=> string(0) "" ["preview"]=> string(0) "" ["s"]=> string(0) "" ["sentence"]=> string(0) "" ["title"]=> string(0) "" ["fields"]=> string(0) "" ["menu_order"]=> string(0) "" ["embed"]=> string(0) "" ["category__in"]=> array(0) { } ["category__not_in"]=> array(0) { } ["category__and"]=> array(0) { } ["post__in"]=> array(0) { } ["post__not_in"]=> array(0) { } ["post_name__in"]=> array(0) { } ["tag__in"]=> array(0) { } ["tag__not_in"]=> array(0) { } ["tag__and"]=> array(0) { } ["tag_slug__in"]=> array(0) { } ["tag_slug__and"]=> array(0) { } ["post_parent__in"]=> array(0) { } ["post_parent__not_in"]=> array(0) { } ["author__in"]=> array(0) { } ["author__not_in"]=> array(0) { } ["ignore_sticky_posts"]=> bool(false) ["suppress_filters"]=> bool(false) ["cache_results"]=> bool(true) ["update_post_term_cache"]=> bool(true) ["lazy_load_term_meta"]=> bool(true) ["update_post_meta_cache"]=> bool(true) ["post_type"]=> string(0) "" ["posts_per_page"]=> int(10) ["nopaging"]=> bool(false) ["comments_per_page"]=> string(2) "50" ["no_found_rows"]=> bool(false) ["order"]=> string(4) "DESC" }

Supposons que nous souhaitions afficher la liste des publications appartenant à la catégorie "Services" sous les publications décrites ci-dessus. Étant donné que la page a déjà créé un objet de requête pour la catégorie actuelle, nous devrons contourner ce problème en manipulant les principaux arguments de requête existants.

Voyons comment WordPress nous permet d'y parvenir.

La fonction query_posts

La fonction query_posts() est un moyen de modifier la requête principale que WordPress utilise pour afficher les publications. Pour ce faire, il met de côté la requête principale et la remplace par une nouvelle requête. Vous pouvez le voir par vous-même dans le fichier wp-includes/query.php où il est introduit.

 function &query_posts($query) { unset($GLOBALS['wp_query']); $GLOBALS['wp_query'] =& new WP_Query(); return $GLOBALS['wp_query']->query($query); }

Nous allons essayer d'ajouter une autre boucle pour afficher les messages 'Services' en ajoutant les lignes suivantes sous le endwhile; de la boucle standard actuelle.

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

Et voilà :

Il y a cependant un inconvénient à cette méthode. Si nous essayons d'imprimer la catégorie incluse dans l'objet de requête, nous remarquerons qu'elle est modifiée.

Essayez d'insérer var_dump ( $wp_query->query_vars["category_name"] ); après la requête Services et actualisez la page. Vous devriez voir ce résultat :

 string(8) "services"

Cela s'est produit parce que la requête a été modifiée mais n'a jamais été annulée. Cette approche peut causer beaucoup de problèmes avec le contenu qui suit nos requêtes.

Pour éviter ces conflits et nettoyer après un appel à query_posts , appelez wp_reset_query() et la requête principale d'origine sera restaurée. Votre code devrait donc ressembler à ceci :

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );

Lors de l'actualisation de votre page, vous voyez maintenant que la catégorie de page initiale est de retour dans la requête.

 string(10) "category-1"

Enfin, nous devons mentionner que query_posts doit être évité car il ajoute une surcharge à votre requête car il provoque en fait la requête principale à s'exécuter à nouveau.

La fonction get_posts()

Le même résultat peut être obtenu avec l'utilisation de la fonction get_posts() pour récupérer un tableau de publications correspondant aux critères donnés.

Remplacez la boucle Services illustrée ci-dessous…

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );

…avec celui-ci:

 $my_query = get_posts( array ( 'category' => 17 ) ); foreach($my_query as $post) : setup_postdata($post); the_title( '<h4 class="example"></h4>' ); endforeach; var_dump ( $wp_query->query_vars["category_name"] );

Comme vous pouvez le voir cette fois, nous avons dû travailler avec l'identifiant de la catégorie au lieu du nom de la catégorie, selon les arguments get_posts() définis par WordPress.

Une autre chose importante à noter ici est que même si nous n'avons pas réinitialisé la requête, la sortie var_dump de la catégorie de requête était toujours intacte et n'a pas été remplacée par "services". C'est parce que get_posts() en lui-même ne modifie pas la requête principale. Nous venons d'utiliser une nouvelle variable ' $my_query ' pour créer une nouvelle instance de l'objet de requête sans le remplacer.

La fonction get_posts() utilise les mêmes paramètres que query_posts() et est suggérée lorsque vous souhaitez ajouter des boucles personnalisées statiques n'importe où dans votre modèle car elle est sûre et facile à utiliser.

Créer un nouvel objet WP_Query

$wp_query est un objet de la classe WP_Query et récupère le contenu de la base de données nécessaire pour la page en cours. Remplacer cette classe est notre façon de personnaliser les résultats et d'afficher un contenu différent.

Voici le morceau de code que nous allons utiliser :

 $services_query = new WP_Query( 'category_name=services' ); if ( $services_query->have_posts() ) { while ( $services_query->have_posts() ) : $services_query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; } wp_reset_postdata(); var_dump ( $wp_query->query_vars["category_name"] );

Nous avons utilisé l'argument 'category_name' pour définir le slug de la catégorie dans laquelle nous voulons que ses messages soient affichés.

Nous avons enregistré le nouvel objet new WP_Query( 'category_name=services' ); dans la variable $services_query .

Ensuite, nous avons utilisé une boucle while pour afficher le contenu et après cela, nous avons réinitialisé la boucle avec wp_reset_postdata(); afin de restaurer les données d'origine de la requête principale.

Si vous souhaitez expérimenter d'autres arguments de la classe WordPress WP_Query, vous pouvez trouver la liste complète sur sa page WordPress Codex.