WordPress Custom URL Rewrites

I am trying to add a custom rewrite rule with a single variable to a specific page. The ‘ugly’ version is http://example.com/used-cars/car/?carname=name-of-car and the ‘pretty’ version I’m going for is http://example.com/used-cars/car/name-of-car.

http://example.com/used-cars/car/ is a page with a custom template that doesn’t display anything if the carname variable is not set. This is the code I have so far:

add_filter('query_vars', 'ip_add_rewrite_query_vars');
function ip_add_rewrite_query_vars($query_vars) {
    $query_vars[] = 'carname';
    return $query_vars;
}

add_action('init', 'ip_add_rewrite_rules');
function ip_add_rewrite_rules() {
    add_rewrite_rule(
        'used-cars/car/([^/]+)/?$',
        'index.php?p=403&carname=$matches[1]',
        'top'
    );
}

With this, when I go to http://example.com/used-cars/car/name-of-car it just redirects to http://example.com/used-cars/car and get_query_var('carname') returns null.

I have tried a couple of different variations on ways to do this (like modifying $wp_rewrite directly, using add_rewrite_tag()), but I either get the same result or a 404 error. I flush the rewrite rules and my browser’s cache every time I try to test the page again. I installed the rewrite analyzer plugin and my rewrite appears there and looks correct compared to the default ones. As far as I can see from all the examples on the web the code I have should work – it’s pretty much the same example from the codex page – and I have no idea why it doesn’t.

This is a multisite setup (each site on a different subdomain) – I’m not really familiar with multisite but I don’t think there’s anything in that that would affect custom rewrites?

1 Answer
1

I do something similar with custom records called shops and their specific ID number.
In my case I want http://example.com/shops/UNIDrecordthatsreallylong

to load with the variable shop_unid being the UNID record.
Here’s my working function:

//Shop page rewrites
function shop_rewrite() {
    add_rewrite_rule('^shops/([^/]*)/?','index.php?pagename=shops&shop_unid=$matches[1]','top');
    add_rewrite_tag('%shop_unid%','([^&]+)');
}
add_action('init', 'shop_rewrite');

Note that I used pagename instead of the post number. You never know if that could change say on a different multisite or if you exported the site to a new server so I always avoid hardcoding to specific post ID’s.

Now on the page or in its own function this should work:

global $wp_query;
$shop_unid = $wp_query->query_vars['shop_unid'];
print_r($shop_unid);

Leave a Comment