Коли слід використовувати add_rewrite_tag ()?


22

Я провів кілька днів, намагаючись навчитися найкраще додавати правила переписування. Поки я розумію, що підходящим способом додавання простих правил є використання add_rewrite_rules(), з великою вдячністю завдяки Яну Фабрі на цьому обміні, який розробив велику користь.

Хоча він зазначає, що add_rewrite_tags()я не бачив в ньому посібника, що пояснює, коли це вигідно використовувати, на відміну від інших способів додавання правил перезапису чи будь-яких хороших прикладів його використання. Здається, це більш потужний інструмент, але це приблизно все, що я можу зрозуміти. Я вважаю, що приклади в Кодексі є занадто виразними або неповними . Може хтось детальніше розробив це або вказав на якийсь ресурс? Я не знайшов нічого корисного в Google.

редагувати: його сторінка Codex розповідає про "в основному", використовуючи її спільно зadd_rewrite_rules(), але не є детальною. Аналогічним чином сторінки Кодексу дляadd_rewrite_rules()відноситься доadd_rewrite_tags()але це теж дуже мізерна інформації. Коли і як застосовуватиметься таке поєднання? Єдиний приклад, який я знайшов, - це відповідь Роб Вермер, яку я не розумію.

Відповіді:


21

Принципова різниця:

  • add_rewrite_rule()Додає особливу правило , яке інтерпретується
  • add_rewrite_tag()Додає заповнювач для використання в URL - адреса структур. Потім цей заповнювач використовується для створення декількох правил.

Наприклад, припустимо, що ви туристичний агент, що рекламує готелі в різних країнах. Можливо, ви хочете, щоб URL-адреса готелю була такою

  www.example.com/hotels/UK/Balmoral

Якщо країна (Великобританія в цьому прикладі) - це власний термін таксомонії, а Balmoral - готель (пошта). Ми можемо додати для цього правила перезапису, але тоді нам доведеться створити правило для:

  • сам готель
  • вкладення готелю
  • Правило для готелів (постів), де вони розбиваються на кілька сторінок тощо.

Створення цих правил може ускладнитися. Крім того, ми, мабуть, будемо конкурувати з власними правилами WordPress для цього типу публікації - згенерованими з пермаструктури, яку ми встановили під час реєстрації типу публікації. (У будь-якому випадку, дозвольте WordPress виконати роботу).

Ця "пермаструктура" - подібно до того, що ви встановлюєте для публікацій у налаштуваннях постійної посилання - визначає правила перезапису, які створює WordPress. Але оскільки ми хочемо структуру, яка містить деяку невідому (країну) - яку ми хочемо інтерпретувати - нам потрібно надати заповнювач форми %country%. (Це майже ідентично %category%для публікацій).

Наприклад:

add_action_init('init','wpse71305_register_types');

function wpse71305_register_types(){

     //You'll need to register the country taxonomy here too.

     //Add 'country' tag.
     add_rewrite_tag('%country%', '([^&/]+)'));

     //Register hotel post type with %country$ tag
    $args = array(  
        ...
        'has_archive'=>true,  
        'rewrite' => array(  
            'slug'=>'hotels/%country%',  
            'with_front'=> false,  
            'feed'=> true,  
            'pages'=> true  
        )  
        ...
    );  
    register_post_type('hotel',$args);  
}

Примітка. WordPress не знає, як генерувати URL-адресу з %country%тегу - вам потрібно сказати це зробити. (Я висвітлюю це у статті, до якої я посилався нижче).

Нарешті WordPress також збереже відповідне значення, щоб ви могли отримати його через get_query_var()(те, що вам не подобається зі стандартним правилом перезапису).

Ви також можете створити теги, які будуть використовуватися в пермаструктурі публікацій (встановіть їх на сторінці налаштувань Постійної посилання).

Додавши тег, ми можемо використовувати його в пермаструктурах. WordPress тоді знає

  • Чого очікувати
  • Як інтерпретувати URL-адресу (перевірити відповідність)
  • Як інтерпретувати значення (тобто "Великобританія")

(В якості посилання див. Цю статтю, яку я написав: http://wp.tutsplus.com/tutorials/creative-coding/the-rewrite-api-the-basics/ ).

Редагувати

Як зазначається в коментарях, наведений вище приклад є поганим, як register_taxonomy()насправді add_rewrite_tag().

Що стосується документації Codex про використання їх "у поєднанні": це, можливо, вводить в оману, оскільки вони можуть використовуватися незалежно. Як зазначалося вище, однак add_rewrite_tag()додає ім'я тегу до WordPress-розумію "змінних запитів". На практиці це дозволяє отримати значення за допомогою get_query_var(). Таким чином, при add_rewrite_rule()використанні з add_rewrite_tag(), змінна буде зберігатися WordPress. Але є й інші способи зробити це (див. Цю відповідь - зверніть увагу також на коментар Роб Вермер).

Також пов'язано: Як отримати змінні $ _GET з переписаних URL-адрес?


Дякую за це Одне, що я розумію з вашої відповіді, - це те, що add_rewrite_tag()може бути використане для того, щоб зробити заповнювачі, в яких можна використовувати Settings->Permalinks. Щодо використання систематики, це вимога до використання add_rewrite_tag()? Моє враження зі сторінки Codex таке, що це не так, але це здається загальновживаним. Я розширив своє запитання щодо використання add_rewrite_tag()спільно із add_rewrite_rule()запропонованими на сторінці Codex .
seron

Ви абсолютно праві щодо систематики (поганий приклад з мого боку). Дивіться цю частину register_taxonomy(). Кращим прикладом може бути те, коли ви хочете використовувати щось на кшталт, %country%але коли країна є просто загальною змінною запиту, а не систематикою. Ці випадки рідкісні - мені ніколи не довелося користуватися add_rewrite_tag().
Стівен Гарріс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.