我正在修改WP\\u主查询,以使用pre_get_posts
, 像这样:
add_action( \'pre_get_posts\', \'public_loop\' );
public function public_loop( $query ) {
if ( ! is_admin() && $query->is_main_query() ) {
$query->set( \'meta_key\', \'deadline\' );
}
}
然后我通过AJAX加载旧帖子,所以我需要创建一个新的查询,我希望它与我修改的主查询具有相同的参数。按预期将参数作为参数传递:
function load_new_posts() {
$q = new WP_Query( array( \'meta_key\' => \'deadline\' ) );
if ( $q->have_posts() ) :
while ( $q->have_posts() ) : $q->the_post();
get_template_part( \'views/post/content\', get_post_format() );
endwhile;
endif;
}
但使用
set
方法不:
function load_new_posts() {
$q = new WP_Query();
$q->set( \'meta_key\', \'deadline\' );
if ( $q->have_posts() ) :
while ( $q->have_posts() ) : $q->the_post();
get_template_part( \'views/post/content\', get_post_format() );
endwhile;
endif;
}
在第二种情况下,AJAX调用表示“此请求没有可用的响应数据”。然而,如果我
var_dump( $q )
查询看起来正确。
我宁愿使用set
这样我就可以创建一个可重用的函数(因为我在pre_get_posts
在AJAX调用中)。
最合适的回答,由SO网友:jaswrks 整理而成
在最后一个示例(不适用于您的示例)中,您正在实例化WP_Query
类,而不传入查询变量数组。这很好,但在内部,这意味着查询从未真正发生过。你在打电话$q->set( ... )
, 但这只是设置一个查询变量,它不会运行查询和检索结果。
要实际运行查询并填充结果,请执行以下两项操作之一:
将查询变量传递给类构造函数。
$q = new WP_Query( array( \'meta_key\' => \'deadline\' ) );
或者,在实例化后运行查询。
$q = new WP_Query();
$q->query( array( \'meta_key\' => \'deadline\' ) );
什么会
not 工作,这是:
$q = new WP_Query();
$q->set( \'meta_key\', \'deadline\' );
$q->query( array() );
它不起作用,因为
query()
方法
sets and overrides 任何现有查询变量。因此,您不能使用
set()
在这种特殊情况下。记住,原因
set()
从第一个示例中的过滤器可以很好地工作,这是因为过滤器事件发生在
WP_Query
内部分类。但当您使用
WP_Query
如果您自己初始化,则必须显式传入一组查询变量,以建立需要运行的查询。