Пользовательская страница с переменными в URL. Красивый URL с add_rewrite_rule
Использую WP3.1
У меня есть пользовательская страница с WP_Query, которая получает динамические переменные из URL. Мне нужны безопасные переменные и чистые URL.
Пример:
carpage/?carmodel=honda&location=finland
Преобразовать в:
carpage/honda/finland/
Я добавил add_rewrite_rule в functions.php, и это работает, но не уверен, безопасно ли так делать.
Functions.php
function fcars() {
// Добавляем правило перезаписи URL
add_rewrite_rule('carpage/[/]?([a-zA-Z-]*)[/]?([a-zA-Z-]*)$', 'index.php?pagename=carpage&var1=$matches[1]&var2=$matches[2]');
// Регистрируем теги перезаписи
add_rewrite_tag('%var1%', '[a-zA-Z]+');
add_rewrite_tag('%var2%', '[a-zA-Z]+');
}
// Хук для инициализации
add_action('init', 'fcars');
А в пользовательском шаблоне я получаю переменные:
Может кто-нибудь помочь с этим? Как сделать это безопасным и правильным способом в WP3.1?
Как правильно создать add_rewrite_rule для случая:
carpage/honda/finland/
(только дефисы и маленькие буквы в URL) carpage - это статическая страница шаблона.

Я думаю, что add_rewrite_tag()
не нужен, и его можно заменить добавлением переменных напрямую в публичные query vars:
// Либо напрямую (в хуке init):
$wp->add_query_var( 'var1' );
$wp->add_query_var( 'var2' );
// Или через фильтр:
add_filter( 'query_vars', 'wpse12965_query_vars' );
function wpse12965_query_vars( $query_vars )
{
$query_vars[] = 'var1';
$query_vars[] = 'var2';
return $query_vars;
}
Также, сейчас вы разрешаете одну или две косые черты в начале, но ни одной в конце. Думаю, вам нужно переместить /?
в конец регулярного выражения. Часть [a-zA-Z-]
для слага иногда записывается как [^/]
(всё, кроме косой черты), но в данном случае это, вероятно, не имеет значения.
Я бы написал правило перезаписи так:
add_action( 'init', 'wpse12065_init' );
function wpse12065_init()
{
add_rewrite_rule(
'carpage(/([^/]+))?(/([^/]+))?/?',
'index.php?pagename=carpage&var1=$matches[2]&var2=$matches[4]',
'top'
);
}
Конструкция (/([^/]+))?
делает всю группу опциональной, так что /carpage
, /carpage/honda
и /carpage/honda/finland
должны работать, с опциональной косой чертой в конце. Поскольку нам нужна дополнительная группа для /
, переменные находятся в следующей группе захвата, поэтому то, что было $matches[1]
, становится $matches[2]
, а $matches[2]
становится $matches[4]
.
Если вы хотите отладить свои правила перезаписи, я рекомендую мой плагин Rewrite analyzer, который позволяет экспериментировать с URL и видеть результирующие query variables.
