将 404 重定向到在 404 模板上使用分页进行搜索

2022-08-30 17:52:31

首先,我想明确一点,我知道在处理404错误时,什么是最佳实践。但是,我有一个特定的情况,我可能需要一个量身定制的方法。

我正在处理一个拥有超过10年档案的报纸网站,其中包含150k以上辛勤工作的内容和大量仍然被点击的链接。它也经历了很多麻烦:在WP之前有3个不同的CMS,每个CMS都有自己的链接结构,并且在每次更改时都无法进行重定向。因此,从SEO的角度来看,现在档案几乎“丢失”了。

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

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

这样做的好处是,在强匹配(那些几乎肯定是“我感到很幸运”的匹配)上,我可以决定强制进行实际的301重定向。然而,情况并非总是如此:有时实际想要的文章在列表后面很远。尽管如此,它几乎可以正常工作,除了由于某种原因,分页在404上不起作用。所以现在我认为需要做两件事之一:

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

  2. 复杂的解决方案(如果可行):使用搜索模板本身。“搜索”slug可以通过与重写规则挂钩来完全删除,从理论上讲,这几乎将任何抛向它的URL都变成了搜索。巨大的问题是,它也适用于邮政编码以及除类别和标签之外的其他所有内容。因此,我从中得到的是以下内容:每当有URL请求时,Wordpress都会查看是否存在类别匹配,然后是标记,然后进行搜索。只有在此之后,它才会寻找匹配的作者,档案,帖子等。如果我能以某种方式加入wordpress关于url解析优先级的内部规则,并将搜索内容移动到列表的末尾,那么问题就会得到解决。$wp_rewrite->search_base = '';

我不得不承认,我没有尝试任何实际的代码。我不知道从哪里开始,我不知道要搜索什么,而且似乎也很少有文档可以证明我想要的东西。到目前为止,我所能做的就是盲测,如上所述。

因此,问题是是否有任何方法可以执行上述任一操作以及如何执行。


答案 1

如果可能的话,简单的解决方案是:以某种方式使分页在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。pre_get_posts

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

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

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

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;
}

答案 2

你可以调整你最初的想法:

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

您可以将用户重定向到搜索页面的副本,并添加一些消息,例如“此页面已移动,它是其中之一吗?(或者,更好的是,如果用户被重定向,则将该消息动态添加到您的标准搜索页面)。

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

还是我误解了解析您的URL并在wordpress搜索中提交它的一些限制?


推荐