我正在迁移一个需要大约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);
}
}
这很好用。但是我有两个问题:
/resources
,然后再查看具体的ID。答案 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的情况下,您检查是否存在重定向并且该查询仅返回一行。
这种方法存在问题,即如果有人在两个帖子上输入相同的号码,则没有优先级排序的方法,这是最重要的重定向。您也可以考虑使用插件来解决此问题。