Таксономии, термины и файлы шаблонов
У меня есть тип записи 'product' и иерархическая таксономия 'types', привязанная к нему. В этой таксономии есть термины: 'dry-clean', 'washer' и другие, с несколькими дочерними терминами для каждого.
В моей ситуации мне нужно отображать:
- http://example.com/types/washer -> отображать все дочерние термины
- http://example.com/types/washer/{subterm} -> отображать все записи
Мои вопросы:
- Как получить постоянную ссылку для родительских терминов? Я пробую URL выше, но получаю 404 ошибку.
- Как работают файлы шаблонов для такого случая?
- Достаточно ли
taxonomy-types-washer.php
для случая #1? Или нужно создатьtaxonomy-types.php
и реализовать логику там? - Изучив иерархию шаблонов, я предполагаю, что мне может понадобиться
taxonomy-types-{term_parent}.php
для списка дочерних терминов иtaxonomy-types.php
для списка продуктов в дочерних терминах. - В конечном итоге, для отображения каждого продукта мне нужно будет создать
single-product.php
- Достаточно ли
- Слегка не связанная проблема: я обнаружил, что
archive-{posttype}.php
не работает, когда нет записей. Есть ли решение для этого? (следует ли создать отдельный вопрос или оставить в этом?)
ОБНОВЛЕНИЕ
Я проверил опцию rewrite_rules
и обнаружил, что там нет записи для [types]. Не знаю почему. Для теста я изменил ярлык на product-types
, сбросил постоянные ссылки, и теперь там есть:
[product-types/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?types=$matches[1]&feed=$matches[2]
[product-types/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?types=$matches[1]&feed=$matches[2]
[product-types/([^/]+)/page/?([0-9]{1,})/?$] => index.php?types=$matches[1]&paged=$matches[2]
[product-types/([^/]+)/?$] => index.php?types=$matches[1]
Кажется, теперь она зарегистрирована. Но при попытке загрузить URL product-types/washer
я получаю 404. Также при загрузке index.php?types=washer
- тоже 404. Сейчас у меня есть файлы:
- taxonomy-types-washer.php
- taxonomy-types.php
Не понимаю, в чем проблема.
ОБНОВЛЕНИЕ #2
Я нашел проблему. Оказывается, я пропустил 'rewrite'=>array('hierarchical'=>true)
Новые правила перезаписи:
[product-types/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?types=$matches[1]&feed=$matches[2]
[product-types/(.+?)/(feed|rdf|rss|rss2|atom)/?$] => index.php?types=$matches[1]&feed=$matches[2]
[product-types/(.+?)/page/?([0-9]{1,})/?$] => index.php?types=$matches[1]&paged=$matches[2]
[product-types/(.+?)/?$] => index.php?types=$matches[1]
Данные типы URL поддерживаются начиная с WordPress 3.1:
register_taxonomy( 'types', 'post', array(
'hierarchical' => true,
'rewrite' => array( 'hierarchical' => true ),
...
);
Не забудьте сбросить правила перезаписи после внесения изменений.
Шаблон, который вы будете использовать как для родительских, так и для дочерних терминов - это taxonomy-types.php:
$current_term = get_queried_object();
if ( 0 == $current_term->parent ) {
// это родительский термин; выводим его дочерние термины с помощью wp_list_categories() и т.д.
} else {
// это дочерний термин; выводим записи с помощью The Loop и т.д.
}
