第2页上的WordPress触发器404用于定制搜索查询

时间:2013-01-28 作者:Stephan S.

我修改了索引。php来检查搜索查询是否是作者,如果是,则显示该作者的文章。这很好,但只要你转到结果的第2页,wordpress就会触发404错误。所以我猜Wordpress没有调用索引。php开启http://www.test.com/page/2/?s=my+search+query 我还需要把我得到的代码放在我的索引中。php在其他地方,但在哪里?

编辑:自定义查询的我的代码

$author_res = $wpdb->query("SELECT ID FROM $wpdb->users WHERE display_name LIKE \'%".get_search_query()."%\' LIMIT 1");
    if($author_res > 0) {
        $author_info = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE display_name LIKE \'%".get_search_query()."%\' LIMIT 1");
        $article_query = new WP_Query(\'posts_per_page=7&paged=\' . $paged.\'&author=\'.$author_info->ID.\'&offset=\'. $offset);
        if($article_query->have_posts()){
...
$paged和$offset在站点范围内进行计算,但效果很好。我想问题出在其他地方,我想调试一下,但我不知道wordpress在哪里决定是否触发404,也不知道在/page/2上触发了哪个php文件,因为它似乎不是索引。php

2 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

index.php 是默认模板,即回退。

如果我们看这里:

http://codex.wordpress.org/Template_Hierarchy

在图表中:

enter image description here

我们可以在这里看到搜索。php是合适的模板。

您是否考虑过使用author。php和作者归档,而不是修改搜索模板?有更好的方法来实现您想要的,甚至是通过作者姓名进行搜索,而不是为您的补丁获取补丁。也许有一个新问题题为“如何通过作者姓名搜索帖子”

SO网友:Simon

正如您可能知道的那样,在加载/呈现页面时,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 可能不是在这种情况下使用的合适模板,并且可能会单独解决您的问题。无论如何都要发布此答案,因为它可能对您/其他人的类似情况有所帮助。

结束

相关推荐

Search result by range?

我必须搜索标签或自定义字段中有数字(价格)的帖子:示例152。每个帖子都有价格标签。我如何搜索所有高于价格的帖子,例如,我需要搜索所有标价至少为100的帖子。类似/?s=关键字(&M);价格>=300Thx公司