你可能会感到惊讶,但这并不奇怪。
首先,让我们澄清一下,在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
}
} );