正如您可能知道的那样,在加载/呈现页面时,WordPress会通过解析查询字符串并与regex模式列表进行匹配来尝试识别所请求的页面。例如,查询字符串/page/2/
将与头版的第#2页匹配page_on_front
设置为false
(即“单页或帖子列表”设置),并且有足够数量的帖子需要第二页。如果没有,WordPress将重定向到404页面并返回HTTP 404状态码。
所有这些都发生在WP_Query::parse_query()
. 特别注意线条1670 其中,如果运行查询时出错,则查询对象标记为404。
我猜在您的情况下,WordPress自动运行的初始查询与您自己运行的查询不匹配,即WordPress正在查找偏移量为第2页的帖子,而您打算加载与自定义搜索查询匹配的帖子。
我想说你最好的选择是1. making sure your custom query runs first 无论发生什么或2. preventing WordPress from returning 404 在这种特殊情况下。
1. Making sure your custom query runs first这可以通过在插件或主题中添加以下(未测试的)代码来实现functions.php
:
function my_default_query() {
// Conditions required for running your custom query
if (is_home() || is && isset($_GET[\'s\'])) {
query_posts(array(
// your custom query arguments here
));
}
}
add_action(\'init\', \'my_default_query\');
2. preventing WordPress from returning 404这可能通过对中计算的某些值使用过滤器来实现
WP_Query::parse_query()
但不幸的是,它们不太容易找到,可能“隐藏”在内部进行的函数调用后面
parse_query()
. 如果这需要做很多工作,或者不可能,您可以更改
$is_404
在全球范围内
WP_Query
对象
function my_override_404() {
// Conditions required for overriding 404
if (is_home() || is && isset($_GET[\'s\'])) {
global $wp_query;
$wp_query->is_404 = false;
}
}
add_action(\'init\', \'my_override_404\');
正如Tom J Nowell所写,
index.php
可能不是在这种情况下使用的合适模板,并且可能会单独解决您的问题。无论如何都要发布此答案,因为它可能对您/其他人的类似情况有所帮助。