Таксономии, термины и файлы шаблонов

10 апр. 2011 г., 22:57:22
Просмотры: 4.02K
Голосов: 7

У меня есть тип записи 'product' и иерархическая таксономия 'types', привязанная к нему. В этой таксономии есть термины: 'dry-clean', 'washer' и другие, с несколькими дочерними терминами для каждого.

В моей ситуации мне нужно отображать:

  1. http://example.com/types/washer -> отображать все дочерние термины
  2. http://example.com/types/washer/{subterm} -> отображать все записи

Мои вопросы:

  1. Как получить постоянную ссылку для родительских терминов? Я пробую URL выше, но получаю 404 ошибку.
  2. Как работают файлы шаблонов для такого случая?
    1. Достаточно ли taxonomy-types-washer.php для случая #1? Или нужно создать taxonomy-types.php и реализовать логику там?
    2. Изучив иерархию шаблонов, я предполагаю, что мне может понадобиться taxonomy-types-{term_parent}.php для списка дочерних терминов и taxonomy-types.php для списка продуктов в дочерних терминах.
    3. В конечном итоге, для отображения каждого продукта мне нужно будет создать single-product.php
  3. Слегка не связанная проблема: я обнаружил, что 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]
3
Комментарии

Я знаю, что это можно сделать http://wordpress.stackexchange.com/questions/5308/custom-post-types-taxonomies-and-permalinks/5313#5313, но для "неиерархических" таксономий.

Bainternet Bainternet
11 апр. 2011 г. 02:09:29

Тебе следует создать новый вопрос по пункту 3.

scribu scribu
11 апр. 2011 г. 03:09:45

@scribu, я создам этот вопрос сегодня вечером, когда вернусь домой.

ariefbayu ariefbayu
11 апр. 2011 г. 12:14:13
Все ответы на вопрос 1
0

Данные типы 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 и т.д.
}
11 апр. 2011 г. 03:09:10