Redirecting Old URLs in WordPress

By | | PHP

8

We recently devised a system to redirect old URLs in PHP so that you could avoid “page not found” errors (I suggest you read it before venturing further). In this article, we’ll create a similar system for WordPress, the popular PHP CMS.

How is WordPress different?

WordPress routes all requests through a single index.php file. Under normal circumstances, all URLs that don’t map to a physical file or folder on your server will be handled by WordPress. This includes all invalid addresses, so there’s no need to configure a 404 error document in Apache or IIS.

There’s probably no need to worry about redirecting old URLs if you’ve been using WordPress since day one. The system is reasonably good at finding the right page, even if you change your permalink structure (Settings > Permalinks). However, if you’re migrating content from a static site or another CMS, you’ll almost certainly have URL mismatches.

Updating the theme

We’re going to handle redirects within your WordPress theme. You could create a plugin, but:

  • the redirects are site-specific and a generic plugin would add more complexity
  • the code is unlikely to require further updates and it’s preferable to avoid having users configure or disable it, and
  • embedding it within the theme makes it more portable–you just copy theme files to the server

First, locate your theme files in wp-content/themes/my-theme-name. Many themes provide a 404.php file to handle “page not found” errors, but you can create one if necessary; for example:


<?php get_header(); ?>
<h1>Page not found</h1>
<p>Sorry, we cannot find that page.</p>
<p>Please browse the sitemap&hellip;</p>
<ul id="sitemap">
<?php wp_list_pages('title_li='); ?>
</ul>
<?php get_footer(); ?>

You should now include redirect.php at the top of the 404.php file, for example:


<?php include('redirect.php'); ?>
<?php get_header(); // etc...

(Note that earlier versions of WordPress may require: include(TEMPLATEPATH.'/redirect.php'); –that’ll work in the latest versions too.)

Now create the redirect.php file in your theme folder and add the following code:


<?php
// current address
$oldurl = strtolower($_SERVER['REQUEST_URI']);
// new redirect address
$newurl = '';
// old to new URL map (for you to configure)
$redir = array(
	'index.html' => '/',
	'article1.html' => '/blogs/my-first-article',
	'article2.html' => '/blogs/my-second-article'
);
while ((list($old, $new) = each($redir)) && !$newurl) {
	if (strpos($oldurl, $old) !== false) $newurl = $new;
}
// redirect
if ($newurl != '') {
	header('HTTP/1.1 301 Moved Permanently');
	header("Location: $newurl");
	exit();
}
?>

The $redir URL mapping array can be configured as necessary. Alternatively, you could use a series of regular expression replacements or a database table lookup to find a valid $newurl.

I hope that helps with your WordPress URL woes. If you have other tips for managing redirects, please leave your comments below.

Written By:

Craig Buckler

Craig is a Director of OptimalWorks, a UK consultancy dedicated to building award-winning websites implementing standards, accessibility, SEO, and best-practice techniques.

Website
>> More Posts By Craig Buckler

 

{ 8 comments }

Duncan Maybury October 9, 2011 at 1:07 am

Great, Just what I was looking for, nice and solid.
Thanks

BrenFM August 16, 2010 at 8:06 am

Yeah I tried that after posting my first comment. Looks good so far.

Russell Thackston August 14, 2010 at 1:11 pm

Or, you could use the Simple 301 Redirect Plugin(1). I just replaced Redirection with it and it seems to be working just fine; no “occasional” new entries being added to break things.
(1) http://www.scottnelle.com/simple-301-redirects-plugin-for-wordpress/

Rod August 13, 2010 at 9:07 am

WordPress Redirection plugin is good. The only problem I have is WP 3 is that it will occasionally add a redirect to the static homepage for no reason, breaking the site. You just have to watch for it and remove it when it happens

Nickiler August 26, 2010 at 9:49 pm

You can just disable it all together and keep all of your existing redirects.
I wrote a simple how-to once it happened to me. I have not had that problem ever since. Others have also confirmed this fix worked for them as well.
http://www.ilertech.com/2010/08/whats-wrong-with-the-wordpress-redirection-plugin/

BrenFM August 11, 2010 at 6:31 am

@jtaubman – I’d be concerned about using a plugin with the kind of feedback the Redirection plugin is getting. 1 person says it works, 9 say it’s broken in 3.0.1. Probably okay in earlier versions of WP, but if you’re security conscious at all, then your install should be up to date and therefore this plugin is no good. Interesting to see how other people handle this issue though.

Michael August 11, 2010 at 4:20 am

Why not use a 301 redirect? Oddly enough I just did it through CPanel, it didn’t work so support added the below to the .htaccess file and it works now:

#BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php$ – [L]

# END WordPress

jtaubman August 10, 2010 at 5:22 pm

You could of course, just drop in the Redirection Plug in
http://wordpress.org/extend/plugins/redirection/

It’s easy to drop in and counts and logs the redirects etc, so you can track the traffic which caused them.

Comments on this entry are closed.