Actualités WEB et WordPress, thèmes, plugins. Ici, nous partageons des conseils et les meilleures solutions de sites Web.

Guide : comment interroger des publications dans WordPress

37

Quelles sont les méthodes disponibles pour créer une requête de publication personnalisée et quand sont-elles préférables ? Cet article vise à établir une solide compréhension de deux méthodes d’interrogation des articles, comment accéder aux résultats, comment construire des arguments et enfin comment nettoyer après. Les deux méthodes que nous allons examiner sont get_posts()et WP_Query.

Quand il s’agit de faire une nouvelle requête de publication, il y a vraiment deux options (au moment de la rédaction). Le choix dépend vraiment de vos préférences (et de quelques effets mineurs sur les performances). Une option a le potentiel de gâcher la boucle/requête globale dans laquelle vous vous trouvez actuellement, sauf si vous la gérez correctement. Avec une option, vous manipulez des objets et dans l’autre option, vous manipulez un tableau. Les arguments de personnalisation de la requête post sont cependant identiques.

Requête globale ?

Si vous n’êtes pas sûr de ce que je veux dire par "gâcher la requête globale", c’est ceci. WordPress fait toujours une requête globale, selon la page sur laquelle vous vous trouvez. Si un visiteur visite une archive de catégorie, WordPress a fait une requête de publication pour cette Le thème accéderait normalement aux articles de la requête en utilisant "la boucle". Lorsque nous faisons une nouvelle requête avec sa propre boucle à l’intérieur de cette boucle, nous devons nous assurer que la requête globale de WordPress et notre requête sont traitées séparément.

Cependant, si vous souhaitez modifier la requête de publication de WordPress, c’est une autre histoire. J’ai un autre post qui va en profondeur sur la façon de le faire.

Examinons les deux options qui s’offrent à nous et comment nous les gérons. Après cela, nous verrons les arguments pour personnaliser la requête. Gardez à l’esprit que les arguments sont identiques pour les deux.

Les deux méthodes d’interrogation des posts

Vous pouvez interroger les publications avec la fonction get_posts()ou créer une nouvelle instance de WP_Query.La première option renvoie un tableau de publications et dans la seconde, vous gérez un objet. Parce que get_posts()renvoie un tableau contenant uniquement les messages, il est généralement plus simple de l’utiliser où vous le souhaitez. Cependant, si vous souhaitez paginer votre requête, vous devez absolument opter pour la création d’une WP_Queryinstance.

La fonction get_postsest une fonction wrapper, WP_Queryce qui signifie qu’elle accepte les mêmes arguments, mais get_postsa quelques arguments "alias" supplémentaires. La page de documentation de WordPress pour get_posts ne répertorie pas les arguments possibles (à l’exception des arguments d’alias), mais fait référence à la page de documentation de WP_Query pour les arguments. Nous reviendrons plus en détail sur les arguments plus tard.

Si les performances sont un problème (c’est-à-dire que le site contient beaucoup de messages), get_postsest plus rapide que d’utiliser WP_Querycar il ignore le calcul de la pagination.

La méthode de boucle dans votre requête de publication personnalisée diffère selon la méthode que vous choisissez. Vous devez être familiarisé avec la boucle WordPress commune utilisée dans presque tous les modèles de thème :

if (have_posts()) {
    while (have_posts()): the_post();
        // Access to each post; you can use template tags here
    endwhile;
}

Boucler en utilisant WP_Query

La boucle des résultats de l’utilisation WP_Queryest exactement la même, sauf que nous nous référons spécifiquement à l’objet instance dans la boucle. Nous devons également nous rappeler de "réinitialiser l’état" une fois que nous avons terminé la boucle afin que l’objet de publication global revienne à ce qu’il était avant. Pour ce faire, nous utilisons wp_reset_postdata().

$custom_query = new WP_Query([/ Arguments here /]);
if ($custom_query->have_posts()) {
    while ($custom_query->have_posts()): $custom_query->the_post();
        // Access to each post; you can use template tags here
    endwhile;
    wp_reset_postdata();
}

Si vous videz l’objet instancié par WP_Query( $custom_querydans l’exemple ci-dessus), vous trouverez la requête complète et les arguments utilisés. Les parties intéressantes ici sont les propriétés ‘ found_posts‘ et ‘ posts‘. La postspropriété ‘ ‘ contient le résultat des objets post par lesquels la boucle passera. Le nombre de publications correspondant à votre requête est renvoyé entre ‘ found_posts‘ et est utile si vous souhaitez créer une pagination personnalisée. Divisez cette valeur avec le paramètre WordPress pour le nombre de publications par page pour déterminer le nombre de pages dont vous avez besoin pour votre requête, ou faites simplement référence à la propriété «max_num_pages».

Remarque: Lorsque vous utilisez get_postsWordPress, seule la postspropriété ‘ ‘ (qui est un tableau) est renvoyée de l’ WP_Queryobjet.

Boucler en utilisant get_posts

En utilisant get_posts, nous n’utilisons pas la "boucle WordPress" habituelle, mais nous utilisons une boucle de tableau PHP normale. Chaque élément du tableau est un post-objet et aucune réinitialisation n’est nécessaire une fois la boucle terminée. Gardez à l’esprit que les balises de modèle (telles que the_title(), the_permalink()etc.) ne sont pas disponibles dans cette boucle. Vous devrez vous référer aux propriétés de l’objet post (par exemple $custom_post->ID).

$custom_query = get_posts([/ Arguments here /]);
foreach ($custom_query as $custom_post) {
    // Template tags are not available here, refer to the post object properties, for example:
    echo $custom_post->post_title;
}

Je vous recommande de nommer vos objets de publication différemment de $post. Vous pouvez rencontrer des problèmes lorsque vous essayez d’accéder aux propriétés de publication (cela peut faire référence à l’objet de publication global et non à la publication dans la boucle).

Si vous souhaitez utiliser des balises de modèle pour accéder plus facilement aux informations de publication (telles que the_title()et the_permalink()), vous pouvez le faire. Pour ce faire, dites à WordPress de configurer l’objet post global à l’intérieur de la boucle avec setup_postdata(). Si vous faites cela, vous devrez réinitialiser l’état wp_reset_postdata()après la boucle.

$custom_query = get_posts([/ Arguments here /]);
foreach ($custom_query as $post) {
    setup_postdata($post);
    // Template tags are available here, for example:
    the_title();
}
wp_reset_postdata();

Gardez à l’esprit que setup_postdatales objets que vous parcourez (la aspartie " " dans la boucle foreach) doivent être nommés$post! Dans le premier exemple, j’ai nommé les objets post $custom_postet cela ne fonctionnerait pas avec setup_postdata().

Cependant, si vous avez juste besoin d’accéder aux informations de publication de base, vous pouvez également ignorer la configuration de l’objet de publication global et utiliser plutôt les get_balises de modèle " " correspondantes et l’ID de publication. Par exemple, la balise the_permalink()ne fonctionne correctement que si l’objet post global est configuré, mais vous pouvez demander le permalien post sans l’objet post global simplement en utilisant echo get_the_permalink($custom_post->ID).

Arguments de requête

Vous pouvez trouver la liste complète de tous les arguments possibles sur la page de documentation de WP_Query. Des exemples de paramètres sont des articles avec des termes spécifiques d’une taxonomie, des méta-valeurs d’articles, des types d’articles, l’inclusion ou l’exclusion d’articles spécifiques et toute une gamme d’options pour ordonner les résultats. Il y en a trop pour les détailler, mais voici quelques exemples courants d’arguments pour interroger les publications.

Exemple 1 : Publications associées de la même catégorie

Supposons que vous souhaitiez afficher une «publication associée» à la fin d’une seule publication. Il doit montrer une sélection aléatoire de 3 messages qui sont dans la même catégorie que le message actuel, et il doit exclure le message actuel du résultat.

$post_id = get_the_ID();  // current post ID
$custom_query = new WP_Query([
    'post_type' => 'post',
    'posts_per_page' => 3,
    'category__in' => wp_get_post_categories($post_id),
    'post__not_in' => [$post_id],
    'orderby' => 'rand'
]);

Les arguments sont assez explicites. Je demande uniquement ‘ post‘ dans ‘ post_type‘ et un maximum de 3 messages dans ‘ posts_per_page'.

Pour interroger les publications dans les catégories, vous pouvez créer une tax_query ou utiliser le plus simple ‘ category__in‘ (NB : ne fonctionne que pour la catégorie de publication). Dans l’exemple ci-dessus, j’utilise wp_get_post_categories()pour obtenir un tableau d’identifiants de terme attribués au message fourni, et je l’utilise pour l’argument ‘ category__in‘.

Vous pouvez exclure les ID de publication avec ‘ post__not_in‘ alors que j’ai fourni l’ID de publication actuel. Enfin j’ai demandé un ordre aléatoire des posts en mettant ‘ rand‘ dans ‘ orderby‘. Vous pouvez fournir par exemple ‘ title‘ ou ‘ date‘ pour les ordonner différemment. Jetez un œil à la documentation de commande pour voir ce qui est possible.

Exemple 2 : Toutes les publications d’un type de publication personnalisé avec plusieurs arguments de classement

Dans cet exemple, nous supposons que vous avez un type de publication personnalisé ‘ book‘ et dans un modèle de page personnalisé, vous souhaitez afficher tous les livres publiés. Vous souhaitez ordonner les messages principalement par menu_order (l’attribut de la page, c’est un nombre que vous pouvez définir par message), et deuxièmement le titre du message.

$custom_query = new WP_Query([
    'post_type' => 'book',
    'posts_per_page' => -1,
    'orderby' => ['meny_order' => 'ASC', 'title' => 'DESC']
]);

Encore une fois, les arguments sont assez explicites. Je demande le type de message ‘ book‘ comme ‘ post_type‘. Lorsque vous définissez ‘ posts_per_page‘ sur -1, il récupère tous (messages publiés, sauf si vous spécifiez quelque chose de différent dans post_statusl’argument ‘ ‘). Enfin je fournis un tableau à ‘ orderby‘ pour indiquer à WordPress de trier les articles principalement par ordre de menu dans l’ordre croissant, et deuxièmement le titre de l’article dans l’ordre décroissant.

Exemple 3 : Publications avec des métadonnées personnalisées

Supposons que vous ayez un type de publication personnalisé " book" et que vous souhaitiez interroger tous les livres non publiés ou un livre publié entre 1990 et 2019.

$custom_query = new WP_Query([
    'post_type' => 'book',
    'posts_per_page' => -1,
    'meta_query' => [
        'relation' => 'OR',
        [
            'key' => 'book_status',
            'value' => 'unpublished',
            'compare' => '='
        ],
        [
            'key' => 'year_published',
            'value' => [1990, 2019],
            'type' => 'numeric',
            'compare' => 'BETWEEN'
        ]
    ]
]);

Il est préférable de créer une requête en utilisant post meta meta_query(pour des méta arguments très simples, vous pouvez utiliser meta_keyet meta_valuedirectement). L’ meta_queryargument ‘ ‘ nécessite un tableau, où chaque argument est un tableau. Vous pouvez contrôler la relation entre chaque argument avec ‘ relation‘, que j’ai défini sur ‘ OR‘ dans l’exemple ci-dessus.

Je fournis deux arguments de métadonnées à ‘ meta_query‘. La première compare simplement la clé méta ‘ book_status‘ au texte ‘ unpublished‘, et si elle est égale, elle sera incluse. Dans le deuxième argument, je dis à WordPress d’obtenir n’importe quelle valeur dans la clé méta ‘ year_published‘ entre les nombres 1990 et 2019.

Conclusion

Vous devriez maintenant avoir une compréhension de base des deux méthodes d’interrogation des publications. Il n’y a pas une grande différence car vous pouvez créer la même requête en utilisant les deux, mais la manière de gérer les deux est différente. Les trois exemples d’arguments de requête fournis ne font qu’effleurer la surface des requêtes que vous pouvez créer. Reportez-vous à la documentation WP_Query pour un aperçu complet avec de nombreux exemples.

Si vous êtes curieux de savoir comment modifier la requête globale effectuée par WordPress, j’ai un article séparé qui approfondit ce sujet.

Source d’enregistrement: awhitepixel.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More