使用PRE_GET_POST中的GET_POST_META()更改主查询

时间:2016-05-20 作者:matjaeck

我需要一种可靠的方法来获取循环外部的post ID以供使用get_post_meta()pre_get_posts

到目前为止我发现

  • get_queried_object_id() 适用于除frontpage或blogpage之外的所有页面get_option( \'page_on_front\' ) 提供frontpage IDget_option( \'page_for_posts\' ) 提供博客页面IDglobal $post; echo $post->ID; 似乎不适合pre_get_posts (不知道为什么)
我尝试使用不同的函数有条件地检查ID:

function show_id ( $wp_query ) {

if ( is_front_page() && is_home() ) {
    // Default homepage
    $id = get_option( \'page_on_front\' );
} elseif ( is_front_page() ) {
    // static homepage
    $id = get_option( \'page_on_front\' );
} elseif ( is_home() ) {
    // blog page
    $id = get_option( \'page_for_posts\' );
} else {
    //everything else
    $id = get_queried_object_id();  
}
// Debug
echo $id;
}
add_action ( \'pre_get_posts\', \'show_id\' );
它适用于博客页面和其他页面,但不适用于静态frontpage。我收到以下错误通知:

注意:正在尝试获取。。。\\wp包括\\查询。php在线4520

注意:正在尝试获取。。。\\wp包括\\查询。php在线4522

注意:正在尝试获取。。。\\wp包括\\查询。php在线4524

你能帮忙吗?

Edit:

我想做的是打电话get_post_meta()pre_get_posts 它将返回一个post ID数组。然后我想修改主查询,如下所示$query->set (\'post__in\', array($myIDs)); 根据查询帖子元数据中的ID获取帖子。

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

根据wordpress codexpre_get_posts() 不适用于任何地方。

is_font_page() 不起作用,但is_home() 将所以你的情况is_front_page() && is_home() 每次都会失败。但是,“is\\u home()”应该单独起作用。

让别人知道你到底想做什么可能会有帮助。通常,pre\\u get\\u posts用于更改查询,但来自您共享的代码片段。我能告诉你的是,你想为一个有帖子列表的页面获取一个帖子id?

还有一件事。我在我正在处理的一个主题中加载了你的函数,该函数在不同的地方激发了大约5次,在这些地方会产生新的查询,如导航菜单和侧边栏。因此,您还需要了解您所处的查询。您可能应该使用它来确保您位于主查询中。

if ( $wp_query->is_main_query() ) {
    //check if home or else where here
}
我看到你在你的问题的评论中添加了更多的信息,我现在无法评论,因为我的声誉太低了。

如果我是你,我会以不同的方式定位主页。可能是一个自定义模板文件,然后使用query_posts($args) 并构建自己的循环。

Added Working Function Accepted in Chat:

function show_id ( $wp_query ) {
// lets make sure we are in the main query
if ( $wp_query->is_main_query() ) {
    if (  is_home() ) {
        // Default homepage or blog Archive
        $id = $id = get_option( \'page_for_posts\' );;
    } elseif ( !is_single() && !empty($wp_query->query_vars[\'page_id\'])) {
        // static homepage aka front page
        $id = $wp_query->query_vars[\'page_id\'];
    } else {
        //everything else
        $id = get_queried_object_id();  
    }
}
// Debug
echo \'<pre>\';
var_dump($id);
//var_dump($wp_query->query_vars[\'page_id\']);
//var_dump($wp_query);
echo \'</pre>\';
}
add_action ( \'pre_get_posts\', \'show_id\' );

相关推荐