重定向404以在404模板

时间:2015-07-01 20:05:44

标签: php wordpress redirect search pagination

首先,我想说清楚我知道在处理404错误时最佳做法是什么。但是,我有这个特殊情况,我可能需要一个量身定制的方法。

我正在处理一个拥有超过10年档案的报纸网站,其中包含150,000多个难以处理的内容以及仍然可以点击的大量链接。它也经历了很多麻烦:在WP之前有3个不同的CMS,每个都有自己的链接结构,并且在每次更改时都不正确地重定向。所以现在档案馆从搜索引擎优化的角度来看都是“迷失”。

超过90%的内容放错位置,显示经典的404不是真正的选择。紧急出口是将URL中的单词重定向到搜索查询(在过滤掉常量之后)并希望最好。在大多数情况下,相关结果显示在顶部,但并非总是如此。出于这个原因,我认为假装404根本就不存在是错误的。

我想到的另一种方法是:保持URL逐字,发送404状态,但使用404模板在相关单词上显示搜索查询(WP_query带's'参数)。 / p>

这样做的好处是,在强力匹配(那些几乎肯定是“我感觉很幸运”),我可以决定强制实际301重定向。 但情况并非总是如此:有时真正想要的文章在列表中很远。尽管如此,它仍然可以正常工作,但由于某种原因,分页不适用于404s。所以现在我认为需要完成以下两件事之一:

  1. 简单的解决方案,如果可能的话:以某种方式使分页工作在404模板上 - 因为我不知道为什么它还没有,我不知道它是否可以完成或如何。 (更新:很可能是因为分页查询var / slug被视为搜索的一部分)

  2. 复杂的解决方案,如果可行的话:使用搜索模板本身。通过使用$wp_rewrite->search_base = '';连接到重写规则,可以完全删除'search'slug。这理论上将几乎所有引发的url转换为搜索。最大的问题是,除了类别和标签之外,它还可以用于邮戳和其他所有内容。 所以我从中得到的结果如下:每当有URL请求时,Wordpress会查看是否有类别匹配,然后是标签,然后它会进行搜索。只有在那之后,它才会寻找匹配的作者,档案,帖子等。如果我能以某种方式挂钩wordpress关于url解析优先级的内部规则并将搜索事物移动到列表的末尾,问题就会得到解决。

  3. 我必须承认我没有尝试任何实际的代码。我不知道从哪里开始,我不知道究竟要搜索什么,似乎也没有我想要的文档。如上所述,我迄今为止所做的就是盲测。

    所以问题是,是否有任何方法可以做上述任何一种方法和方法。

2 个答案:

答案 0 :(得分:11)

  

简单的解决方案,如果可能的话:以某种方式在404模板上进行分页 - 因为我不知道为什么它不存在,我不知道它是否可以完成或如何。

如果没有看到404模板的代码,很难说为什么分页不起作用。

  

复杂的解决方案,如果可行的话:使用搜索模板本身。

您可以使用template_include过滤器更改模板。您还必须手动将主查询更改为搜索查询:

add_filter('template_include', function($template) {
   if(!is_404()) {
       return $template;
   }

    $search_query = new WP_Query(array('s' => get_query_var('name')));
    if($search_query->have_posts()) {
        // Replace the main query with the search query
        global $wp_query;
        $wp_query = $search_query;

        // Change the response code
        status_header(200);

        // Use the search template
        return get_search_template();
    }

    return $template;
});

请注意,在正常情况下,修改主查询的最佳做法是使用pre_get_posts过滤器。但是,在这种情况下,我们不知道在执行之后是否为404。

此外,如果搜索返回结果,我正在使用status_header将响应代码从404更改为200。如果您要做的只是向用户提供正确的内容,那么响应代码可能无关紧要。

  

在大多数情况下,相关结果显示在顶部,但并非总是

如果您确定只想提供搜索的第一个结果,则可以更新上述代码以重定向:

if($search_query->have_posts()) {
    $url = get_permalink( $search_query->posts[0]->ID );
    wp_redirect($url);
    exit;
}

更新:此外,您可以将请求重定向到搜索,而无需担心修改404模板或加载其他模板:

if($search_query->have_posts()) {
    $url = get_search_link( get_query_var('name') );
    wp_redirect($url);
    exit;
}

答案 1 :(得分:3)

您可以调整原来的想法:

  

在大多数情况下,相关结果显示在顶部,但并非总是如此。出于这个原因,我认为假装404根本就不存在是错误的。

您可以将用户重定向到搜索页面的副本,其中包含一些添加的消息,其中包含"此页面已移动,是否为其中之一?" (或者,更好的是,如果重定向用户,则将该消息传递动态添加到标准搜索页面。)

根据搜索的设置方式,您可以将原始URL作为php POST变量发送以运行搜索,或者在404页面上解析它并将其作为一系列GET变量发送。

或者我误解了解析你的网址并在wordpress搜索中提交它的一些限制?