您可以使用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\' );