Adding mod_rewrite Rules to .htaccess in WordPress

November 2nd, 2009

This is all about the Twitter Friendly Links plugin I’ve been working on lately. You might have noticed some 404 issues in the comments section on the plugin page, this in most cases is due to caching fail. I wrote about this a while ago when I was working on W3 Total Cache compatibility where all I had to do is set the wp_query object’s is_404 variable to false. Then again, the other caching plugins didn’t understand that, so I came up with my own links caching mechanism – direct cache with .htaccess ;)

Hacking WordPress Rewrite Rules

Hacking WordPress Rewrite Rules

The WP_Rewrite article in the Codex pretty much explains everything, except that it’s pretty difficult to add custom rewrite rules to .htaccess via WordPress, as even wp_query object’s non_wp_rules is handled like this:

RewriteRule ^Pattern /Substitution [QSA,L]

With the trailing slash and “Query String Append + Last Rule” hard-coded in the WordPress core. Well here’s how I managed to do Permanent 301 redirects to absolute URLs.

First of all add an action and a filter. My plugin code is wrapped up in a class (and I encourage you to do the same for maximum compatibility):

add_action('generate_rewrite_rules', array(&$this, 'generate_rewrite_rules'));
add_filter('mod_rewrite_rules', array(&$this, 'mod_rewrite_rules'));

The generate_rewrite_rules action is the place where we will add some rules to non_wp_rules, then modify (or customize) in the mod_rewrite_rules filter. Here’s the generate_rewrite_rules function which I’m hooking to:

1
2
3
4
5
6
7
8
9
10
function generate_rewrite_rules()
{
	global $wp_rewrite;
	$non_wp_rules = array(
		'simple-redirect/?$plugin_name' => 'http://google.com',
		'one-more-redirect/?$plugin_name' => 'http://yahoo.com'
	);
 
	$wp_rewrite->non_wp_rules = $non_wp_rules + $wp_rewrite->non_wp_rules;
}

I used the string ‘plugin_name’ in every rule just to make sure that I don’t edit anyone else’s rewrite rules further on. You’ll understand what I mean once you read the next part of the code. Also make sure you use single quotes as double quotes would make $plugin_name a variable.

1
2
3
4
5
function mod_rewrite_rules($rules)
{
	$rules = preg_replace('/^(RewriteRule \^.*+\/\?\$)plugin_name (\/)(.*) (\[QSA,L\])$/im', '\1 \3 [R=301,L]', $rules);
	return $rules;
}

There you go, so the rules are modified using a simple regular expression, which in .htaccess will turn out to be:

RewriteRule ^simple-redirect/?$ http://google.com [R=301,L]
RewriteRule ^one-more-redirect/?$ http://yahoo.com [R=301,L]

The regex is not perfect though, just a sketch. I believe it will not work if the RewriteBase is not set to / but you get my point ;) The rules are written to .htaccess when you access or save changes in the Permalinks section in the admin panel or whenever wp_rewrite object’s flush_rules is called. Now be careful, you cannot call flush_rules anywhere outside the admin panel (although you may try to link with a few includes – wp-admin/includes/misc.php and wp-admin/includes/files.php before flushing) but in my case I’ll just go with the publish_post hook.

Related posts:

  1. WordPress: The template_redirect Hook Returns 404
  2. Loading jQuery from a CDN in WordPress
  3. Multiblog WordPress: Eeek! No Database Connection
  4. WordPress 2.9: From a Developer’s Point of View
  5. Multiple Sites Driven By One WordPress Installation Part II: Please Be Careful, You Really Might Mess Up ;)

Tagged: , , , , , , ,
Shortlink: http://kovshenin.com/1548

Permalink or share:
  • Twitter
  • Digg
  • Facebook
  • del.icio.us
  • FriendFeed
  • Technorati
  • Google Bookmarks
  • LinkedIn
  • Ping.fm
  • Identi.ca
  • StumbleUpon
  • Print
  • email

3 Responses to “Adding mod_rewrite Rules to .htaccess in WordPress”

  1. pgofman says:

    прошу прощения
    а можно только эту статью переписать на русском
    очень нужно
    спасибо за понимание

    • kovshenin says:

      Note sure I have the time for that buddy. You may contact me on Skype though and I’ll try to explain whatever it is that you cannot understand ;) My Skype handle is kovshenin.

Including pingbacks & trackbacks

  1. 10 WordPress Hack Links and Articles Nov 2, 2009 | Technical Dig linked here on November 2, 2009 at 9:35 pm

Leave a Reply