web-dev-qa-db-fra.com

Boucle dans une boucle?

J'utilise quelques boucles wp_query personnalisées sur ma page, la première récupère les actualités d'une certaine catégorie, puis en affiche un petit extrait avec le permalien.

Le second est un autre wp_query qui obtient un type de publication personnalisé avec quelques champs personnalisés avancés.

Le problème est que je voudrais une autre boucle dans la seconde qui reçoit 3 messages de la section actualités avec une vignette (fondamentalement l'opposé de la première boucle, toutes les autres catégories seront récupérées). Après avoir lu d'innombrables articles dans la boucle, je ne vois pas comment créer une boucle "imbriquée" dans ma deuxième boucle. Je suis sûr que cela doit être simple, cela semble être quelque chose de facile à faire.

Voici mon code avec beaucoup de HTML vidé.

<?php 


/*
    Template Name: Homepage
*/

?>

<?php get_header(); ?>


    <div class="thenews">
        <div class="newsinner">


            <div class="grid-1">
                <h6 class="nsix">latest news</h6>
            </div> <!-- end div grid-1 -->




            <div class="grid-2">

            <?php
                        $recentPosts = new WP_Query();
                        $recentPosts->query('cat=5&showposts=1');
                    ?>
            <?php while ($recentPosts->have_posts()) : $recentPosts->the_post(); ?>

            <p><?php echo ''.get_the_Twitter_excerpt(); ?>...</p>

                </div> <!-- end div grid-2 -->   

                <div class="grid-3">

                <a href="<?php the_permalink() ?>">Read it</a>


                <?php endwhile; wp_reset_query(); ?>
                </div> <!-- end div grid-3 -->

        </div> <!-- end div newsinner -->
    </div> <!-- end div thenews -->

<div id="main-content">
    <div class="typograhpy">



            <div class="home-grid-1">
                <div class="home-grid-1-inner">
                     <?php
$portfolio_query = new WP_Query(array(
        'post_type' => 'headerhome',
        'showposts' => 1
        ) );
?>


      <?php while ($portfolio_query->have_posts()) : $portfolio_query->the_post(); ?>
                <h2><?php the_title(); ?></h2>  
                    <?php the_content(); ?>


                        <div class="anyres">


                             <p> <?php the_field('anyresolution'); ?></p>

                        </div> <!-- end div anyres -->


                </div> <!-- end home-gird-1-inner -->
            </div> <!-- end home-grid-1 -->

            <div class="home-grid-2">


                <div class="inner-home-1">
                    <div class="inside-home-1-1">




                         <h2><?php the_field('services_'); ?></h2>
                         <p> <?php the_field('services_text'); ?></p>





                    </div> <!-- end div inside-home-1-1 -->


                    <div class="inside-home-1-2">

                    <p> <?php the_field('services_text_right'); ?></p>




                    </div> <!-- end div inside-home-1-2 -->
                </div> <!-- end div inner-home-1 -->
                <div class="margindiv"></div>

                <div class="inner-home-2">

                <div class="brushpic"></div> <!-- end div brushpic -->




                         <h3><?php the_field('services_1_header') ?></h3>       
                         <p><?php the_field('services_1_content'); ?></p>



                </div><!-- end div inner-home-2 -->

                <div class="inner-home-3">

                    <div class="cloudpic"></div> <!-- end div cloudpic -->

                     <h3><?php the_field('services_2_header') ?></h3>       
                         <p><?php the_field('services_2_content'); ?></p>



                </div> <!-- end div inner-home-3 -->

                <div class="inner-home-4">
                    <div class="onetwoone"></div> <!-- end div onetwoone -->

                        <h3><?php the_field('services_3_header') ?></h3>       
                         <p><?php the_field('services_3_content'); ?></p>




                </div> <!-- end div inner-home-4 -->


            </div> <!-- end div home-grid-2 -->


            <div style="clear:both"></div>









    </div> <!-- end div typograhpy -->

        <div class="graphgrid">





        </div> <!-- end div graphgrid -->

    <div class="sizesdes">




     <blockquote><?php the_field('gallery_blockquote_') ?></blockquote>     
    <p><?php the_field('gallery_content'); ?></p>

    <?php endwhile; wp_reset_query(); ?>






</div> <!-- end div main-content -->











<?php get_footer(); ?>

Code de travail, bien qu'il ne récupère pas la_post_thumbnail

<?php
                            global $post;$backup=$post;
                            $inner_query = new WP_Query();
                            $inner_query->query('showposts=3');
                        ?>

                        <?php while ($inner_query->have_posts()) : $inner_query->the_post(); $post=$backup; ?>




                        <?php the_post_thumbnail(); ?>

                    <p><?php echo ''.get_the_custom_excerpt(); ?>...</p>

                    <a href="<?php the_permalink() ?>">Read it</a>



                    <?php endwhile; ?>
6
andy

Vous pouvez créer autant de boucles que vous le souhaitez en créant plusieurs objets WP_Query.

$query = new WP_Query($args);

while ($query->have_posts()) :

    // initialization for $inner_args & backup the current global $post
    $inner_query = new WP_Query($inner_args);

    while ($inner_query->have_posts()) :
        // do something
    endwhile;
    // restore the global $post from the previously created backup

endwhile;

EXPLICATION À LA DEMANDE

Chaque fois que vous appelez une balise de modèle telle que the_title();, elle affiche des informations sur la publication en cours dans la boucle. Mais comment sait-il quelle publication est la publication actuelle? Cela se fait en lisant les informations des postdata globales (stockées dans une variable globale $post)

Lorsque vous utilisez une boucle, vous utilisez toujours une $query->the_post() comme première instruction. Cette fonction définit les données globales de la publication suivante à partir de l'objet WP_Query (le contenu précédent est perdu).

Ici, lorsque vous avez appelé la boucle interne, les données postérieures liées à la boucle externe ont été perdues lorsque la boucle interne a commencé à fonctionner. Alors, quelle que soit la fonction que vous utilisez après la fin de la boucle interne, vous ne trouvez toujours que les données de la boucle interne.

Dans la solution, vous avez d'abord enregistré les données de la boucle externe dans une autre variable avant que le contenu ne soit perdu. Ensuite, la boucle fonctionne comme elle est supposée (supprimer toutes les données de la boucle externe).

Ensuite, lorsque le travail de la boucle interne est terminé, vous devez maintenant utiliser les données de la boucle externe, mais ces données sont perdues en raison de la boucle interne. C'est là que vous prenez les données précédemment sauvegardées et les remplacez. Maintenant, vous êtes de retour à la position que vous aviez quand vous avez commencé la boucle intérieure

12
Mridul Aggarwal

Vous pouvez aussi utiliser WP_Query :: reset_postdata () .

$query = new WP_Query($args);

while ($query->have_posts()) :

    // initialization for $inner_args & backup the current global $post
    $inner_query = new WP_Query($inner_args);

    while ($inner_query->have_posts()) :
        // do something
    endwhile;

    // restore the global $post from the previously created backup
    $query->reset_postdata();

endwhile;
6
Dan Smart