Когда следует использовать add_rewrite_tag ()?

22

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

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

редактировать: на его странице Кодекса говорится об «общем» использовании его вместе с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 для этого типа записей - сгенерированными из 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()предложением на странице Кодекса .
seron
Вы абсолютно правы насчет таксономий (плохой пример с моей стороны). Смотрите эту часть register_taxonomy(). Лучшим примером будет случай, когда вы хотите использовать что-то вроде, %country%но когда страна - это просто общая переменная запроса, а не таксономия. Эти случаи редки - мне никогда не приходилось использовать add_rewrite_tag().
Стивен Харрис