查询:冲抵岗位列表,除非是具体类别

时间:2014-08-26 作者:tristanojbacon

这是我的代码:

<?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-我希望第二个查询排除第一个查询的任何结果

2 个回复
最合适的回答,由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

编辑:事实证明这并不完全正确。出于某种原因,页面上每篇文章的节选都使用了最近一篇文章的节选(不管它是否粘滞)。任何关于如何纠正的建议都会很好!

结束