你可能会感到惊讶,但这并不奇怪。
首先,让我们澄清一下,在WordPress中,当您访问前端URL时,您会触发一个查询。总是
这个查询只是一个标准WP_Query
, 就像通过以下方式运行的:
$query = new WP_Query( $args );
只有一个区别:
$args
WordPress使用
WP::parse_request()
方法该方法所做的只是查看URL和重写规则,并将URL转换为参数数组。
但是,如果由于URL无效,该方法无法做到这一点,会发生什么情况?查询参数就是这样一个数组:
array( \'error\' => \'404\' );
(来源
here 和
here).
因此该数组被传递给WP_Query
.
现在尝试执行以下操作:
$query = new WP_Query( array( \'error\' => \'404\' ) );
var_dump( $query->request );
您是否对查询正好是OP中的查询感到惊讶?我不是。
所以
parse_request()
使用传递给的错误键构建数组WP_Query
, 就这样运行了handle_404()
运行after 查询将查看\'error\'
参数和集合is_404()
要实现这一点,have_post()
和is_404()
不相关。问题是WP_Query
没有系统在出现问题时短路查询,因此一旦构建对象,向其传递一些参数,查询将运行。。。Edit:
有两种方法可以克服此问题:创建404.php
样板WordPress会将其加载到404个URL上,您无需在那里进行检查have_posts()
力$wp_query
在404上为空,类似于:
add_action( \'wp\', function() {
global $wp_query;
if ( $wp_query->is_404() ) {
$wp_query->init();
$wp_query->is_404 = true; // init() reset 404 too
}
} );