使用POSTS__NOT_IN时,PRE_GET_POSTS返回非属性对象

时间:2014-03-05 作者:certainstrings

我正在显示某个类别中的帖子,并希望使用posts\\uu not\\u in显示除第一个之外的所有帖子。下面的代码返回非对象错误的属性。

function modify_onthisday_cat( $query ) {

    if ($query->is_category(7) && $query->is_main_query() ) {

        global $post, $wp_query;

        set_query_var( \'day\', date(\'d\') );
        set_query_var( \'post__not_in\', array($post->ID) );

        return;
    }
}
add_action( \'pre_get_posts\', \'modify_onthisday_cat\');
如果我用一个特定的post ID替换$post->ID,它会工作,但我需要它是动态的。据我所知,此操作是在查询之前运行的,因此动态获取id需要更多的工作。我只是不知道怎么去那里。

编辑(澄清):

目前,我有一个与该类别一起提供的类别页面。php模板。我有一篇特色文章显示在上面,其余的文章显示在下面。特色帖子从自定义函数调用,其余帖子从默认wordpress循环调用。

我的目标是显示下面的帖子,而不显示第一篇帖子并保留分页。

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

您正在使用pre_get_posts 不正确。

你不应该return您应该操作传递到过滤器中的查询对象,而不是修改全局变量

function modify_onthisday_cat( $query ) {
  if ($query->is_category(7) && $query->is_main_query() ) {
    global $post; // not going to be set yet
    $query->set( \'day\', date(\'d\') );
    $query->set( \'post__not_in\', array($post->ID) ); // and this will fail
  }
}
add_action( \'pre_get_posts\', \'modify_onthisday_cat\');
不过,正如评论中所指出的,这对主查询不起作用(您似乎打算这样做),因为$post 只有在主查询运行后才会填充,这是确定$post. 我想你必须更详细地解释你的目标。

至少对于单篇文章页面来说,下面这样的内容应该更有效。

function modify_onthisday_cat( $query ) {
  $post_id = get_query_var(\'p\');
  if ($query->is_category(7) && $query->is_main_query() && !empty($post_id)) {
    $query->set( \'day\', date(\'d\') );
    $query->set( \'post__not_in\', array($post_id) );
  }
}
add_action( \'pre_get_posts\', \'modify_onthisday_cat\');

结束

相关推荐