I have a taxonomy car
and a couple terms like kia
, honda
, and toyota
.
Using the function get_term_link()
, I can get a term archive link like this:
site/car/honda/
I am trying to use custom rewrite rules to get this structure:
site/car/honda/{$trim}
My rewrite rule looks like this:
add_rewrite_rule(
home_url() . '/car/([^/]*)/([^/]*)/?',
'index.php?taxonomy=car&term=$matches[1]&model=$matches[1]&trim=$matches[2]',
'top'
);
However it does not work properly. The default term archive links work (site/car/honda
), but if I add anything as a $trim
, WordPress redirects to a 404 which leads me to believe that my regex isn't being matched at all.
My taxonomy is non-hierarchical.
Any help would be appreciated, thank you.
I have a taxonomy car
and a couple terms like kia
, honda
, and toyota
.
Using the function get_term_link()
, I can get a term archive link like this:
site/car/honda/
I am trying to use custom rewrite rules to get this structure:
site/car/honda/{$trim}
My rewrite rule looks like this:
add_rewrite_rule(
home_url() . '/car/([^/]*)/([^/]*)/?',
'index.php?taxonomy=car&term=$matches[1]&model=$matches[1]&trim=$matches[2]',
'top'
);
However it does not work properly. The default term archive links work (site/car/honda
), but if I add anything as a $trim
, WordPress redirects to a 404 which leads me to believe that my regex isn't being matched at all.
My taxonomy is non-hierarchical.
Any help would be appreciated, thank you.
(Revised answer)
The first parameter passed to add_rewrite_rule()
(which is the regular expression pattern) should not start with home_url()
or any functions which outputs the website URL. So this is wrong:
home_url() . '/car/([^/]*)/([^/]*)/?'
because the generated regular expression (RegEx) pattern would be:
http://example/car/([^/]*)/([^/]*)/?
which will never be matched, because the request (see WP::$request
) never starts with the website URL. And it doesn't even start with /
.
Is the &model=$matches[1]
part a typo?
index.php?taxonomy=car&term=$matches[1]&model=$matches[1]&trim=$matches[2]
The home_url() . '/car/([^/]*)/([^/]*)/?'
should be (no trailing /
at the start):
'^car/([^/]*)/([^/]*)/?'
The index.php?taxonomy=car&term=$matches[1]&model=$matches[1]&trim=$matches[2]
should probably be without the &model=$matches[1]
:
index.php?taxonomy=car&term=$matches[1]&trim=$matches[2]
However, even with that &model=$matches[1]
, the rule actually worked in my case.
And not sure if you've already added this somewhere in your code, but I'd add it so that I could get the value of the "trim" parameter in the URL:
add_rewrite_tag( '%trim%', '([^/]+)' );
You'd add that before/after the add_rewrite_rule()
line, and to get the "trim" value, you could use get_query_var( 'trim' )
.