最合适的回答,由SO网友:Aaron D. Campbell 整理而成
为了澄清之前答案中的一些困惑,pre\\u get\\u posts不是一个过滤器,因此您不需要返回任何内容。
我看到的唯一问题是如果:
if ( !is_search() && !in_array( get_post_type(), $post_types ) )
return;
基本上,get\\u post\\u type()在pre\\u get\\u post期间将返回false,因为全局$post尚未设置(通常在启动循环后设置)。
我不能完全确定您何时需要所有公共帖子类型,何时不需要。如果您只想将所有搜索设置为包括所有公共帖子类型,那么您只需要检查is\\u search()。您可能还希望确保所修改的查询是主查询,而不是插件或主题文件正在创建的自定义查询。代码应如下所示:
function range_search_all_public_post_types( $q ) {
if ( is_search() && is_main_query() )
$q->set( \'post_type\', get_post_types( array( \'public\' => true ) ) );
}
add_action( \'pre_get_posts\', \'range_search_all_public_post_types\' );
就是这样。这将导致查询所有公共帖子类型以进行搜索。
如果要在主页上搜索所有公共帖子类型,请使用以下选项:
function range_search_all_public_post_types( $q ) {
if ( ( is_search() || is_home() ) && is_main_query() )
$q->set( \'post_type\', get_post_types( array( \'public\' => true ) ) );
}
add_action( \'pre_get_posts\', \'range_search_all_public_post_types\' );
UPDATE:
您遇到的问题是public\\u queryable设置为false的post\\u类型所特有的。您基本上希望所有公共类型都能工作,即使它们不可公开查询。为此,请使用以下代码:
function range_search_all_public_post_types( $q ) {
if ( is_search() && is_main_query() && \'\' == $q->get( \'post_type\' ) && ! empty( $_GET[\'post_type\'] ) && post_type_exists( $_GET[\'post_type\'] ) && get_post_type_object( $_GET[\'post_type\'] )->public )
$q->set( \'post_type\', $_GET[\'post_type\'] );
}
add_action( \'pre_get_posts\', \'range_search_all_public_post_types\' );
基本上,如果一个post\\u类型在URL中,但不在QP\\u查询中,那可能是因为它不可公开\\u查询,如果是这样,我们会修复它。检查内容如下:
这是搜索页面吗这是主查询吗查询中是否没有指定post\\u类型是否在URL中指定了post\\u类型
指定的URL post\\u类型是否存在指定的URL post\\u类型是公共的吗如果所有这些都是真的,它会将post\\u类型设置为URL中的类型。