使用PHP

时间:2017-04-04 14:09:11

标签: php wordpress redirect pantheon

我正在迁移一个需要大约5000次重定向的网站,格式如

http://www.acme.org/content/item.aspx?id=123重定向到 http://www.acme.org/resources/articles/why-acme-is-great

通常我会通过.htaccess或nginx模块完成此操作。但是我在一个WordPress特定的主机Pantheon上,它不允许访问它。

因此,我能想到的唯一解决方案是使用PHP。以下是有效的。那里有一些WordPress特定代码,以防止WordPress抛出404。

add_filter('template_redirect', 'my_404_override');
function my_404_override()
{
  global $wp_query;
  if (strpos($_SERVER['REQUEST_URI'], 'issues') !== false) {
    $redirectURL = "/resources";
    if (strpos($_SERVER['REQUEST_URI'], '123') !== false) {
      $redirectURL .= "/articles/why-acme-is-great/";
    }
  }

  if (!empty($redirectURL)) {
    status_header(200);
    $wp_query->is_404 = false;
    header('HTTP/1.0 301 Moved Permanently');
    header('Location: http://www.acme.org' . $redirectURL);
  }
}

这很好用。但是我有两个问题:

  1. 列表5000,这会对性能产生什么样的影响?我打算使用一些更大的条件然后缩小范围(在上面的例子中,我首先检查/resources,然后再查看具体的ID。
  2. 虽然这个列表理论上永远不需要修改,但在语法和逻辑方面感觉都是一个丑陋的解决方案。有没有更好的方法我没想到?

1 个答案:

答案 0 :(得分:2)

您的问题是您需要将旧内容的地图制作为新内容。为每个帖子内容添加一个自定义字段到“old_url = 123”的效果,然后为post-slug做一个wp_query。我认为你的旧ID(即123)不一定与新的ID匹配。为每个可能的URL添加条件的方法是不可行的并且难以维护。

当您为每个包含“旧内容”的新帖子/页面添加字段时,您的代码可能是这样的:

add_filter('template_redirect', 'my_404_override');
function my_404_override()
{
   global $wp_query;
   $old_url = $_SERVER['REQUEST_URI'];
   $results = $wpdb->get_results(
        $wpdb->prepare( "SELECT wp_posts.guid, redirect_url FROM wp_posts LEFT JOIN wp_post_meta ON wp_posts.ID = wp_post_meta.post_id WHERE wp_post_meta.old_url = %s LIMIT 1", $old_url ));
     $redirectURL = $results[0]['guid'];
  }

if (!empty($redirectURL)) {
    status_header(200);
    $wp_query->is_404 = false;
    header('HTTP/1.0 301 Moved Permanently');
    header('Location: ' . $redirectURL);
    }
}

这是伪代码;但一般的想法是你无论如何都要查询一行;并且对性能的影响可以忽略不计,因为仅在404的情况下,您检查是否存在重定向并且该查询仅返回一行。

这种方法存在问题,即如果有人在两个帖子上输入相同的号码,则没有优先级排序的方法,这是最重要的重定向。您也可以考虑使用插件来解决此问题。

https://wordpress.org/plugins/redirection/