Принципиальное отличие заключается в следующем:
add_rewrite_rule()
Добавляет особое правило , которое интерпретируется
add_rewrite_tag()
Добавляет заполнитель для использования в URL - адрес структур. Этот заполнитель затем используется для создания нескольких правил.
Например, предположим, вы являетесь турагентом, рекламирующим отели в разных странах. Вы можете захотеть, чтобы URL отеля был похож
www.example.com/hotels/UK/Balmoral
Где страна (в данном примере Великобритания) - это пользовательский термин таксономии, а Balmoral - отель (почтовый тип). Мы могли бы добавить правила перезаписи для этого, но тогда мы должны были бы сгенерировать правило для:
- Сам отель
- вложения отеля
- Правило для отелей (постов), где оно простирается на несколько страниц и т. Д.
Генерация этих правил может стать сложной. Кроме того, мы, вероятно, будем конкурировать с собственными правилами WordPress для этого типа записей - сгенерированными из permastructure, который мы установили при регистрации типа записей . (В любом случае, пусть WordPress сделает всю работу).
Эта «permastructure» - аналогично тому, что вы устанавливаете для сообщений в настройках постоянной ссылки - определяет правила перезаписи, которые генерирует 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()
(то, что вы не делаете со стандартным правилом перезаписи).
Вы также можете создавать теги для использования в permastructure постов (установите это на странице настроек Permalink).
Добавив тег, мы можем использовать его в permastructures. Тогда WordPress знает
- Что ожидать
- Как интерпретировать URL (проверьте, совпадает ли)
- Как интерпретировать значение (например, «Великобритания»)
(В качестве ссылки см. Эту статью, которую я написал: http://wp.tutsplus.com/tutorials/creative-coding/the-rewrite-api-the-basics/ ).
редактировать
Как отмечено в комментариях приведенный выше пример плохой, как register_taxonomy()
на самом деле звонки add_rewrite_tag()
.
Относительно документации Кодекса об их использовании «в комбинации»: это, возможно, вводит в заблуждение, поскольку они могут использоваться независимо друг от друга. Как отмечалось выше, однако, add_rewrite_tag()
добавляет имя тега к понимаемым WordPress «переменным запроса». На практике это позволяет вам получить значение с помощью get_query_var()
. Таким образом, когда add_rewrite_rule()
используется с add_rewrite_tag()
, переменная будет сохранена WordPress. Но есть и другие способы сделать это (см. Этот ответ - обратите внимание также на комментарий Роба Вермеера).
Также связано: Как извлечь переменные $ _GET из переписанных URL-адресов?
add_rewrite_tag()
ее можно использовать для создания заполнителейSettings->Permalinks
. Об использовании таксономии, это требование для использованияadd_rewrite_tag()
? Мое впечатление от странице Кодекса у что это не так, но кажется, что это широко используется. Я расширил свой вопрос относительно использованияadd_rewrite_tag()
в сочетании сadd_rewrite_rule()
предложением на странице Кодекса .register_taxonomy()
. Лучшим примером будет случай, когда вы хотите использовать что-то вроде,%country%
но когда страна - это просто общая переменная запроса, а не таксономия. Эти случаи редки - мне никогда не приходилось использоватьadd_rewrite_tag()
.