Руководство по созданию пользовательких таксономических категорий в WordPress

Мой перевод статьи c сайта sixrevisions.com. Статья является продолжением ранее переведенной мной статьи под названием «Руководство по созданию пользовательских типов записей в WordPress»
Странный термин таксономия или таксономическая категория не слишком распространен, но заменять я его не стал. Вообще таксономия — это классификация. Самый близкий термин, который я встречал на практике — классификатор.

В этом руководстве мы рассмотрим потрясающую возможность WordPress: пользовательскую таксономию. Она дает вам беспрецедентную власть в способах категорирования и сопоставления различного содержимого друг с другом. Хотя таксономия WordPress была представлена в версии 2.3, в версии 3.0 она была полностью переработана для разработчиков.

Недавно, мы рассмотрели создание пользовательских типов содержимого в руководстве по созданию пользовательских типов записей в WordPress, и чтобы поддержать нашу команду разработчиков сайтов и тем для WordPress 3.0, мы собираемся обсудить пользовательскую таксономию.

Что такое таксономия в WordPress?

Таксономия — это, проще говоря, способ организации данных, а в мире WordPress, таксономия — это способ классификации и разбиения на типы содержимого вашего сайта.

И несмотря на то, что вы об этом и не подозревали, вы скорее всего очень хорошо знакомы как минимум с одной встроенной таксономией WordPress: метками (тегами). Метки — это таксономия, так как записи могут быть привязаны к ним, могут быть просмотрены, организованы по меткам. Другая таксономия в WordPress — рубрики записей.

Таксономии — мощный инструмент WordPress, так как они позволяют пользователям фильтровать информацию на вашем сайте по своему усмотрению.

Пользовательская таксономия — это, как вы поняли, пользовательский способ группировать несвязанное содержимое вместе. Пользовательские таксономии могут быть применены как к пользовательским типам записей, так и к обычным записям и страницам.

Вот несколько ситуаций в которых могут пригодиться пользоватльские таксономии:

  • Годы выхода кинофильмов
  • Срочность, например высокоприоритетная, низкоприоритетная для сервисных заявок
  • Местоположения, такие как название комнаты, почтовый индекс или штат для событий

Каждая из этих таксономий может помочь организовать информацию, хранящуюся в сайте на WordPress. Если вы прочли руководство по созданию пользовательских типов записей в WordPress, тогда последний пример «события» в этом списке вам знаком.

План действий

Мы собираемся, основываясь на пользовательском типе содержимого «События», который создали в предыдущей статье создать пользовательскую таксономию под названием Местоположение. Таксономия местоположения позволит организовать наши события по месту их проведения.

Прежде, чем мы начнем, несколько пояснений.

Во-перых, в этом руководстве мы используем тему по-умолчанию «TwentyTen», которая идет в комплекте с WordPress 3. Хотя, эти действия достаточно просто могут быть перенесены на вашу собственную тему.

Также, мы предполагаем, что вы прошли руководство по созданию пользовательских типов записей в WordPress и что у вас уже есть пользовательский тип записи «событие».

Что же, после всего сказанного, давайте приступим!

Создание пользовательской таксономии

Также как и с пользовательским типом записей, WordPress позволяет очень легко создать собственную таксономию.

Давайте взглянем на код, необходимых для создания пользовательской таксономии местоположения:

add_action( 'init', 'create_locations' );
function create_locations() {
  $labels = array(
    'name' => _x( 'Locations', 'taxonomy general name' ),
    'singular_name' => _x( 'Location', 'taxonomy singular name' ),
    'search_items' =>  __( 'Search Locations' ),
    'all_items' => __( 'All Locations' ),
    'parent_item' => __( 'Parent Location' ),
    'parent_item_colon' => __( 'Parent Location:' ),
    'edit_item' => __( 'Edit Location' ),
    'update_item' => __( 'Update Location' ),
    'add_new_item' => __( 'Add New Location' ),
    'new_item_name' => __( 'New Location Name' ),
  );
 register_taxonomy('location','event',array(
    'hierarchical' => true,
    'labels' => $labels
  ));
}

Код выше должен быть помещен в файл functions.php в директории вашей темы. Функция register_taxonomy - это функция WordPress, которая создает таксономию, давайте рассмотрим переданные в нее аргументы.

'location' - это внутреннее название таксономии.

'event' - тип записей, который будет использовать таксономию. В нашем случае мы привязываем ее к нашему пользовательскому типу записей «событие». Вы можете заменить его на 'post' или 'page', если хотите применять вашу таксономию к обычным записям и страницам. Так же вы можете передать несколько значений (с помощью массива), в этом случае несколько различных типов записей смогут использовать эту таксономию.

array(...), следующий последним аргументом в register_taxonomy. Это PHP-массив настроек, который определяет нюансы работы таксономии.

Давайте пройдемся по ключам этого массива.

'hierarchical' - это ключ булева типа, определяющий будет ли таксономия иметь иерархию, то есть, будет ли таксономия иметь подкатегории или нет. Для нашего местоположения, будем использовать иерархию. Представьте, к примеру: Здание 1, Комната для совещаний A. Может быть несколько комнат для совещаний A, но так как родителем будет здание 1, мы сможем определить его более конкретно.

'labels' - это просто информация о том как информация о таксономии будет отображатсья (как определено в массиве $labels в функции create_locations).

Также заметьте, что вызов register_taxonomy  находится внутри функции create_locations. Это просто пользовательская фунция (ее можно назвать как угодно), которая вызывается при инициализация WordPress, согласно add_action( 'init', 'create_locations' ).

Вы все еще тут? Я знаю, мы прошли большой путь, но давайте продолжать двигаться и скоро всё сойдется воедино.

Добавление пользовательской таксономии к записям

Хорошо, теперь, когда мы создали таксономию местоположения, давайте зайдем административную панель WordPress и создадним несколько мест, которые мы бы могли использовать для наших событий.

Если вы взглянете под меню «события» в левой части административной панели, вы увидете ссылку под именем «Locations». Нажав на нее, в попадете на экран, где можно добавлять, редактировать или удалять местоположения из системы.

Adding Your Custom Taxonomy to Posts

Создайте следующие местаположения:

  1. Здание 1
  2. Комната для совещаний A
  3. Комната для совещаний B

Как только вы это сделаете, вы увидете новые местопложения в таблице сразу после формы Добавить местоположение).

Adding Your Custom Taxonomy to Posts

Теперь, когда у нас есть несколько местоположений, давайте добавим их к событию! Зайдите на страницу добавления события Add New Event (или редактирования существуюшего), и вы должны увидеть виджет местоположений «Locations» в правой части экрана. Этот виджет появляется так как мы создали таксономию и указали WordPress сопоставлять ее с типом записи «Событие».

Adding Your Custom Taxonomy to Posts

Отметьте Conference Room A и сохраните событие. Заметьте, что вы можете добавлять новое местоположение прямо с этой страницы, если заметили, что каких-то не хватает. Весь виджет вам знаком, так как работает точно так же, как рубрики записей. Если вы создадите неиерархичную таксономию, она будет вести себя точно как метки к записям.

Теперь, когда мы создали несколько местоположений и использовали одну из них для события, нам нужно показать место проведения каждого события в публичном разделе сайта, чтобы посетители могли их видеть. Давайте займемся этим.

Вывод информации вашей таксономии

Прежде всего мы хотели бы выводить местоположение на странице показа события.

Как вы помните в предыдущем руководстве по пользовательском типам записей, мы создали файл single-event.php в папке нашей темы, который использовался для показа одного события. Если вы создаете таксономию для встроенного типа содержимого (например записей или страниц), вы можете проделать те же самые операции, но в файле single.php.

Когда мы просматривали событие, оно выглядело примерно так:

Displaying Your Taxonomy Information

Мы можем добавить местоположения (или несколько) к записи используя функцию WordPress get_the_term_list, которая выглядит так:

get_the_term_list( $id, $taxonomy, $before, $sep, $after )

Вот краткое описание аргументов get_the_term_list:

  1. $id – ID события, для которого извлекается таксономия
  2. $taxonomy – какая извлекатся таксономия ('tag', 'location', и тд.)
  3. $before – HTML-код, который нужно вывести перед списком
  4. $sep – код, который отделяет элементы списка друг от друга
  5. $after – HTML-код, который нужно вывести после списка

Мы можем использовать функцию get_the_term_list для отображения всех местоположений, привязанных к событию, используя такой код:

<?php echo get_the_term_list( get_the_ID(), 'location', "Location: " ) ?>

Он заставляет WordPress вывести местоположения события с текущим ID (get_the_ID()), предворяя список словом, "Location: ".

Не будем утруждать себя заданием разделителя, так как разделитель по-умолчанию (запятая) отлично подходит. Вы можете использовать другой разделитель, например «–» или «|».

Также стоит отметить, что каждое, выводимое местоположение будет автоматически оформлено в виде ссылки на стараницу, которая покажет все записи, привязанные к тому же местоположению (Мы поговорим о том, как настроить эту страницу чуть позже).

Чтобы добавить список местоположений в наш файл single-event.php, нужно стоки:

<div class="entry-meta">
<?php twentyten_posted_on(); ?>
</div><!-- .entry-meta -->
</pre>

Заменить на следующие:

<div class="entry-meta">
<?php twentyten_posted_on(); ?>
</div><!-- .entry-meta -->
<div class="entry-meta">
<?php echo get_the_term_list( get_the_ID(), 'location', "Location: " ) ?>
</div><!-- .entry-meta -->

Теперь, если мы обновим страницу в браузере, то увидем местоположения назначенные текущему событию:

Filtering Posts by Custom Taxonomy

Фильтрация записей по пользовательской таксономии

Теперь, когда мы настроили отображение местоположений на странице событий, мы должны шаблон страницы показа всех событий для заданного местоположения.

Как было замечено выше ссылка «Комната для совещаний A» автоматически ведет нас на страницу, которая отображает все записи с заданным местоположением (которая очень полезна, когда вы хотите выяснить, какие еще события будут проводиться в «Комнате для совещаний A» ).

Но так мы привязали нашу таксономию к пользовательскому типу записей, нам придется немнго испачкать руки, внося некоторые изменения.

Если проследовать по ссылке, мы увидем следующее:

Filtering Posts by Custom Taxonomy

Чтобы понять что происходит, нужно знать кое-что о иерархии шаблонов WordPress. Каждый раз когда в WordPress открывается страница, он ищет в папке вашей темы правильный шаблон для применения, основываясь на установленных правилах именования. Когда пользователь запрашивает страницу таксономии, WordPress ищет имена файлов в следующем порядке: taxonomy-[ваш код таксономии].php > taxonomy-taxonomy.php > taxonomy.php > archive.php > index.php.

Это значит, что следуя слева направо, WordPress применит первый файл, который найдет. В теме TwentyTen, первый файл, который подходит — archive.php, так как первые три файла не существуют. Это объясняет, почему мы видим заголовок «Архив блога» на этой странице.

Чтобы показывать наши местоположения мы добавим файл с названием taxonomy-location.php.

Так как он выше в иерархии шаблонов (в примере он называется taxonomy-[ваш код таксономии].php), WordPress использует его вместо archive.php, когда пользователь будет просматривать страницу местоположения.

Что же, начнем с создания файла taxonomy-location.php в папке темы и копирования содержимого файла tag.php в него, чтобы нам было от чего отталкиваться.

Прежде всего нам нужно получить местоположение, которое мы просматриваем («Комната для совещаний A»).

В терминологии WordPress это называется экземпляр (term) текущей таксономии. Для того чтобы получить экземпляры таксономии записи типа событие, добавьте следующую строку сразу после get_header().

<?php $term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) ); ?>

Все параметры экземпляра (ID, имя, и т.д. ) будут записаны в переменную $term, так что теперь мы сможем вывести их когда захотим.

Мы собираемся показывать имя экземпляра в верху страницы, так что заменим тег заголовка своим, предназначенным для показа места .

Замените следующий блок кода:

<h1 class="page-title"><?php
printf( __( 'Tag Archives: %s', 'twentyten' ), '<span>' . single_tag_title( '', false ) . '</span>' );
?></h1>

на такой:

<h1 class="page-title"><?php
printf( __( 'Events in Location: %s', 'twentyten' ), '<span>' . $term->name . '</span>' );
?></h1>

Теперь, при нажатии на ссылку «Комната для совещаний A» на странице события мы можем увидеть искомое местоположение. Но на этой странице все еще нет событий.

Чтобы исправить это, нам придется заменить обычный цикл WordPress, чтобы вручную найти события, а не записи в блоге.

Стразу после строки, которую вы добавили, добавьте также слудющую строчку, чтобы сделать пользовтельский запрос в WordPress:

 <?php query_posts(array( 'post_type'=>'event', 'location'=>$term->slug)); ?>

query_posts переопределит обычный цикл WordPress и заменит результакты, на соответствующие всем события в заданном местоположении.

Из-за шибки в WordPress (в настоящий момент), будут возвращены other post types that are at the current location will also be returned. This is not a problem for us right now, but is something to keep in mind in the future as you work with custom taxonomies.

Как только мы добавим вызов query_post , вот что мы увидем:

Теперь, как видите, мы показываем список всех событий в комнате для совещаний A (у нас только одно), отлично!

Если вы обратили внимание, когда мы создаем местположение, мы можем указать необязательно описание. Как его вывести в шаблон? Это очень просто. Просто добавьте такую строчку сразу после закрывающего тега h1 в файле taxonomy-location.php.

 <strong>Description:</strong><?php echo term_description( '', get_query_var( 'taxonomy' ) ); ?>

Тепреь наша станица будет выглядеть так:

Это то что нужно! Теперь мы показываем нашу пользовательскую таксономию на собственной старнице событий и список всех событий в заданном месте.

Итоги

Я надеюсь, что после прочтения этого руководства, вы прекрасно знаете как настраивать ваши собственные таксономии WordPress. Вот, вкратце, что мы сделали:

  1. Создаем пользовательскую таксономию (местоположение)
  2. Привязываем местоположение к записям (в данном случае, к пользовтельскому типу записей «События»)
  3. Отображаем пользовательскую таксономию в записях
  4. Фильтуем и покаываем записи в соответствии с пользовательской таксономией
  5. Создаем шаблон станицы показа для нашей пользовательской таксономии

С помощью новых пользовательских типов записей и улучшеном механизме пользовательских таксономий в WordPress 3, воистину нет границ в создании содержимого.

Как бы вы использовали этот новый функционал?

  • Тимур

    да, таксономия в wordpress это что-то ацкое

    • doctor-lg

      Да не, клевая штука. Но работа с ней какая-то надуманная

  • Автору огромное спасибо. И низкий поклон если Вы есть первоисточник этой статьи... Уже неделю пытался это сделать сам изучая кодекс по WP 3.0 и тут на тебе такой бонус))) Очень понятно и детально расписано, даже дилетант, мне кажется, поймёт.

    Хотелось бы с Вами (автор doctor-lg) лично пообщаться. Если не трудно свяжитесь со мной по ICQ 499637751 или [В]контакте kalbac.vkontakte.ru

  • Здравствуйте,

    У меня вот такой вопрос: как  перевести текст внутри

    get_the_term_list ( get_the_ID (),  'location',  "Location: " ) ? Т.е. если изменить location на _e (location), то выводиться: «_e (location)»Я же хочу, чтобы выводилось: «Расположение»