重定向 404 以在 404 模板上进行分页搜索
Posted
技术标签:
【中文标题】重定向 404 以在 404 模板上进行分页搜索【英文标题】:Redirecting 404 to search with pagination on 404 template 【发布时间】:2015-09-19 03:52:39 【问题描述】:首先,我想明确表示我知道处理 404 错误时的最佳做法是什么。但是,我有这种特殊情况,我可能需要量身定制的方法。
我正在处理一个拥有超过 10 年档案价值的报纸网站,其中包含 15 万多条辛勤工作的内容和大量仍然可以点击的链接。它也经历了很多麻烦:在 WP 之前有 3 个不同的 CMS,每个都有自己的链接结构,并且每次更改时重定向不正确。所以现在从 SEO 的角度来看,这些档案几乎都“丢失”了。
超过 90% 的内容放错了位置,显示经典 404 并不是一个真正的选择。紧急出口是将 URL 中的单词重定向到搜索查询(在过滤掉常量之后)并希望最好。在大多数情况下,相关结果显示在顶部,但并非总是如此。因此,我认为假装 404 根本不存在是错误的。
我想到的另一种方法是:逐字保留 URL,发送 404 状态,但使用 404 模板在相关字词上显示搜索查询(WP_query
带有 's' 参数)。
这样做的好处是,在强匹配(几乎可以肯定是“我感觉很幸运”的匹配)上,我可以决定强制执行实际的 301 重定向。 但是,情况并非总是如此:有时实际想要的文章在列表中很远。尽管如此,它几乎可以正常工作,除了由于某种原因分页不适用于 404。所以现在我认为需要做两件事之一:
简单的解决方案,如果可能的话:以某种方式使分页在 404 模板上工作 - 因为我不知道为什么它还没有,我不知道它是否可以完成或如何完成。 (更新:很可能是因为分页查询 var/slug 被视为搜索的一部分)
如果可行的话,复杂的解决方案:使用搜索模板本身。可以通过使用$wp_rewrite->search_base = '';
连接到重写规则来完全删除“搜索”slug,理论上这几乎可以将任何扔给它的 url 变成搜索。最大的问题是它还对邮件名称和除类别和标签之外的所有其他内容执行此操作。
所以我从中得到以下信息:每当有 URL 请求时,Wordpress 会查看是否有类别匹配,然后是标签,然后它会进行搜索。只有在那之后,它才会寻找匹配的作者、档案、帖子等。如果我能以某种方式连接到 wordpress 关于 url 解析优先级的内部规则并将搜索内容移动到列表的末尾,问题就会得到解决。
我不得不承认我没有尝试任何实际代码。我不知道从哪里开始,我不知道要搜索什么,而且我想要的文档似乎也很少。到目前为止,我所能做的就是盲测,如上所述。
所以问题是是否有任何方法可以做到以上任何一个以及如何做。
【问题讨论】:
那个“404 模板”是 WP 特有的吗?无论如何,为什么不通过 ajax 进行“分页”呢?当有人滚动到底部时,ajax 会将下一个 X 结果加载到活动页面中,而无需任何重新加载或 URL 更改... 模板并不具体,我猜它的工作方式是。分页实际上是通过 ajax 完成的,但目标页面仍然需要首先创建,这不会发生。 【参考方案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;
);
请注意,在正常情况下,修改主查询的最佳做法是使用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;
【讨论】:
“如果没有看到 404 模板的代码,很难说为什么分页不起作用。”尝试使用默认的 wordpress 循环,它适用于除此之外的所有其他模板。我开始怀疑这可能与分页查询 args/slug 被视为搜索本身的一部分有关。 “您可以使用 template_include 过滤器来更改模板。您还必须手动将主查询更改为搜索查询”我会尝试一下,看起来可能是这样。 显然,除非 wordpress 会更改 url 解析优先级或为此记录一些挂钩,否则此时无法完成分页操作。不过,这是我使用的一个很好的进步。【参考方案2】:你可以调整你最初的想法:
在大多数情况下,相关结果会显示在顶部,但并非总是如此。因此,我认为假装 404 根本不存在是错误的。
您可以将用户重定向到搜索页面的副本,并添加一些类似于“此页面已移动,是其中之一吗?”的消息。 (或者,如果用户被重定向,甚至更好地将该消息动态添加到您的标准搜索页面)。
根据您的搜索设置方式,您可以将原始 URL 作为 php POST 变量发送以运行搜索,或者在 404 页面上对其进行解析并将其作为一系列 GET 变量发送。
还是我误解了解析您的 URL 并将其提交到 wordpress 搜索中的一些限制?
【讨论】:
是的,从来没有想过复制一些现有的模板——这开启了相当多的可能性。事实上,这些事情都可以用 Wordpress 来完成。限制在于 WP 有自己的内部优先级列表和 url 请求。所以首先它会测试它是否是一个类别,如果匹配服务,否则测试如果标签,如果匹配服务,否则尝试搜索 - 从这一点开始,任何事情都不再重要了(作者,日期,自定义分类,帖子!等) 被解析为搜索。 IMO,搜索应该始终排在最后,无论是默认情况下还是至少通过我正在寻找的黑客。以上是关于重定向 404 以在 404 模板上进行分页搜索的主要内容,如果未能解决你的问题,请参考以下文章
如果 url 模式不匹配,Django 如何重定向到 404 页面
使用 .htaccess 重定向 404 而不重定向尾部斜杠
使用 301 重定向重定向 404 是将现有页面重定向到主页