很多时候,我们为了自定义自己的wordpress网站会新建很多页面,以承载主题或插件提供的个性化功能,比如百度站内搜索、热门标签页面等等。但为了更好的浏览体验,这些页面我们并不需要在搜索结果内展示。其实我们可以通过一个简单的pre_get_posts来过滤文章的搜索结果,排除某些不需要的日志类型或类别。。

事实上pre_get_posts的功能非常强大,可以通过修改$query来过滤所有日志的展示结果,过滤搜索结果只是一个简单的应用罢了。

代码1:屏蔽所有post_type为page的搜索结果


add_action('pre_get_posts','filterMyQuery');
function filterMyQuery ($query){
    if(is_search()){
        $postTypes = get_post_types(array('public'=>true)); //获取所有日志类型
        $exclude = array('page'); //排除的日志类型
        $include = array_diff($postTypes,$exclude ); //array_diff得到需要查询的范围
        $query->query_vars['post_type'] = $include; //设定数据查询的范围
        //$query->set('post_type',$include); 与上一行等效
    }
}

代码2:屏蔽所有id为特定值的文章


add_action('pre_get_posts','filterMyQuery');
function filterMyQuery ($query){
    if(is_search()){
        $excludedId = array(2,3,4);
        $query->query_vars['post__not_in'] = $excludedId;
        //$query->set('post__not_in',$excludedId); 与上一行等效
    }
}

通过pre_get_posts能做的事情还有还多,通过修改上面示例代码的条件判断可以在不同的页面自定义日志查询结果。