I must say that I am a complete nooby at WordPress custom URL rewrites. I have searched for past many days to find a clear explanation of how to determine and write correct pattern for URL rewrites. I have a custom page template that uses query var passed to it, e.g. http://example.com/pagename?user=username. In this “pagename” refers to the custom page template and “user” refers to the custom query var. I need this to be represented using the URL http://example.com/pagename/username.
I also require the above to work with pagination. So http://example.com/pagename/username/page/2 should be able to represent http://example.com/pagename/page/2?user=username
It would be great if someone can provide me with a working example and an explanation of how I should determine and write correct pattern for URL rewrites.
Regards,
John
Extending @Stephen Harris’ excellent answer, I would opt for;
This follows the defacto regex standard used in WordPress core. The main change from Stephen’s code sample is the use of
$wp_rewrite->index
to ensure the rewrite is passed through to WordPress (otherwise it may get added to the ‘external’rewrite list).Secondly, and most importantly, passing the
pagename
var in the query string – this means WordPress will behave as if it were ordinarily loading a page with the slugmypageslug
.UPDATE: I forgot to add, make sure
user
is a public query var, otherwise WordPress won’t map it from the URL. Either filter it in withquery_vars
or add it using the global$wp
;I have had a similar problem and successfully solved it. In fact I recently wrote this blog post which used this solution.
WordPress uses rules to make the URls pretty, the idea is to use a filter to call a function that add rules (then after going to settings > Permalinks and clicking save the rules should be added). This is the code:
The idea is that WordPress checks to see if the url is of the form http://www.example.com/pagename/something and uses that something to set the user variable.
To get pagination to work you’ll need to add the following rule to the $new_rules array – above the rule already there (this is because WordPress checks the rules in order).
Similarly this checks for http://www.example.com/pagename/something/page/2 say and interprets this as example.com/pagename?user=username&paged=2. (Paged is the query variable recognised by WordPress for determining the page in pagination).
Hope this helps!