web-dev-qa-db-ja.com

ループ内でループ?

私は自分のページで2つのカスタムwp_queryループを使用しています。最初のものは特定のカテゴリからニュースを取得し、それからパーマリンクでそこから小さな抜粋を表示します。

2つ目は、いくつかの高度なカスタムフィールドを持つカスタム投稿タイプを取得するもう1つのwp_queryです。

問題は、私は2番目のループの中に、ニュースセクションからサムネイル付きで3つの投稿を受け取る別のループが欲しいということです(基本的に最初のループの反対、それは他のすべてのカテゴリを取得します)。ループ上の無数の記事を読んだ後、2番目のループ内でどのように「入れ子になった」ループを作成するのかわからない。私はそれが簡単であることを持っていると確信していて、するのが簡単である何かのように思えます。

これは私のコードでたくさんのHTMLが取り除かれたものです。

<?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(); ?>

The_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

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;

要求された説明

the_title();などのテンプレートタグを呼び出すと、ループ内の現在の投稿に関する情報が表示されます。しかし、どの投稿がどの投稿が現在の投稿であるかをどうやって知るのでしょうか。これは、グローバルポストデータ(グローバル変数$postに格納されている)から情報を読み取ることによって行われます。

ループを使用するときは、常に最初のステートメントとして$query->the_post()を使用します。この関数がすることは、そのグローバルデータをWP_Queryオブジェクトから次の投稿に設定することです(前の内容は失われます)

ここで内側のループを呼び出したとき、内側のループが機能し始めたときに外側のループに関連するpostdataが失われていました。それで、内側のループの終わりの後にあなたが使うどんな関数でも、内側のループのデータだけを見つけています。

このソリューションでは、内容が失われる前に、まず外側のループのデータを別の変数に保存しました。そうすると、ループは想定どおりに機能します(すべての外側のループデータを削除します)。

次に、内側のループの作業が完了したら、外側のループのデータを使用する必要がありますが、内側のループのためにデータが失われています。これは、以前に保存したデータを取得してそれを置き換える場所です。内側のループを始めたときの位置に戻りました

12
Mridul Aggarwal

これには 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