只有最新的帖子才会出现在帖子页面上吗?

时间:2014-12-28 作者:Caleb Lewis

免责声明:这是我第一次尝试wordpress

我正在创建一个自定义主题single.php 文件,我有主循环,但是如果我导航到不同的帖子,显示的都是最新的帖子。我可以去不同的永久链接,但唯一出现的帖子是最新的。我怎样才能找到正确的帖子?

我尝试更改永久链接,删除和添加页面,但得到了相同的结果<这里是single.php

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

    <section class="main-section">
        <header>
            <h1 class="section-header"><?php the_category(\'/\');?></h1>
            <ul class="section-nav">
                <?php
                    $cat = get_the_category()[0];
                    $categoryPosts = get_posts(array(\'category\' => $cat->term_id));

                    foreach($categoryPosts as $post): setup_postdata($post);
                ?>

                    <li><a href="<?php the_permalink();?>"><?php the_title(); ?></a></li>

                <?php endforeach; ?>
                <?php wp_reset_postdata(); ?>
            </ul>
        </header>
        <h2 class="section-blurb"><?php the_title();?></h2>
        <div class="info">
            <?php the_content(); ?>
        </div>
    </section>

<?php endwhile;?>
一切正常。。但仅限于最新帖子。

Edit:<我重新安装了wordpress fresh并创建了新页面,但结果是一样的。我甚至把代码简化为

<?php the_title(); ?>

single.php 文件,但结果相同。无论你想看哪个帖子,它都只显示最新的帖子。

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

我认为你的结构是错误的。我将从循环中完全删除您的自定义查询,并将其移到外部。另一种选择是在自定义查询中使用其他变量名,并直接使用WP_Post 对象

正如@Milo已经解释的,您的自定义查询很可能会影响$post 全球的

选项1将自定义查询移到循环之外(注意:未测试)

<section class="main-section">

    <header>
        <h1 class="section-header"><?php the_category(\'/\', \'\', get_queried_object_id() );?></h1>
        <ul class="section-nav">

        <?php
            $cat = get_the_category( get_queried_object_id() )[0];
            $categoryPosts = get_posts( array( \'category\' => $cat->term_id ) );

            foreach($categoryPosts as $post): setup_postdata($post);
        ?>

               <li><a href="<?php the_permalink();?>"><?php the_title(); ?></a></li>

               <?php unset( $post ); ?>

         <?php endforeach; ?>

       </ul>
    </header>
然后正常运行循环。the_post() 在循环中,将重置$post 全局到主查询

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

        <h2 class="section-blurb"><?php the_title();?></h2>
        <div class="info">
            <?php the_content(); ?>
        </div>
    </section>

<?php endwhile;?>
选项2使用不同的变量名(注意:未测试)

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

    <section class="main-section">
        <header>
            <h1 class="section-header"><?php the_category(\'/\');?></h1>
            <ul class="section-nav">
                <?php
                    $cat = get_the_category()[0];
                    $categoryPosts = get_posts(array(\'category\' => $cat->term_id));

                    foreach($categoryPosts as $categoryPost):

                       $title = apply_filters( \'the_title\', $categoryPost->post_title ); ?>
                        <li>
                             <a href="<?php the_permalink();?>">
                                  <?php echo $title; ?>
                             </a>
                        </li>

                <?php endforeach; ?>
                <?php unset( $categoryPost ); ?>
            </ul>
        </header>
        <h2 class="section-blurb"><?php the_title();?></h2>
        <div class="info">
            <?php the_content(); ?>
        </div>
    </section>

<?php endwhile;?>

SO网友:Milo

当你打电话的时候setup_postdata($post);, 填充全局$post 在您的$categoryPosts 结果集。

foreach 终止并尝试输出带有模板标记的常规post数据:

<h2 class="section-blurb"><?php the_title();?></h2>
<div class="info">
    <?php the_content(); ?>
</div>
这些模板标记从$post, 其中仍然包含您的$categoryPosts.

要解决此问题,需要重置$post 到运行辅助查询之前的状态wp_reset_postdata:

foreach($categoryPosts as $post): setup_postdata($post);
    // output post
endforeach;

wp_reset_postdata();

// now you can return to outputting the post in the main loop
the_title();

结束

相关推荐

Custom permalinks structure

我希望有这样的结构:www.mysite.com/2013 (必须显示2013年的所有职位)www.mysite.com/my-category/2013 (必须显示2013年和“我的类别”类别的所有帖子)www.mysite.com/my-category/my-tag/ (必须显示所有类别为“我的类别”和标记为“我的标记”的帖子)www.mysite.com/my-category/ (必须显示“我的类别”类别的所有帖子)www.mysite.com/my-