从搜索结果中排除某些帖子类型有哪些不同的选项?

时间:2015-04-28 作者:codecowboy

我知道设置exclude_from_search => \'true\' 注册自定义帖子类型时。但还有什么其他选择呢?

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

您可以使用pre_get_posts 钩但请注意,这个钩子会过滤前端和管理员上的查询。例如,我们可以这样做:

function search_post_types( $query ) {
    if( is_admin() ) {
        return $query;
    }

    if ( $query->is_search && $query->is_main_query() ) {
        $query->set( \'post_type\', array( \'post\', \'page\' ) );
    }
}
add_action( \'pre_get_posts\', \'search_post_types\' );
我不确定是否有办法使用pre_get_posts 但更多的是只包括特定的帖子类型,在上面的例子中,我只包括帖子和页面,没有其他内容。

另一种方法是获取所有帖子类型,并创建一个我们实际上想要排除的帖子类型数组。首先,我们使用函数get_post_types() 哪一个does 有一些参数可以排除内置的post类型,但对于这个示例,我们将获得所有内容。获得帖子类型后,我们可以创建一个排除数组array_diff(), 下面是它的样子:

function search_post_types( $query ) {
    if( is_admin() ) {
        return $query;
    }

    if ( $query->is_search && $query->is_main_query() ) {
        $post_types = get_post_types( array(), \'names\' );                   // With no arguments, this should never be empty
        if( ! empty( $post_types ) ) {                                      // But let\'s check just to be safe!
            $pt_exclude = array( \'attachment\', \'revision\', \'nav_menu_item\' );
            $pt_include = array_diff( $post_types, $pt_exclude );

            $query->set( \'post_type\', $pt_include );
        }
    }
}
add_action( \'pre_get_posts\', \'search_post_types\' );

SO网友:codecowboy

一个选项是使用pre\\u get\\u posts挂钩并检查查询是否为搜索查询:

function my_theme_pre_get_posts( WP_Query $query ) {
    if ( $query->is_search ) {
        ...
    }

    return $query;
}

add_filter( \'pre_get_posts\', \'my_theme_pre_get_posts\' );

结束

相关推荐

Search engine not working

如何在搜索引擎的登录页中显示带有标题和摘要描述的结果,并将其作为分页?如果用户键入单词“loan”,则会显示所有包含loan单词的页面,并且在摘要描述下方会有一个“Read more”链接或按钮?我在这里看到了一些关于这个问题的帖子/答案,但我忘记了链接。