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:
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!
1 Answer
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;
}