Maîtriser WP_Query : exploiter la puissance de la boucle

PHPz
Libérer: 2023-09-01 10:50:02
original
1221 Les gens l'ont consulté

标题重写为:Mastering WP_Query: Harnessing the Power of the Loop

Comme je l'ai souligné dans l'introduction de cette série, WP_Query les cours comportent quatre éléments principaux :

  • Paramètres de requête, utilisez les paramètres qui seront présentés en détail dans cette série
  • La requête elle-même
  • En boucle, il affichera le contenu de la publication, le titre ou tout ce que vous souhaitez afficher
  • Fin : fermez les balises if et while et réinitialisez les données de publication

Dans ce tutoriel, je vais vous montrer comment utiliser des boucles avec WP_Query, y compris les deux principales façons de créer des boucles et comment utiliser plusieurs boucles.

Faites défiler la position appropriée

Sans la boucle, rien ne sera affiché sur la page. Une fois que WordPress a exécuté la requête avec les paramètres que vous avez définis, vous devez lui indiquer ce qu'il doit sortir à partir des données qu'il obtient. C'est là qu'intervient la boucle.

La boucle vient donc après la requête, qui utilise trois étiquettes :

  • if( $query->have_posts() ) 检查是否有任何帖子。它通过检查查询的 post_count 属性的值是否小于 current_post + 1valeur pour y parvenir.
  • while( $query->have_posts() ) 只要有要检索的帖子, 就会对每个帖子重复循环。正如你所看到的,这个 have_posts() La méthode est la même que celle que nous avons appelée plus tôt pour vérifier s'il y a une publication. Gardez à l’esprit que cette méthode n’incrémente pas le compteur de publications. Cela nous permet simplement de savoir s'il y a des posts dans la boucle ou si nous sommes en fin de boucle. Il rembobine également automatiquement la boucle une fois qu'elle atteint la fin.
  • $query->the_post() Visitez ce post spécifique. Il effectue également quelques autres opérations, telles que la récupération de la publication suivante et l'incrémentation du compteur de publications. Il met également en place des données de publication mondiales pour notre usage.

Appeler have_posts() 方法。这是因为 have_posts() lorsque vous êtes dans une boucle ne doit pas rembobiner la boucle jusqu'au début et vous resterez coincé dans une boucle infinie.

Maintenant, voici où se trouve la boucle dans la classe WP_Query :

<?php

$args = array(
    // Arguments for your query.
);

// Custom query.
$query = new WP_Query( $args );

// Check that we have query results.
if ( $query->have_posts() ) {

    // Start looping over the query results.
    while ( $query->have_posts() ) {
        $query->the_post();
        // Contents of the queried post results go here.
    }

}

// Restore original post data.
wp_reset_postdata();

?>
Copier après la connexion

Après avoir exécuté la boucle, il ne reste plus qu'à la ranger en utilisant wp_reset_postdata() .

Structure de boucle

La façon dont la boucle est structurée dépend des données que vous souhaitez afficher à partir de la publication. Vous trouverez ci-dessous un exemple de boucle qui génère le titre de l'article, l'image sélectionnée et un extrait. Vous pouvez utiliser une boucle comme celle-ci sur les pages d'archives.

<?php

$args = array(
    // Arguments for your query.
);

// Custom query.
$query = new WP_Query( $args );

// Check that we have query results.
if ( $query->have_posts() ) {

    // Start looping over the query results.
    while ( $query->have_posts() ) {

        $query->the_post();

        ?>

        <article id="post-<?php the_ID(); ?>" <?php post_class( 'left' ); ?>>
            <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                <?php post_thumbnail( 'thumbnail' );?>
            </a>
            <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                <?php the_title(); ?>
            </a>
            <?php the_excerpt(); ?>
        </article>

        <?php

    }

}

// Restore original post data.
wp_reset_postdata();

?>
Copier après la connexion

Cette boucle montre exactement ce que j'ai décrit ci-dessus : image sélectionnée, titre et extrait.

Autres boucles : vérifier le contenu

Mais parfois, vous souhaiterez peut-être ajouter un titre avant la liste des publications, ou vous souhaiterez peut-être toutes les inclure dans un élément conteneur. Si vous ajoutez simplement ceci avant la boucle, le résultat sera affiché, que la requête renvoie ou non des données, ce qui signifie que vous pourriez avoir un en-tête sans rien en dessous ou un balisage inutile.

Ce problème peut être facilement résolu en plaçant l'élément ou le titre englobant dans une balise if :

<?php

$args = array(
    // Arguments for your query.
);

// Custom query.
$query = new WP_Query( $args );

// Check that we have query results.
if ( $query->have_posts() ) {

    
    echo '<section class="clear">';
        echo '<h2>' . __( 'Heading', 'tutsplus' ) . '</h2>';
    
        // Start looping over the query results.
        while ( $query->have_posts() ) {
    
            $query->the_post();
    
            ?>
    
            <article id="post-<?php the_ID(); ?>" <?php post_class( 'left' ); ?>>
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php post_thumbnail( 'thumbnail' );?>
                </a>
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php the_title(); ?>
                </a>
                <?php the_excerpt(); ?>
            </article>
    
            <?php
    
        }
    
    echo '</section>';

}

// Restore original post data.
wp_reset_postdata();

?>
Copier après la connexion

Ici, vous pouvez voir que j'ai vérifié si ma requête a récupéré des publications, et si c'est le cas, j'ai ouvert un élément conteneur et ajouté un titre.

Cela est également utile si vous souhaitez afficher les résultats de la requête sous forme de liste. Disons que je souhaite créer une liste de tous les messages d'une catégorie donnée. L'élément ul n'est pas dans ma boucle car il n'est pas lié à une publication spécifique, mais je souhaite l'afficher uniquement s'il y a une publication. J'utilise donc ceci :

<?php

$args = array(
    'category_name' => 'category-slug',
    'post_type' => 'post'
);

// Custom query.
$query = new WP_Query( $args );

// Check that we have query results.
if ( $query->have_posts() ) {

    echo '<ul class="category posts">';

        // Start looping over the query results.
        while ( $query->have_posts() ) {

            $query->the_post();

            ?>

            <li <?php post_class( 'left' ); ?>>
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php the_title(); ?>
                </a>
            </li>

            <?php
    
        }

    echo '</ul>';

}

// Restore original post data.
wp_reset_postdata();

?>
Copier après la connexion

Cela vérifie si la requête a récupéré des publications et, si c'est le cas, ouvre l'élément ul puis exécute la boucle.

Exécutez des boucles supplémentaires

Il est important de noter que même si vous pouvez exécuter plusieurs boucles en utilisant WP_Query 运行多个循环,但您必须重置发布数据并启动 WP_Query, vous devez réinitialiser les données de publication et démarrer une deuxième instance de

pour ce faire. En effet, chaque boucle produira des données basées sur différents paramètres.

Cet exemple montre un extrait et une image vedette du premier article, puis uniquement le titre de chaque article suivant :

<?php

// First query arguments.
$args1 = array(
    'post_type' => 'post',
    'posts_per_page' => '1'
);

// First custom query.
$query1 = new WP_Query( $args1 );

// Check that we have query results.
if ( $query1->have_posts() ) {

    // Start looping over the query results.
    while ( $query1->have_posts() ) {

        $query1->the_post();

        ?>

        <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
            <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                <?php post_thumbnail( 'thumbnail' );?>
            </a>
            <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                <?php the_title(); ?>
            </a>
            <?php the_excerpt(); ?>
        </article>

        <?php

    }

}

// Restore original post data.
wp_reset_postdata();

// Second query arguments.
$args2 = array(
    'offset' => '1',
    'post_type' => 'post'
);

// Second custom query.
$query2 = new WP_Query( $args2 );

// Check that we have query results.
if ( $query2->have_posts() ) {

    echo '<ul class="more-posts">';
    
        // Start looping over the query results.
        while ( $query2->have_posts() ) {

            $query2->the_post();
    
            ?>

            <li <?php post_class(); ?>>
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php the_title(); ?>
                </a>
            </li>
    
            <?php
    
        }
    
    echo '</ul>';

}

// Restore original post data.
wp_reset_postdata();

?>
Copier après la connexion
J'ai utilisé deux paramètres clés ici :
  • 'posts_per_page' => '1'
  • , utilisé avec la première requête, affiche uniquement les derniers messages.
  • 'offset' = '1'
  • , utilisé avec la deuxième requête, ignore le premier message, en s'assurant qu'il n'est pas répété dans la liste ci-dessous.

ul 元素,并将每个帖子标题包含在 liComme vous pouvez le voir dans le code ci-dessus, la boucle est légèrement différente pour chaque requête. Le premier affiche l'image, le titre et l'extrait en vedette, tandis que le second vérifie si la requête contient des publications et, si c'est le cas, ouvre l'élément

et enveloppe le titre de chaque article dans li Links. aux éléments et à leurs pages. 🎜

Vous remarquerez également que j'ai utilisé wp_reset_postdata() après les deux boucles. Si je ne le faisais pas, utiliser la balise template en dehors de la boucle secondaire me donnerait des données sur le dernier message à l'intérieur de la boucle. L’appel de cette fonction réinitialise les données de publication sur la requête principale.

Accédez aux informations de publication dans la boucle

Il existe de nombreuses fonctions que vous pouvez appeler dans une boucle pour accéder aux informations sur la publication en cours. Vous en avez également vu certains utilisés dans ce didacticiel. Dans cette section, je vais vous donner une liste de quelques fonctionnalités courantes que vous pourriez utiliser occasionnellement.

Obtenir le titre

Vous pouvez utiliser trois fonctions pour obtenir le titre d'un article. Ils le sont the_title()get_the_title()the_title_attribute()get_the_title() 函数只是检索帖子标题,而 the_title() 将根据传递的参数显示或检索标题以及可选标记。当您想在显示标题之前对其进行清理时,您应该使用 the_title_attribute() .

Obtenez des extraits ou le contenu complet

Il existe une fonction dédiée appelée the_excerpt() pour afficher un extrait de la publication en cours. Il applique plusieurs filtres à l'extrait fourni afin qu'il puisse être affiché correctement au public. Tous les articles n'auront pas un extrait fourni par l'auteur. Dans ce cas, il génère une version condensée de l’extrait complet du message avant de l’afficher.

Vous pouvez utiliser la fonction the_content() pour afficher le contenu complet du message.

Obtenez des catégories de publications, des balises et d'autres métadonnées

Vos publications WordPress auront généralement des balises ou des catégories que vous attribuez. Vous pouvez y accéder en utilisant the_tags()the_category() 函数在循环中显示这些标签和类别的列表。使用 the_author() 函数显示帖子的作者。帖子的 ID 也可以通过函数 the_ID().

Obtenez la date et l'heure de publication ou de modification

Il existe des fonctions dédiées dans WordPress que vous pouvez utiliser en boucle pour afficher la date de publication d'un article (the_date()) 和时间 (the_time())。您应该记住的两个重要点是 the_time() 也可以用于仅显示帖子的发布日期。此外,对于同一天发布的多个帖子, the_date() 的输出仅回显一次。这基本上意味着您几乎总是希望使用 the_time()) pour une plus grande flexibilité et facilité d'utilisation

.

Résumé

Sans la boucle, WP_Query ne fait pas grand chose. Cette boucle est le code que vous utilisez pour afficher les données que WordPress récupère de la base de données en fonction de vos paramètres de requête.

Comme je l'ai démontré, il y a quelques changements dans la boucle. Une simple boucle affichera toutes les publications dans l'ordre que vous spécifiez dans les paramètres de la requête (ou par ordre de date décroissant par défaut). Si vous séparez if( $query->have_posts() ) et while( $query->have_posts() ) vous Il est possible d'insérer un balisage supplémentaire en dehors de la boucle, mais uniquement si votre requête a renvoyé des données. Enfin, vous pouvez utiliser if( $query->have_posts() )while( $query->have_posts() ) 分开,您可以在循环外部插入额外的标记,但前提是您的查询已返回数据。最后,通过指定替代参数并在每次循环后使用 wp_reset_postdata(),您可以多次使用 WP_Query plusieurs fois pour créer plusieurs boucles sur la page en spécifiant des paramètres alternatifs et en utilisant

après chaque boucle.

Cet article a été mis à jour avec une contribution de Nitish Kumar. Nitish est un développeur Web expérimenté dans la création de sites Web de commerce électronique sur diverses plateformes. Il consacre son temps libre à travailler sur des projets personnels pour faciliter son quotidien ou à se promener le soir avec des amis.

🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal