Как в WordPress красиво передать параметры пользовательскому шаблону (custom template) в адресной строке (т.е. методом GET)?

Wordpress, Вопросы и ответы
15 февраля 2012

Вопрос

Предположим, я создал свой собственный шаблон страницы под названием «films.php». Я хочу передавать в него параметры через URL. У меня получилось сделать это так: http://www.yoursite.com/?page_id=4&genre=vestern&country=usa

А если задать постоянные ссылки в «/%postname%», то можно ещё и так: http://www.yoursite.com/films?country=vestern&country=usa

Но мне такой вариант кажется не очень красивым и не очень ЧПУ-шным. Я бы хотел передать параметры вот-так: http://www.yoursite.com/films/vestern/usa
Как такое реализовать на WordPress?


Ответ №1

Добавьте в «function.php» следующий код:

add_action('init', 'rewrite_rules');  
function rewrite_rules(){
    add_rewrite_tag('%genre%','([^&]+)'); // Регистрируем параметр genre
    add_rewrite_tag('%country%','([^&]+)'); // // Регистрируем параметр country
    add_rewrite_rule('^films/([^/]*)/([^/]*)/?$','index.php?pagename=films&genre=$matches[1]&country=$matches[2]','top'); // Добавляем новое правило, 3-й параметр top говорит о том, что правило необходимо проверять первым.
}

Здесь мы с помощью регулярного выражения создали новое правило, которое мы поставили в соответствие с запросом адресной строки. Теперь если WordPress встретит в URL имя нашей страницы «films», а после неё будет идти косая черта и какая-то строка, то эта строка будет восприниматься как параметр «genre», а за следующей косой чертой будет «country». Доступ в нашем шаблоне к этим параметрам можно будет получить не через массив $_GET, а с помощью другого, специального массива $wp_query, содержащего параметры адресной строки.

Как работать с параметрами в шаблоне:

<php
// Template Name: My template name
if (isset($wp_query->query_vars['genre'])&&isset($wp_query->query_vars['country'])) { // Если оба параметра заданы
$genre = urldecode($wp_query->query_vars['genre']);
$country = urldecode($wp_query->query_vars['country']);
echo 'Жанр: ' . $genre . '<br>';
echo 'Страна: ' . $country;
}
?>

Возможно, после добавления этого кода потребуется зайти в меню настроек «Постоянные ссылки» и пересохранить их (просто нажать кнопку «Сохранить изменения»), чтобы начали действовать новые правила. Вот так.

3 комментария

  • burateen:

    Добрый день

    Вы можете подсказать, как сделать также, только для для произвольных полей.

    Например, http://www.example.com/meta_key/

    И на страницы выведутся все посты с произвольным полем равным запросу

  • Сергей:

    Поддерживаю вопрос…тоже не получается сделать для произвольных полей

  • Scrandre:

    Спасибо за полезную инструкцию.

    P.S. На первой строке последнего блока кода ошибка («<?php", не "<php").

Добавить комментарий


(обязательно)