将404重定向到带有分页的搜索结果页面(404模板)

24
首先,我想明确一点,当涉及处理404错误时,我知道最佳实践是什么。然而,我有一个特殊情况,可能需要量身定制的方法。
我正在处理一家拥有超过10年档案的报纸网站,有150,000多个努力制作的内容和大量的链接仍在被点击。它也经历了许多麻烦:在WP之前的3种不同CMS,每种都有自己的链接结构和不适当的重定向,在每次更改时都发生。因此,从SEO的角度来看,这些档案几乎已经“丢失”了。
由于超过90%的内容错位,显示经典的404并不是一个真正的选择。应急出口是将URL中的单词重定向到搜索查询(过滤常数后)并希望获得最好的结果。在大多数情况下,相关结果会显示在顶部,但并非总是如此。因此,我认为假装404不存在是错误的。
我想到的另一种方法是:保留URL的原样,发送404状态,但使用404模板在相关单词上显示搜索查询(使用's'参数的WP_query)。
这样做的好处是,在强匹配(几乎肯定是“I'm feeling lucky”的匹配项)的情况下,我可以决定强制进行实际的301重定向。不过,并非总是如此:有时实际想要的文章在列表中非常靠后。尽管如此,它几乎可以正常工作,但由于某种原因,分页在404上不起作用。因此,我认为需要做以下两件事之一:
1. 简单解决方案(如果可能的话):以某种方式使分页在404模板上工作——因为我不知道为什么不起作用,也不知道是否可以或如何解决。(更新:很可能是因为分页查询变量/标识符被视为搜索的一部分)
  • 如果只有可行的复杂解决方案: 使用搜索模板本身。通过使用 $wp_rewrite->search_base = ''; 钩入重写规则,可以完全删除“搜索”缩略词。从理论上讲,它可以将几乎任何网址转换为搜索。但巨大的问题是,它也会将除类别和标签以外的所有内容(包括文章名称等)都变成搜索。

  • 因此,我从中得出以下结论:每当有URL请求时,WordPress 会查找是否存在匹配的类别,然后是标签,然后才进行搜索。只有在这之后,WordPress 才会查找匹配的作者、归档、文章等。如果我能想办法钩入 WordPress 关于 URL 解析优先级的内部规则,并将搜索的优先级移到列表末尾,问题就会得到解决。

    我必须承认,我没有尝试过任何实际代码。我不知道从哪里开始,也不知道具体要搜索什么,而且似乎很难找到我想要的文档。到目前为止,我所能做的只是像上面描述的盲目测试。

    因此,问题是是否有任何方法来实现上述任一方式,以及如何实现。


    “404模板”是WordPress特有的吗?不管怎样,为什么不通过ajax来实现“分页”呢?当有人滚动到底部时,ajax会将下一个X结果加载到活动页面中,而无需重新加载或更改URL... - Marki555
    模板并不具体,我猜它的工作方式是。 分页实际上是通过ajax完成的,但目标页面仍然需要首先创建,这一步尚未完成。 - lucian
    2个回答

    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;
    });
    
    请注意,在正常情况下,修改主查询的最佳实践是使用过滤器。然而,在此情况下,我们在查询执行之后才知道是否为404。
    此外,我使用将响应代码从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;
    }
    

    "没有看到你的404模板代码,很难说分页为什么不起作用。"我尝试使用默认的WordPress循环,在除了这个模板之外的每个模板上都可以工作。我开始怀疑分页查询参数/标记被视为搜索本身的一部分。"您可以使用template_include过滤器更改模板。您还需要手动将主查询更改为搜索查询。"我会尝试一下,看起来可能是这个问题。 - lucian
    显然,除非WordPress更改URL解析优先级或记录某个钩子来处理分页,否则此时无法完成分页。尽管如此,这是比我之前使用的更好的进步。 - lucian

    3
    您可以调整您最初的想法:
    在大多数情况下,相关结果会显示在顶部,但并非总是如此。因此,我认为假装404页面不存在是错误的。
    您可以将用户重定向到带有一些附加信息的搜索页面副本,例如“此页面已移动,它是其中之一吗?”(或者更好的方法是,如果用户被重定向,则动态添加该消息到您的标准搜索页面)。
    根据您的搜索设置方式,您可以将原始URL作为php POST变量发送以运行搜索,或在404页面上解析它并将其作为一系列GET变量发送。
    还是我误解了解析您的URL并提交它到WordPress搜索中的某些限制?

    没错,从来没有想过复制一些现有的模板 - 这打开了很多可能性。 确实,这些事情可以用WordPress完成。限制在于WP有它自己的内部优先级列表与url请求。所以首先它会测试是否为分类,如果匹配则提供服务,否则测试是否为标签,如果匹配则提供服务,否则尝试搜索 - 从这一点开始,任何东西(作者、日期、自定义分类、文章等)都被解析为搜索。在我看来,搜索应该始终是最后一个,要么默认,要么通过我正在寻找的黑客方式。 - lucian

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接