flexible rewrite ‘ramble’ URLs with WordPress

I want to access my post with id 17 like this:

http://localhost/archives/17/moot-bla-foo-ramble

In other words, the id shall decide, everything thereafter may (or may not) be the slug or anything else. Much like these links leading to the same page (many other sites do the same):

  • http://www.amazon.de/pair-of-blue-suede-shoes/dp/B005EFYRF0
  • http://www.amazon.de/nice-fancy-coffee-maker/dp/B005EFYRF0

I tried to define a rewrite-rule like this near the top of my .htaccess:

RewriteRule ^archives/(\d{1,12})(?:/.*) archives/$1 [NC]

This almost works, i.e. goes to the right page, but get’s me a page-not-found then,
because wordpress looks at PATH_INFO again (I think) and states $query_string now is string attachment=moot-bla-foo-ramble

I do not want to do a 301 redirect.

My favourite or course, if such thing existed in Permalink Settings:Custom Structure

/archives/%post_id%/%wildcard%

Albeit that would make the ‘ramble’ mandatory, so even better…

/archives/%post_id%(/%wildcard%)?

wishful thinking, I guess.

3 Answers
3

You shouldn’t use the htaccess instead you should use the WordPress APIs

e.g.

function custom_rewrite( $wp_rewrite ) {

    $feed_rules = array(
        'archives/(\d+)(?:/.*)+'    =>  'index.php?p='. $wp_rewrite->preg_index(1)
);

    // ( array merge must be done this way, to ensure new rule comes first )
    $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( 'generate_rewrite_rules', 'custom_rewrite' );

Leave a Comment