为什么这段代码会导致无限循环?

时间:2011-07-05 作者:chchrist

大家好,我有这个模板页面,它获取页面的帖子,然后是来自分类新闻的帖子列表。

<?php
/*
 * Template Name: News & Info
 */

get_header();
?>


<div id="cLeft">
    <?php
    if (function_exists(\'yoast_breadcrumb\')) {
        yoast_breadcrumb(\'<p id="breadcrumb">\', \'</p>\');
    }
    ?>

    <?php if (have_posts()) : while (have_posts()) : the_post(); ?> 

            <div id="title">
                <h1><?php the_title(); ?></h1>
            </div>
            <div id="freetext">
                <?php the_content(); ?>
            </div>

        <?php endwhile;
    endif; ?>

    <?php if (have_posts()) : while (have_posts()) : the_post(); ?> 
            <?php query_posts(\'cat=32\'); ?>

            <div class="post">
                <h2><a href=""></a></h2>
                <div class="postDescr"></div>
            </div>
        <?php endwhile;
    endif; ?>

</div>

<div id="cRight">
    <h2>News &amp; Info:</h2>

    <ul id="submenu">
        <?php wp_list_pages(\'hide_empty=0&child_of=26&title_li=&sort_column=menu_order\'); ?> 
    </ul>
</div>

<?php get_footer(); ?>
第二个循环进入无限循环,我不知道我做错了什么。

提前感谢

2 个回复
最合适的回答,由SO网友:Rarst 整理而成

正确地指出了问题所在,但我还想解释一下,以便您更好地了解力学:

当您使用query_posts() 它写下生成的WP_Query 对象到全局$wp_query 变量

  • have_posts()the_post() 函数是使用全局函数调用的同名方法的包装器$wp_query 对象

    所以您在代码中所做的就是不断覆盖$wp_query 并不断询问是否有帖子需要处理。而且总是有帖子,因为一旦处理帖子,查询就会返回到新的干净状态。

    参见When should you use WP_Query vs query_posts() vs get_posts()?

  • SO网友:zac

    我同意一个诡计。。如果你试试这个怎么办?

        <?php if (have_posts()) : while (have_posts()) : the_post(); ?> 
                <div id="title">
                    <h1><?php the_title(); ?></h1>
                </div>
                <div id="freetext">
                    <?php the_content(); ?>
                </div>
            <?php endwhile;
        endif; ?>
    
        <?php $the_query = new WP_Query(\'cat=32\'); //or category_name=
        while ($the_query->have_posts()) : $the_query->the_post();?>
                <div class="post">
                </div>
            <?php endwhile;
            wp_reset_query(); ?>
    

    结束

    相关推荐