I have a page created (page ID 235) with a page template that will need to be passed a variable. I would like to pass this variable through the URL. My first attempt was to pass this with a GET variable, and that worked just fine.
URL: http://example.com/sok/events/?kategori=variablehere
Now, I thought I’d spice this up a bit and prettify it. This is what I am aiming to achieve:
URL: http://example.com/sok/events/variablehere
The code I have been using in my attempt looks like the following:
function setup_filter_rewrites()
{
add_rewrite_tag('%kategori%','([^&]+)');
add_rewrite_rule('^sok/events/([^/]*)/?', 'index.php?p=235&kategori=$matches[1]', 'top');
}
add_action( 'init', 'setup_filter_rewrites' );
Now, when accessing the URL above, I am redirected to http://example.com/sok/events/ – i.e. the URL but without the query variable. Obviously, as you may guess, the query variable is not accessible inside the page.
I heard of the redirect_canonical function potentially causing problems with rewrite rules, so I disabled it. After having done so, accessing the above URL instead yields a 404.php request.
As you can see, I’ve really tried to cut back on the code to make it as simple as possible as well as using the correct API functions. I have checked the rule with A tool to analyze rewrite rules? and it reports the variable as being public and accessible. I tried cutting the page down to a simple echo $wp_query->query_vars['kategori'] but that did not output anything nor did it prevent the redirection.
I suspect the redirection is the problem here – if I could stop it, I’m confident I’d be able to grab the query variable.
This problem is similar to URL Rewrite + Page + Custom Post Type = Unusual Redirect and Querystring parameter getting lost in rewrite rule insofar that it is also a redirection error. However, in my case, I am not dealing with custom post types of any kind.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
I think you just have to add kategori to the array of query vars:
EDIT- after much iteration we’ve arrived at a solution. the original code seemed to be working, but only with specific permalink settings, as I was mistakenly routing to a post instead of a page. rather than p=, it should be pagename=, with both the parent and child page in the path:
function setup_filter_rewrites()
{
add_rewrite_rule('sok/events/([^/]*)/?', 'index.php?pagename=sok/events&kategori=$matches[1]', 'top');
}
add_action( 'init', 'setup_filter_rewrites' );
function setup_filter_query_vars( $query_vars )
{
$query_vars[] = 'kategori';
return $query_vars;
}
add_filter( 'query_vars', 'setup_filter_query_vars' );
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0