I am migrating a site which will require about 5000 redirects, in a format such as
http://www.acme.org/content/item.aspx?id=123
redirects to
http://www.acme.org/resources/articles/why-acme-is-great
Normally I would accomplish this through .htaccess or an nginx module. However I'm on a WordPress specific host, Pantheon, which does not allow access to that.
Therefore the only solution I could think of is to use PHP. The following is working. There's some WordPress specific code in there to prevent WordPress from just throwing a 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);
}
}
This works fine. However I have two concerns:
- With a list of 5000, what kind of impact will this have on performance? I'm planning on using some larger conditionals and then narrowing down (in the example above, I first check for
/resources
before looking at specific IDs. - While this list will in theory never need to be modified, it feels like an ugly solution both in terms of syntax and logic. Is there a better method I'm not thinking of?