是否从循环和WordPress中的WP_Query()中排除粘滞帖子?

时间:2010-08-27 作者:Scott B

以下代码段来自一个侧栏小部件,其中列出了“最近的帖子”。由于它在主页上,而且我在该页面上突出显示了我的最新粘性帖子,所以我想跳过这个循环中的粘性帖子。然而post_not_in=sticky_posts 没有效果。

<?php
    $the_query = new WP_Query("showposts=$number&offset=1&order=ASC&post_not_in=sticky_posts");

    while ($the_query->have_posts()) : $the_query->the_post();
        $do_not_duplicate = $post->ID; ?>

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

我从WordPress\' Codex on query_posts() about Sticky Parameters 并创建了一个独立的示例,您可以将其作为test.php 进入您网站的根目录,并通过导航到如下URL来查看其运行情况,并替换您的域:

http://example.com/test.php

关于代码的一些注释;我必须使用an array equivalent of the query string 您已传递给WP_Query() 因为post__no_in 参数不能作为逗号分隔的字符串传入(不知道为什么,可能是疏忽?)。

我还想让你知道offset=1 (而不是offset=0) 意味着您将排除查询返回的第一篇帖子。当然,您仍然可以获得$number 假设你有那么多合适的职位+1。下面是代码:

<?php
header(\'Content-Type:text/plain\');
include "wp-load.php";

$number = 5;

$the_query = new WP_Query(array(
  \'showposts\' => $number,
  \'offset\' => 1,  // This will cause the query to skip over first post
  \'order\' => \'ASC\',
  \'post__not_in\' => get_option("sticky_posts"),
  ));
while ($the_query->have_posts()) : $the_query->the_post();
  the_title(); 
endwhile;

SO网友:Travis Northcutt

如果要从查询中排除所有粘性帖子,请使用

query_posts(array("post__not_in" =>get_option("sticky_posts")));

(来自the codex)

看起来这只适用于3.0或更高版本,不过:http://wordpress.org/support/topic/excluding-sticky-posts-using-query_posts

编辑:为了回应您下面的评论,请尝试以下内容(我不确定这是否可行,但希望它能帮助您开始):

<?php 
$args=array(
    \'showposts\'=>\'$number\',
    \'offset\'=>\'1\',
    \'order\'=>\'ASC\',
    \'post__not_in\'=>get_option("sticky_posts")
    );
$the_query = new WP_Query($args);

    while ($the_query->have_posts()) : $the_query->the_post();

        $do_not_duplicate = $post->ID; ?>

SO网友:crdunst

Travis\' answer 如果您正在构建自己的查询(可能是为了第二个循环),这很好,但是如果您需要修改主博客查询,您可以使用pre_get_posts 过滤掉粘帖。

在下面的示例中,如果查询是博客页面,我只排除粘性帖子,因为我仍然希望在分类法和搜索页面等上返回粘性帖子(我将粘性帖子显示为主新闻页面上的特色文章)。

add_action( \'pre_get_posts\', \'custom_post_archive_changes\' );
function custom_post_archive_changes( $query ) {
    if ( is_home() && $query->is_main_query() ) {

        // exclude sticky posts from main news page
        $stickies = get_option("sticky_posts");
        $query->set( \'post__not_in\', $stickies );

    }
}
只需将上面的代码片段放到函数中即可。php文件。

结束

相关推荐