如何关闭301重定向帖子(不规范)?

时间:2012-03-07 作者:Alex Cook

我注意到WordPress中有一个奇怪的行为,它会自动301重定向帖子的某些URL结构。

例如,我有一个帖子:mysite。com/999/关于我们

然后,您可能会认为以下链接将生成一个404:mysite。com/567891/about-us-1

但是,WordPress会自动重定向到/999/关于我们

有没有办法关闭这种特定的重定向?看起来WP正在寻找最接近的“like”slug。请注意,我在posts表中没有关于-us-1的条目,也没有任何修订或任何会导致WP像这样转发的内容。

我发现了一个关闭canonical 301重定向的snippit:

remove_filter(\'template_redirect\',\'redirect_canonical\');
然而,这不是解决方案,因为它会在站点上生成不需要的URL结构。

2 个回复
SO网友:William

这似乎与redirect_guess_404_permalink() 在的第96行调用wp-includes/canonical.php. 为了测试,我添加了return false; 到的第一行redirect_guess_404_permalink() 这似乎阻止了这种奇怪的行为。我在四处闲逛,但到目前为止我没有看到good 在不编辑核心WordPress文件的情况下解决这个问题的方法(我个人反对在生产环境中这样做,因为这会使核心更新更困难,更容易发生事故)。我希望有一个好的过滤器/动作挂钩可用于redirect_guess_404_permalink 以简化此行为。如果我找到了一个好的解决方案,我会继续戳一点并更新这个答案。

EDIT

我可能已经找到了一个补丁,我做了短暂的测试并成功了。

Edit (again) 添加了一些逻辑(复制在中完成的检查canonical.php 执行重定向)以检查某些查询参数。没有上次编辑测试的那么好,所以请告诉我它是如何工作的。如果不是100%有效,至少应该让你走上正确的方向(并检查canonical.php).

add_action(\'template_redirect\', \'remove_404_redirect\', 1);
function remove_404_redirect(){
  if (is_404()){
    $id = max(get_query_var(\'p\'), get_query_var(\'page_id\'), get_query_var(\'attachment_id\'));
    $redirect_url = false;
    if ($id && $redirect_post = get_post($id)) {
      $post_type_obj = get_post_type_object($redirect_post->post_type);
      if ($post_type_obj->public)
        $redirect_url = get_permalink($redirect_post);
    }
    if (!$redirect_url)
      remove_filter(\'template_redirect\', \'redirect_canonical\');
  }
}
这将起作用,因为只有当页面最初是404时,才会发生不需要的重定向,所以我们只需检查404,如果是,则删除重定向过滤器。耶!

SO网友:Manuel Razzari

这里有一个更简单的方法。仅当不存在query\\u vars时才关闭重定向。通过这种方式,我们可以保留功能,而无需复制redirect\\u canonical中已有的逻辑。

add_filter(\'redirect_canonical\', \'no_redirect_on_404\', 10, 2);
function no_redirect_on_404($redirect_url, $requested_url){
    $id = max(get_query_var(\'p\'), get_query_var(\'page_id\'), get_query_var(\'attachment_id\'), 
            get_query_var(\'day\'), get_query_var(\'monthnum\'), get_query_var(\'year\'));
    if (is_404() && !$id){
        return false;
    }
    return $redirect_url;
}

结束