Как создать собственные маршруты URL?

50

У меня есть очень специфическое требование, надеюсь, я могу объяснить это, не слишком запутываясь. Я создал шаблон страницы, где я перечисляю некоторые свойства, которые я получаю из внешнего XML-файла, но пока проблем нет, скажем, URL-адрес выглядит так:

http://www.example.com/properties/

Каждое свойство имеет ссылку, которая должна перенаправлять пользователя на страницу «Одно свойство», на которой отображается дополнительная информация о нем. Мне было интересно, если есть способ сделать ссылку, как это:

http://www.example.com/properties/123

Где 123будет идентификатор собственности. Так что, если у меня есть URL-адрес, как properties/some_idя хочу иметь возможность загружать файл представления (например, single.phpили page.phpфайлы), но специфичные для этого условия URL.

Это возможно?

Хавьер Вильянуэва
источник

Ответы:

58

Добавьте это в functions.php вашей темы или вставьте в плагин .

add_action( 'init', 'wpse26388_rewrites_init' );
function wpse26388_rewrites_init(){
    add_rewrite_rule(
        'properties/([0-9]+)/?$',
        'index.php?pagename=properties&property_id=$matches[1]',
        'top' );
}

add_filter( 'query_vars', 'wpse26388_query_vars' );
function wpse26388_query_vars( $query_vars ){
    $query_vars[] = 'property_id';
    return $query_vars;
}

Это добавляет правило перезаписи, которое направляет запросы /properties/с любой комбинацией чисел, следующих за pagename properties, с установленным запросом var property_id. Обязательно зайдите на страницу настроек ваших постоянных ссылок и сохраните, чтобы сбросить правила перезаписи, так что это новое правило будет включено.

В вашем page-properties.phpшаблоне get_query_var('property_id')будет возвращен идентификатор свойства, если он был установлен, если нет, то отобразите страницу свойств по умолчанию.

Milo
источник
4
Это было ЗАКРЫТО на работу для меня, но мне нужно было добавить: add_filter ('init', 'flushRules'); function flushRules () {global $ wp_rewrite; $ wp_rewrite-> flush_rules (); }
tooshel
19
@tooshel Вы определенно не хотите сбрасывать правила при каждом запросе, это дорогостоящая операция, которая замедлит ваш сайт для сканирования. Вам нужно сбросить правила только один раз, при активации плагина или просто посетив страницу настроек постоянных ссылок.
Майло
Да, я понял. , , но когда вы тестируете, хорошо, что он там!
Tooshel
3
Умнее переписать URL может быть регулярное выражение ^properties/([0-9]+)/?. В противном случае это будет соответствовать что-то вродеexample/properties/1
Райан Тейлор
@RyanTaylor ты уверен в этом? это не захватывает, example/properties/1когда я проверяю это.
Майло
9

Еще один способ сделать это:

add_action('init', function() {
    add_rewrite_rule( '^properties/([0-9]+)/?',
                      'index.php?pagename=properties&property_id=$matches[1]',
                      'top' );
}, 10, 0);

add_action('init', function() {
    add_rewrite_tag( '%property_id%', '([^&]+)' );
}, 10, 0);

API Codex Rewrite / добавить правило перезаписи

API Codex Rewrite / добавить тег перезаписи

Кристиан Лескуйер
источник
2
Принятый ответ работает с 4.7 (и 4.8), не уверен, почему вы думаете, что это не так. Ваш код, по сути, делает то же самое, add_rewrite_tagдобавляет запрос var в тот же массив, что и query_varsфильтр.
Майло
@ Мило, вероятно, у меня не получилось, но у меня больше нет 4,7, поэтому я не могу проверить. Я отредактирую свой ответ.
Кристиан Лескиер
@Milo Хотя я лично предпочитаю переписывать теги, но все же проверил принятый ответ, и он работает. Просто личные вкусы.
Джек Йоханссон
1
@JackJohansson теги перезаписи необходимы, когда вы используете его в permastruct . Это просто лишняя часть данных, которую WordPress никогда не использует в этом случае.
Майло
оба правила могут быть добавлены к одному и тому же методу, в результате чего появится более понятная и полезная функция, к которой можно вернуться и выяснить, выполняете ли работы по техническому обслуживанию
eballeste