Пользовательская страница с переменными в URL. Красивый URL с add_rewrite_rule

24 мар. 2011 г., 19:11:55
Просмотры: 17.2K
Голосов: 8

Использую 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 - это статическая страница шаблона.

0
Все ответы на вопрос 1
0
16

Я думаю, что 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.

24 мар. 2011 г. 20:05:00