使用IS_MAIN_QUERY选择特定页面上的自定义帖子类型

时间:2013-01-30 作者:patrickzdb

我一直在尝试实施安德鲁·纳辛讨论的一些想法http://wordpress.tv/2012/06/15/andrew-nacin-wp_query/ 在我的工作流中,特别是尝试不再使用query\\u帖子或新的WP\\u查询,而是更改主查询。到目前为止,我已经在我的主页上使用以下代码很好地实现了这一点:

function some_name($query) {
    if ( $query->is_main_query() && $query->is_home() ) {
        $query->set( \'post_type\', array( \'home_portfolio\' ) );
    }
}
add_action( \'pre_get_posts\', \'some_name\');
这只是将默认查询的post\\u类型更改为home\\u公文包。我不得不使用默认索引。php文件,而不是选择要用作首页的页面,以使其正常工作。

我也希望在某些页面上使用此方法,但我不确定如何从函数中定位页面。php。如果我使用$query->is_page(ID) 每当我尝试更改post\\u类型时,页面上的标准循环都会返回404。

换句话说,在我看来,我应该能够$query->is_home() 具有$query->is_page(ID) 在里面functions.php 我应该能够针对特定的页面ID,但我无法让它工作。

任何帮助都将不胜感激。否则,我的主页效率很高,但所有其他页面仍在运行多个查询(与修改这些页面上的主查询相比)。

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

这个is_home() 当当前显示的页面为blog posts index. 如果您想针对site front page 相反,您需要使用is_front_page():

function wpse83754_filter_pre_get_posts( $query ) {
    if ( $query->is_main_query() && is_front_page() ) {
        $query->set( \'post_type\', array( \'home_portfolio\' ) );
    }
}
add_action( \'pre_get_posts\', \'wpse83754_filter_pre_get_posts\' );
此外,您不必附加$query-> 至呼叫至is_home(), is_front_page(), 等等。您确实需要这样做is_main_query(), 因为您希望确保要筛选的查询特别是主查询,因为任何给定页面都将有多个查询。

因此,如果您想针对特定页面,只需调用is_page( $id ):

function wpse83754_filter_pre_get_posts( $query ) {
    if ( $query->is_main_query() && is_page( $id ) ) {
        $query->set( \'post_type\', array( \'home_portfolio\' ) );
    }
}
add_action( \'pre_get_posts\', \'wpse83754_filter_pre_get_posts\' );

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post