当有匹配的帖子时,WP_Query有时会返回零结果 - 为什么?

时间:2015-07-21 19:00:56

标签: wordpress wp-query

这个让我难过。

我有一个包含此循环的category.php文件:

<?php
if ( have_posts() ) : ?>
    <?php
    while ( have_posts() ) : the_post(); ?>
        <div class="entry-content description clearfix">
            <h2 class="category-subtitle"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
            <?php echo the_content(); ?>
            <?php global $withcomments; $withcomments = 1;
    ?>
        </div><!-- .entry-content -->
    <?php
    endwhile;
else :
    get_template_part( 'content', 'none' );
endif;
?>

这段代码工作正常,总能返回人们期望的结果。

另外,在循环之外(在它之后,如果重要的话),我在这个循环的一侧有一个列 - 为了清楚起见,我将把它称为新闻源循环:

<h3 class="newsfeed-heading"><a href="/category/news/">Latest News</a></h3>
<?php
    // wp_reset_query(); * Same results with or without wp_reset_query
    $args = array(
    'cat' => 89,
    'order'   => 'ASC'
    );
    $custom_query = new WP_Query($args);
    //echo "<h2>Found: $custom_query->found_posts</h2>";
    while($custom_query->have_posts()) : $custom_query->the_post();
?>
    <div <?php post_class(); ?> id="post-<?php the_ID(); ?>">
        <h4 class="highlight1"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
        <p><?php $content = get_the_content(); echo mb_strimwidth($content, 0, 160, '...');?></p><div class="morelink"><a title="<?php the_title(); ?>" href="<?php the_permalink(); ?>">Read more</a></div>
    </div>
<?php endwhile; 
  // wp_reset_postdata();  * Same results with or without wp_reset_postdata
?>

现在,在大多数情况下,这两个循环可以很好地协同工作,并且两个循环都会返回我期望的结果集。但并非总是如此。

据我所知,我认为如果主类别循环只包含一个结果,那么新闻源循环总是正确的。但是如果主类别循环在结果集中有多个帖子,则新闻源循环经常正常工作。所以我无法发现一种模式。

我尝试将wp_reset_query();放在不同的地方,抓着吸管,但没有任何区别。

顺便说一句,当新闻源循环工作时,它总是返回正确的结果集。但是当它没有时,它总是不返回,$custom_query->found_posts返回零。

我非常感谢您在哪里寻找可能的解决方案。

5 个答案:

答案 0 :(得分:3)

您的自定义查询后缺少wp_reset_postdata();。只要您拨打the_post(),就会将$post全局设置为当前帖子的值。对于主查询和WP_Query的任何自定义实例都是如此。在get_posts中,当您致电setup_postdata()时会发生这种情况。

正如已经指出的那样,wp_reset_query()query_posts一起使用,您应该从不使用它,因为它会破坏主查询对象以及依赖于主查询对象的任何内容相关帖子,分页和页面功能。

如果以上操作不起作用,请查找任何posts_**过滤器或在您的主题或插件中写得不好的任何pre_get_posts实例。除了这些建议,您的代码应该可以使用。

答案 1 :(得分:2)

对于任何搜索,如果参数使用found_posts'no_found_rows' => true 将返回0

答案 2 :(得分:1)

解决!

我确信问题不在代码中,我应该早点解决这个问题。

问题是由一个名为ReOrder Post的Wordpress插件https://wordpress.org/plugins/reorder-post-within-categories/

引起的

此插件允许您通过仪表板中的拖放界面手动重新排序所选类别。

这解释了为什么自定义查询大部分时间都在工作 - 80个以上的类别中只有大约10个被手动重新排序,当然这些是导致与我的WP_Query冲突的。

我无法开始攻击插件,因此解决方法是通过更改发布日期来禁用插件并重新排序帖子。

感谢那些试图为我回答这个问题的贡献者。

答案 3 :(得分:0)

如果有人来这里寻找答案,其他解决方案都不起作用。我能够在函数调用结束前添加wp_die();来完成这项工作。

答案 4 :(得分:0)

我遇到过类似的问题。最后按照推荐,删除

'no_found_rows' => true,

然而,它不起作用。 所以我重新排列了查询参数

'posts_per_page' => 10,

查询参数末尾的 post_per_page 结果为“0”found_posts。后来转移到查询args的顶部,查询结果为“100”found_post。