Advertisement
  1. Code
  2. WordPress

Wp_query Arguments : Les Postes, les Pages et les Types de poste

Scroll to top
Read Time: 10 min
This post is part of a series called Mastering WP_Query.
Mastering WP_Query: Properties and Methods
WP_Query Arguments: Categories and Tags

() translation by (you can also view the original English article)

Dans cette partie de cette série sur WP_Query, vous apprendrez comment utiliser WP_Query pour interroger des postes, des pages et les types de postes personnalisé. Vous pouvez rechercher des postes spécifiques et des pages, ou vous pouvez lancer une requête pour retrouver les messages d’un ou plusieurs types de poste.

Un récapitulatif sur le fonctionnement des Arguments dans WP_Query

Avant de commencer, nous allons avoir un récapitulatif rapide sur le fonctionnement des arguments dans WP_Query. Lorsque vous codez WP_Query dans vos thèmes ou plugins, vous devez inclure les quatre éléments principaux :

  • les arguments de la requête, à l’aide de paramètres qui seront couverts dans ce tutoriel
  • la requête elle-même
  • la boucle
  • finition : fermeture si, tandis que les balises et réinitialisation des données du post (traduction à revoir)

Dans la pratique cela ressemblera à ce qui suit :

1
<?php
2
3
$args = array(
4
    // Arguments for your query.

5
);
6
7
// Custom query.

8
$query = new WP_Query( $args );
9
10
// Check that we have query results.

11
if ( $query->have_posts() ) {
12
13
    // Start looping over the query results.

14
    while ( $query->have_posts() ) {
15
16
        $query->the_post();
17
18
        // Contents of the queried post results go here.

19
20
    }
21
22
}
23
24
// Restore original post data.

25
wp_reset_postdata();
26
27
?>

Les arguments sont ce qui est transmis à WordPress pour extraire des informations de la base de données et ce sont ceux que j’aborderai ici. Donc concentrons nous ici sur la première partie du code :

1
$args = array(
2
    // Arguments for your query.

3
);

Comme vous pouvez le voir, les arguments sont contenues dans un tableau. Vous allez apprendre à les coder au fur et à mesure que vous avancez dans ce tutoriel.

Coder Vos Arguments

Il y a une manière spécifique pour coder les arguments dans le tableau, qui se présente comme suit :

1
$args = array(
2
    'parameter1' => 'value',
3
    'parameter2' => 'value',
4
    'parameter3' => 'value'
5
);

Vous devez mettre les paramètres et leurs valeurs entre des guillemets simples, utilisez => entre eux et séparez-les par une virgule. Si vous obtenez une erreur, WordPress n'a pas ajouté tous vos arguments et ils ne peuvent ne pas correspondre à la requête, vous pouvez obtenir un écran vide.

Une requête simple de posts ou de Pages

Commençons par le scénario le plus simple : exécute une requête pour rechercher un poste spécifique ou une page.

Interrogation d’un poste

Pour trouver un poste spécifique (ou ensemble de messages), vous avez deux options :

  • p (int): utilisation du post ID.
  • Name (chaîne): utilisation de l'identifiant (slug) du poste

Vous pouvez utiliser ces paramètres avec n’importe quel type de poste y compris les messages, les pages, les pièces jointes et les custom post types. Par défaut, WordPress interrogera le « post » type de poste et ne retourne pas de pages ou custom post types — si vous voulez le faire vous aurez besoin d’ajouter plus d’arguments ou d’utiliser un argument différent, lequel je viendrai à plus loin dans ce tutoriel.

Donc, pour revenir à un poste spécifique vous utiliseriez l’une d'entre elles :

1
$args = array(
2
    'p' => '32'
3
);

ou :

1
$args = array(
2
    'name' => 'post_slug'
3
);

Notez que le paramètre de name prend l'identifiant (slug) du post comme argument, pas son titre.

Utilisez le paramètre name, rend plus facile à identifier ce que votre requête va chercher dans la base de données lorsque vous revisitez votre code à une date ultérieure, mais il y a le risque que cela ne fonctionnera pas si un des utilisateurs de votre site change l'identifiant(slug) du post. Impossible de modifier l’ID du message, donc c’est plus sûr.

Vous recherchez une seule Page

Pour rechercher une page spécifique, vous avez deux options à nouveau :

  • page_id (int): utilisez l’ID de la page.
  • pagename (chaîne):  utilisation de l'identifiant (slug) de la page

Ainsi, pour exécuter une requête de lecture juste pour une page spécifique dans la base de données, vous utilisez l’un d'entre eux :

1
$args = array(
2
    'page_id' => '20'
3
);

ou :

1
$args = array(
2
    'pagename' => 'page_slug'
3
);

Interrogation d’un poste d’un autre Type

Pour exécuter une requête pour un poste d’un autre type de poste, y compris un type de message personnalisé, vous aviez également utiliser le paramètre post_type. J’aborderai cela un peu plus en détail plus loin dans ce tutoriel, mais en bref, à la requête pour un seul poste dans le type de message personnalisé du product, vous devez utiliser ceci :

1
$args = array(
2
    'p' => '46',
3
    'post_type' => 'product'
4
);

Ou pour rechercher une pièce jointe, vous utiliseriez :

1
$args = array(
2
    'p' => '46',
3
    'post_type' => 'attachment'
4
);

Interrogation des Pages enfant

Parfois, vous devrez récupérer toutes les pages qui sont des enfants d’une page donnée, par exemple, si votre site dispose d’une structure hiérarchique page et que vous voulez afficher une liste dans chacune des enfants de la page.

Remarque : Vous ne feriez pas cela avec les postes comme ils ne sont pas hiérarchiques, alors que vous pouvez avec un custom post type si il est hiérarchique.

Vous avez trois arguments, que vous pouvez utiliser pour ce faire :

  • post_parent (int): ID de page permet de renvoyer uniquement les pages enfants. La valeur 0 pour retourner uniquement les entrées haut niveau.
  • post_parent__in (array): utiliser un tableau de message IDs.
  • post_parent__not_in (array): utiliser un tableau de message IDs.

Nous allons jeter un oeil à chacune d’elles.

Le premier, post_parent, vous permet d'interroger les pages qui sont des enfants d’une page spécifique.

Donc pour trouver toutes les pages qui sont des enfants d’une page donnée, vous devriez utiliser ceci :

1
$args = array(
2
    'post_type' => 'page',
3
    'post_parent' => '2'
4
);

Notez que vous devez inclure l’argument post_type comme le type de message par défaut WP_Query cherche est post.

Pour aller plus loin, c’est comme cela que vous l’utiliseriez pour trouver des enfants de la page en cours :

1
$current_page_id = get_the_ID();
2
3
$args = array(
4
    'post_type' => 'page',
5
    'post_parent' => $current_page_id
6
);

Vous pouvez également utiliser ce paramètre pour identifier les pages de niveau supérieur, c'est-à-dire sans un parent :

1
$args = array(
2
    'post_type' => 'page',
3
    'post_parent' => '0'
4
);

Mais que se passe-t-il si vous souhaitez identifier les enfants de plusieurs pages ? Vous pouvez faire cela aussi, avec le paramètre post_parent__in. Cela prend un tableau de message IDs.

Donc pour rechercher les enfants de deux de vos pages, vous devriez utiliser ceci :

1
$args = array(
2
    'post_type' => 'page',
3
    'post_parent__in' => array(
4
        '2',
5
        '4'
6
    )
7
);

Vous pouvez également exclure les pages enfants de votre requête, en utilisant le paramètre post_parent__not_in :

1
$args = array(
2
    'post_type' => 'page',
3
    'post_parent__not_in' => array(
4
        '2',
5
        '4'
6
    )
7
);

Interrogation de plusieurs messages

Il est également fréquent pour exécuter une requête pour inclure ou exclure les messages multiples. Vous avez deux arguments, que vous pouvez utiliser pour cela :

  • post__in (array): utilisation de post IDs.
  • post__not_in (tableau): utilisation de post  IDs.

L’argument post__in peut être utilisé pour tous les types de poste et prend un tableau d’IDs. Donc pour obtenir une liste des postes spécifiques, vous devriez utiliser ceci :

1
$args = array(
2
    'post__in' => array(
3
        '36',
4
        '52',
5
        '246',
6
        '354'
7
    )
8
);

Remarque : Si vous utilisez cet argument pour aller chercher les messages, WordPress encore cherchera des sticky messages, même s’ils ne sont pas dans votre liste. Pour les omettre , vous utiliserez l’argument ignore_sticky_posts :

1
$args = array(
2
    'post__in' => array(
3
        '36',
4
        '52',
5
        '246',
6
        '354'
7
    ),
8
    'ignore_sticky_posts' => 'true'
9
);

L’argument post__not_in fonctionne de manière similaire, en prenant à nouveau un tableau de message ID, mais il sortira tout le reste sauf les postes énumérés. Vous devriez normalement le combiner avec d’autres arguments pour éviter l’affichage d’une liste de messages.

Donc, pour rechercher tous les messages du product du post-type mais exclure quelques uns :

1
$args = array(
2
    'post_type' => 'product',
3
    'post__not_in' => array(
4
        '36',
5
        '52',
6
        '246',
7
        '354'
8
    )
9
);

Donc pour combiner cela avec l’un de nos exemples précédents, voici comment vous interrogerez tous les niveau supérieur pages sauf l’actuel :

1
$current_page_ids = array( get_the_ID() );
2
3
$args = array(
4
    'post_parent' => '0',
5
    'post__not_in' => $current_page_ids
6
);

Notez que si vous avez enregistré également un type de poste hiérarchique, vous aurez besoin d’inclure le paramètre post_type dans ce code pour interroger juste les pages.

Interrogation pour les Types de poste

Dans certains des exemples ci-dessus, j’ai utilisé le paramètre post_type pour identifier les messages d’un certain type. Nous allons jeter un coup d’oeil sur les arguments que vous pouvez utiliser avec ce paramètre :

  • post : un poste (billet/message:...)
  • page : une page.
  • revision : une révision.
  • attachment : une pièce jointe.
  • nav_menu_item : un élément de menu de navigation.
  • any: récupère n’importe quel type sauf des révisions et des types avec « exclude_from_search » a la valeur true lorsqu’ils ont été enregistrés.
  • Types de message personnalisés (p. ex. product).

Comme nous l’avons vu ci-dessus, vous pouvez utiliser ce paramètre avec d’autres arguments pour rendre votre requête plus spécifique.

Pour donner un exemple simple, voici donc comment vous interroge pour toutes les pages de votre site :

1
$args = array(
2
    'post_type' => 'page'
3
);

Types de message personnalisé

Interrogation pour un type de message personnalisé est simple : utiliser le nom que vous avez donné le type de poste lors de l’inscription, pas le titre qui est utilisé dans les menus de l’admin. Alors disons que vous avez enregistré vos types de poste de produit en utilisant register_post_type() comme suit :

1
function register_product() {
2
3
    $args = array(
4
        'name' => __( 'Products', 'tutsplus' ),
5
        'singular_name' => __( 'Product', 'tutsplus' )
6
    );
7
8
    register_post_type( 'product', $args );
9
}

La valeur que vous utilisez pour l’argument post_type lorsque vous interrogez des produits n’est pas « Produit » ou « Produits » mais « produit » :

1
$args = array(
2
    'post_type' => 'product'
3
);

Pièce jointe

Par défaut si vous essayez d’exécuter une requête pour les pièces jointes il ne fonctionnera pas, car WordPress définit le post_status de pièces jointes "hérité" inherit et WP_Query par défaut est 'post_status' => 'publish' sauf indication contraire. Donc si vous voulez rechercher les pièces jointes, vous devez inclure l’argument post_status :

1
$args = array(
2
    'post_type' => 'attachment',
3
    'post_status' => 'inherit'
4
);

Notez que vous pouvez également utiliser any au lieu de inherit.

Résumé

Utiliser  WP_Query pour créer des requêtes personnalisées pour les messages et comptabiliser les types est quelque chose que j’ai fais beaucoup. Comme vous avez vu dans les exemples ici, il y a beaucoup de possibilités :

  • Il permet de rechercher les pages de niveau supérieurs dans votre site.
  • Utilisez-le pour rechercher les messages d’un type de poste spécifique.
  • Il permet de rechercher tous les messages sauf ceux que vous spécifiez.
  • Il permet de rechercher tous les enfants de la page actuelle.

Il y a beaucoup plus de possibilités en utilisant les arguments visés ici, mais cela devrait vous donner un avant-goût.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.