Принципова різниця:
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 .