WordPress的搜索结果如果不经过处理,默认情况下是会包含所有类型的文章,不管是page页面还是post文章都会显示,而我们有些时候就需要隐藏某些内容来达到默写目的,这里什么目的就不明说了。
如果想要实现上面的功能,除了自建查询函数之外,还有一种通用的做法如下:
1 2 3 4 5 6 |
add_action( 'pre_get_posts', 'my_search_exclude_filter' ); function my_search_exclude_filter( $query ) { if ( ! $query->is_admin && $query->is_search && $query->is_main_query() ) { $query->set( 'post__not_in', array( 3, 11, 234, 553 ) ); } } |
代码方面主要用到了pre_get_posts过滤器,而这个过滤器的作用就是在执行wp_query函数之前运行,同时站点之前的文章也介绍过相关函数,但是一笔带过,该过滤器具体描述如下:
Fires after the query variable object is created, but before the actual query is run.
如果你不能理解是什么意思,你可以理解为根据指定条件修改查询参数的相关设定,比如说常规查询的主函数显示文章数量是50个,但是你想要在搜索结果页面显示文章数量为20个,那么这样的情况下,不考虑自建查询函数,通过下面的代码可以显示该目的:
1 2 3 4 5 6 7 8 |
function hwl_home_pagesize( $query ) { if ( ! is_admin() && $query->is_main_query() && $query->is_search ) { // Display 50 posts for a custom post type called 'movie' $query->set( 'posts_per_page', 20 ); return; } } add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 ); |
通过上面的两个例子,如果你了解wp_query主循环的话,那么可以通过这个函数直接写出千奇百怪的情况来实现不同目的,本文标题中还说到了排除页面,言外职业就是仅仅获取文章类型即可(不考虑附件、草稿等情况):
1 2 3 4 5 6 7 8 |
function search_filter($query) { if ( ! is_admin() && $query->is_main_query() ) { if ( $query->is_search ) { $query->set( 'post_type', 'post' ); } } } add_action( 'pre_get_posts', 'search_filter' ); |
总而言之好好利用这个函数,可以让你的页面千变万化,通过switch丰富展示情况,至于如何展示就看大家的能力了。