Prettified page URL w/ query var redirects to prettified page URL w/o query var

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:

Read More
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.

Related posts

Leave a Reply

1 comment

  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' );