这是我的代码:
<?php query_posts(array (\'showposts\' => \'1\', \'cat\' => \'-11\'));
if (have_posts()) : while (have_posts()) : the_post();
get_template_part( \'content\', \'archives\' );
endwhile;
endif; ?>
<?php query_posts(array (\'showposts\' => \'3\', \'offset\' => \'1\'));
if (have_posts()) : while (have_posts()) : the_post();
get_template_part( \'content\', \'archives\' );
endwhile;
endif; ?>
第一个查询排除了一个类别(用户对博客的贡献),因此只有我们组织的最新博客文章是“粘滞的”。
第二个查询当前显示所有类别中最新的3篇文章,偏移量为1,以停止显示“粘滞”的文章,因为它已经是最新的。
但是,如果最新的帖子位于用户贡献类别中(我们有时会在当天晚些时候发布用户内容),它将被“偏移量”捕获而不显示,然后粘滞的帖子将出现在第二个查询的前面。
是否存在允许从规则中排除类别的“偏移”替代方案?
TL;DR-我希望第二个查询排除第一个查询的任何结果
最合适的回答,由SO网友:Pieter Goosen 整理而成
如前所述,您应该never (我的重点)使用query_posts
构造自定义查询。
Note: 此功能不适用于插件或主题。如后文所述,有更好、性能更好的选项来更改主查询。query\\u posts()是一种过于简单且有问题的方法,通过将页面的主查询替换为新的查询实例来修改它。它效率低下(重新运行SQL查询),并且在某些情况下会彻底失败(尤其是在处理POST分页时)。任何现代的WP代码都应该使用更可靠的方法,比如使用pre\\u get\\u posts钩子。
关于你的问题和答案,只需做两个旁注(顺便说一句,这比你的问题-)更好地使用代码)
showposts
已贬值,以支持posts_per_page
- NEVER 忘记重置任何自定义查询。正如您的回答中所述,由于您没有重置查询,因此预期会从代码中获得输出。如果未重置postdata,自定义查询会影响其后的任何查询。使用
wp_reset_postdata()
之后every 自定义查询这就是您的代码应该是什么样子
<?php $sticky = new WP_Query(array (\'posts_per_page\' => \'1\', \'cat\' => \'-11\'));
if ($sticky->have_posts()) :
$stickyid = array();
while ($sticky->have_posts()) : $sticky->the_post();
$stickyid[] = $post->ID;
get_template_part( \'content\', \'archives\' );
endwhile; endif;
wp_reset_postdata();
$latestposts = new WP_Query(array (\'posts_per_page\' => \'3\', \'post__not_in\' => $stickyid));
if ($latestposts->have_posts()) :
while ($latestposts->have_posts()) : $latestposts->the_post();
get_template_part( \'content\', \'archives\' );
endwhile; endif;
wp_reset_postdata(); ?>
SO网友:tristanojbacon
编辑:没有解决问题,请参见底部的注释。经过多次尝试和错误,我终于解决了问题。以下是最终代码(对问题代码的改编):
<?php $sticky = new WP_Query(array (\'showposts\' => \'1\', \'cat\' => \'-11\'));
if ($sticky->have_posts()) :
$stickyid = array();
while ($sticky->have_posts()) : $sticky->the_post();
$stickyid[] = $post->ID;
get_template_part( \'content\', \'archives\' );
endwhile; endif;
$latestposts = new WP_Query(array (\'showposts\' => \'3\', \'post__not_in\' => $stickyid));
if ($latestposts->have_posts()) :
while ($latestposts->have_posts()) : $latestposts->the_post();
get_template_part( \'content\', \'archives\' );
endwhile; endif; ?>
这可能不是最整洁的代码,但对我来说很有意义!:s
编辑:事实证明这并不完全正确。出于某种原因,页面上每篇文章的节选都使用了最近一篇文章的节选(不管它是否粘滞)。任何关于如何纠正的建议都会很好!