Can’t get rewrite rules working

Basically I want to rewrite:
/edit/test-post
to an existing page with a parameter:
/edit?e=test-post

From the examples in the Codex I created:

Read More
add_filter( 'rewrite_rules_array','my_insert_rewrite_rules' );
add_filter( 'query_vars','my_insert_query_vars' );
add_action( 'wp_loaded','my_flush_rules' );

// flush_rules() if our rules are not yet included
function my_flush_rules(){
    $rules = get_option( 'rewrite_rules' );

    if ( ! isset( $rules['(edit)/(d*)$'] ) ) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }
}

// Adding a new rule
function my_insert_rewrite_rules( $rules )
{
    $newrules = array();
    $newrules['(edit)/(d*)$'] = 'edit?&e=$matches[2]';
    return $newrules + $rules;
}

// Adding the id var so that WP recognizes it
function my_insert_query_vars( $vars )
{
    array_push($vars, 'e');
    return $vars;
}

However, I simply cannot get it working, what am I doing wrong?

Thanks!

Related posts

Leave a Reply

1 comment

  1. By ‘existing page’ do you mean a WordPress page? My experience with rewrites is routing everything to index.php with whatever extra query vars you need, I think attempting to route it to edit is one of your issues, not entirely clear on your intent there.

    Go download Monkeyman Rewrite Analyzer if you don’t already have it, it’s a great tool for testing these things out.

    I tested out the following rule to verify it works. All requests to /edit/* load a page named ‘edit’, get_query_var('e') returns the correct value for e in my template.

    Note I didn’t flush the rules here, I usually just visit the Settings > Permalinks page and click save to flush whenever I change them.

    <?php
    
    add_action( 'init', 'my_rewrites_init' );
    function my_rewrites_init(){
        add_rewrite_rule(
            'edit/([^/]+)/?',
            'index.php?pagename=edit&e=$matches[1]',
            'top' );
    }
    
    add_filter( 'query_vars', 'my_query_vars' );
    function my_query_vars( $query_vars ){
        $query_vars[] = 'e';
        return $query_vars;
    }