Loop within a loop?

时间:2012-11-06 作者:andy

我在我的页面上使用了几个自定义的wp\\u查询循环,第一个循环从某个类别检索新闻,然后用permalink显示其中的一个小摘录。

第二个是另一个wp\\u查询,它获取带有几个高级自定义字段的自定义帖子类型。

问题是,我想在第二个循环中使用另一个循环,从新闻部分获取3篇文章,并带有缩略图(基本上与第一个循环相反,它将获取所有其他类别)。在阅读了无数关于循环的文章后,我不知道如何在第二个循环中创建“嵌套”循环。我相信这必须很简单,看起来很容易做到。

下面是我的代码,其中去掉了很多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> 

</div><!-- end div main-content -->
<?php get_footer(); ?>
工作代码,但它不会检索\\u post\\u缩略图

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

3 个回复
最合适的回答,由SO网友:Mridul Aggarwal 整理而成

通过创建更多循环,可以根据需要创建任意数量的循环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();, 它显示循环中当前帖子的一些信息。但它如何知道哪个帖子是当前帖子?它是通过从全局postdata(存储在全局变量中)读取信息来完成的$post)

使用循环时,始终使用$query->the_post() 作为第一句话。此函数的作用是将全局数据从WP_Query 对象(以前的内容丢失)

在这里,当您调用内部循环时,当内部循环开始工作时,与外部循环相关的postdata丢失了。然后,在内部循环结束后使用的任何函数仍然只能查找内部循环的数据。

在解决方案中,在内容丢失之前,您首先将外部循环的数据保存在另一个变量中。然后循环按预期工作(删除所有外部循环数据)。

然后,当内循环的工作完成时,您现在需要使用外循环的数据,但由于内循环,数据丢失了。这是您获取以前保存的数据的位置;更换它。现在你回到了开始内环时的位置

SO网友:Dan Smart

您可以使用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;

SO网友:Akshay K Nair

添加global $post;$backup=$post; 在内部while&;之前;$post=$backup; 在内心的片刻之后。

(为什么Mridul Aggarwal没有在他的代码部分写出真实的东西?)

结束

相关推荐

How to do paging in the loop?

我用过single.php 对于此代码:<?php $categories = get_the_category($post->ID); if ($categories) { $category_ids = array(); foreach($categories as $individual_category) $category_ids[] = $individual_category->term_id; $args=array