插件修改时WP_Query
它不是“永久”修改的,而是正在修改的单个对象。
当您这样做时:
$the_query = new WP_Query( array( \'cat\' => $categoryid, \'post_type\' => \'page\' ) );
你可以同时获得页面和帖子,但是
not 因为查询已修改且未重置(实际上您正在使用另一个对象)。真正的原因是,过滤器再次为这个新对象运行,并对其进行修改。
发生这种情况是因为pre_get_posts
钩子用于所有查询,因此它也用于原始查询和您的查询。
如果修改查询的插件更明智一些,那么它已经检查了is_main_query()
在修改查询之前,这样,任何不是主查询的查询都不会受到影响。
例如,如果插件执行以下操作:
function category_and_tag_archives( $wp_query ) {
// Only act on main query
if ( ! $wp_query->is_main_query() ) {
return;
}
$my_post_array = array(\'post\',\'page\');
if ( $wp_query->get( \'category_name\' ) || $wp_query->get( \'cat\' ) )
$wp_query->set( \'post_type\', $my_post_array );
if ( $wp_query->get( \'tag\' ) )
$wp_query->set( \'post_type\', $my_post_array );
}
之后,您可以:
$the_query = new WP_Query( array( \'cat\' => $categoryid, \'post_type\' => \'page\' ) );
作为一个次要的查询,它不会受到影响,并且您只会得到预期的帖子。