How to properly rewrite url by custom var

I’ve been trying to rewrite a shop uri, and what I have now is this code:


// Remember to flush_rules() when adding rules
function flushRules(){
    global $wp_rewrite;

// Adding a new rule
function wp_insertMyRewriteRules($rules) {
    $newrules = array();
    $newrules['shop/brand/(brand)/?$'] = 'shop.php?brand=$matches[1]' ; 
     //$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
     return $newrules + $rules ;

// Adding the bid var so that WP recognizes it
function wp_insertMyRewriteQueryVars($vars) {
    array_push($vars, 'brand');
    return $vars;

but no matter what I do I can’t get this to work.
I’m using Monkeyman Rewrite Analyzer plugin to view the active ap rewrites and what it tells me is that brand “is not public and will not be saved”. Also, it changes my shop.php to shop_php…

shop/brand/(brand)/?$    shop_php?brand: (brand)

Why is this such a mess? I tried to modify .htaccess as little as possible; also, since I want this to be in the theme.

3 Answers

So, first off, never flush rewrite rules on every page load. Better to do it on plugin activation one time.

Step 1: add the rewrite rule:

add_action( 'init', 'wpse26555_add_rewrite' );
function wpse26555_add_rewrite()
    // You should probably rewrite to index.php instead of shop.php?
    add_rewrite_rule( '/shop/brand/([^/]+)/?$', 'index.php?brand=$matches[1]', 'top' );

Step 2: add the query var

add_filter( 'query_vars', 'wpse26555_add_vars' );
function wpse26555_add_vars( $vars )
    $vars[] = 'brand';
    return $vars;

Then flush on plugin activation (because something like this should probably be in a plugin file).

// Somewhere in your plugin's main file    
register_activation_hook( __FILE__, 'wpse26555_activation' );
function wpse26555_activation()
        // Add the rule first
        // Then flush rewrite rules

Then on the front end you can do something like this:

if( $brand = get_query_var( 'brand' ) )
    // Do stuff with $brand here


Maybe a better strategy would be to rewrite brand to a specific page? Or maybe brand could be some sort of custom taxonomy?

You’ll have to test the above code, it was off the top of my head, but it should work or at least get you started

Leave a Comment