Як створити власні 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-адреси.

Чи можливо це?

Відповіді:


57

Додайте це до function.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/будь-яку комбінацію чисел, що слідують за назвою сторінки properties, з property_idнабором варіантів запитів . Просто не забудьте завітати на сторінку налаштувань постійних посилань і збережіть для того, щоб виправити правила переписування, щоб це нове правило було включене.

У вашому page-properties.phpшаблоні get_query_var('property_id')повернеться ідентифікатор властивості, якщо він був встановлений, якщо його немає, то покажіть сторінку властивостей за замовчуванням.


4
Це було ЗАКРІТНО для мене, але мені потрібно було додати: add_filter ('init', 'flushRules'); функція 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 / додавання правила перезапису

API перезапису Codex / додати тег перезапису


2
Прийнята відповідь працює з 4.7 (і 4.8), не впевнений, чому ви вважаєте, що це не так. Ваш код по суті робить те ж саме, add_rewrite_tagдодає var запит до того ж масиву, що і query_varsфільтр.
Міло

@Milo це, ймовірно, не працювало для мене, але у мене вже немає 4,7 підручних, тому я не можу перевірити. Я відредагую свою відповідь.
Крістіан Лескуер

@Milo Хоча я особисто віддаю перевагу переписати тег, але все ж перевірив прийняту відповідь, і вона працює. Просто деякі особисті смаки.
Джек Йоханссон

1
@JackJohansson переписувати теги необхідні, коли ви використовуєте його в постійній інструкції . Це лише додатковий біт даних, який WordPress ніколи не використовує в цьому випадку.
Міло

обидва правила можна додати до одного методу, закінчившись чистішою та кориснішою функцією, щоб повернутися та з'ясувати, чи виконуєте роботи з технічного обслуговування
eballeste
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.