200x200

Введение в пользовательскую таксономию WordPress 3.0

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

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

Таксономии – это различные методы для классификации информации. В этой статье приведен пример записей о персональных компьютерах, которые можно классифицировать по целому ряду различных критериев, включая:

  • Количество оперативной памяти
  • Размер жесткого диска
  • Скорость процессора
  • Тип процессора
  • Установленная операционная система
  • и так далее…

Краткая история таксономии WordPress

Рубрики

До версии 2.3, в WordPress был только один тип таксономии для записей, под названием Рубрики. Это было удобно для блогов, а в нашем случае, нам пришлось бы создать рубрику верхнего уровня под названием “Персональные компьютеры”, затем дочернюю рубрику “Оперативная память”, которая, в свою очередь, может содержать такие дочерние рубрики как “Меньше 1Гб”, “1Гб”, “2Гб”, “4Гб” и так далее. Вторая дочерняя рубрика, от основной рубрики “Персональные компьютеры”, называлась бы “Операционная система” и содержала бы такие дочерние рубрики, как: “Windows XP”, “Mac OS”, “Red Hat”, “Ubuntu” и т.д.

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

Метки

Начиная с версии 2.3, в WordPress был добавлен второй вид таксономии под названием Метки. В отличие от рубрик, которые придумываются заранее, в зависимости от типа контента на сайте, метки предоставляют более свободный метод классификации контента.

Например, при создании записи о персональном компьютере, метки позволяют автору указать одно или несколько ключевых слов, таких как “игровой”, “шумный”, “офисный” и т.д. Эти ключевые слова конечно не несут такого смысла как рубрики, однако помогают добавить дополнительную классификацию к записи.

Посетители сайта, в дальнейшем, легко смогут найти все записи с меткой “шумный”. Однако, свободная форма меток, не поможет нам построить надежную классификационную систему на основе заранее известных значений, таких как типы операционной системы или процессора. Кроме того, метки являются одномерными, и не поддерживают иерархическую структуру.

Одноуровневые пользовательские таксономии

Начиная с версии 2.8, в WordPress появляется возможность добавить пользовательские классификационные схемы, путем незначительных изменений в коде сайта. С помощью этой функции, вы можете построить список операционных систем, отдельно от списка типов оперативной памяти и т.д. Однако,  в версии 2.8 нет возможности создать иерархическую стркутуру таксономии, как у рубрик.

Иерархические пользовательские таксономии

И наконец, WordPress 3.0, дает нам полностью иерархические пользовательские таксономии. Обратите внимание как иерархическое устройство позволяет упростить таксономию операционных систем, путем группировки всех вариантов операционной системы Windows в общей родительской рубрике “Windows”. Такая классификация позволит пользователям просматривать все компьютеры с ОС Windows, или например конкретные, с Windows XP.

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

Редактирование файла functions.php

В WordPress 3.0 нет возможности создавать пользовательские таксономии в панели управления. Для начального описания вашей пользовательской таксономии без использования плагина, вам понадобится добавить немного кода в файл functions.php, расположенный в папке с вашей темой. Это совсем не сложно – просто следуйте приведенным примерам.

Добавляем Таксономии в коде

Итак, на примере персонального компьютера, мы добавим отдельные таксономии для Оперативной памяти, Жесткого диска и Операционной системы. На данном этапе, мы просто добавим таксономии сами по себе, как пустые контейнеры. К счастью, мы можем добавлять и управлять различными классификациями, не выходя из панели управления.

Шаг 1. Первая функция для создания всего

Для начала, нам нужно создать функцию, которая создает все необходимые нам таксономии. Назовем функцию “build_taxonomies”. Давайте добавим эту функцию в конец файла functions.php.

function build_taxonomies() {  
    // code will go here  
}  

Шаг 2. Описание Таксономий

Далее, для каждой таксономии, которую мы создадим, нам нужно взывать определенную WordPress-функцию, с правильными параметрами. Далее представлена эта функция, и разъяснены ее важные параметры.

register_taxonomy(  
    'internal_name',  
    'object_type',  
    array(  
        'hierarchical' => {true|false},  
        'label' => 'Human Readable Name',  
        'query_var' => {true|false},  
        'rewrite' => {true|false}  
    )  
);  
  • internal_name: название таксономии, которое будет использоваться в базе данных и файлах шаблона
  • object_type: определяет типы контента, к которым можно будет применить эту таксономию. Возможные значения: “post” (запись), “page” (страница), “link” (ссылка).
  • Далее идет массив из опциональных параметров. В этой статье, мы будем использовать наиболее важные из них, а полный список можно найти в кодексе WordPress, на странице описания функции register_taxonomy. Далее идет список используемых параметров.
  • hierarchical: если значение установлено в “true”, эта таксономия будет иметь возможности иерархической структуры, как у Рубрик. Если значение “false”, то таксономия по структуре будет похожа на Метки.
  • label:  это читаемое название, которое будет использоваться в интерфейсе сайта для обозначения этой таксономии.
  • query_var: если значение параметра установлено в “true”, мы сможем получать записи, на основе выбранного значения этой таксономии. Например, можно найти все записи, для которых в таксономии “операционная система” указано значение “Windows”.
  • rewrite: если значение установлено в “true”, при просмотре страницы с этой таксономией, WordPress будет использовать дружественные URL. Например, страница, отображающая все записи с операционной системой “Windows”, будет представлена следующим url: http://domain.com/operating_system/windows

Код, добавляющий таксономию “Операционная система” выглядит следующим образом:

register_taxonomy( 'operating_system', 'post', array( 'hierarchical' => true, 'label' => 'Operating System', 'query_var' => true, 'rewrite' => true ) );  

Вставьте эту функцию, внутри ранее созданной функции build_taxonomies.

Шаг 3 Вызов функции, создающей таксономию

Для того, чтобы наша функция build_taxonomies была выполнена, нам понадобится добавить одну строчку кода, в файле functions.php. Фактически мы “прицепим” функцию build_taxonomies к событию init, путем добавления следующего кода:

add_action( 'init', 'build_taxonomies', 0 ); 

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

// Custom Taxonomy Code  
add_action( 'init', 'build_taxonomies', 0 );  
  
function build_taxonomies() {  
    register_taxonomy( 'operating_system', 'post', array( 'hierarchical' => true, 'label' => 'Operating System', 'query_var' => true, 'rewrite' => true ) );  
}  

Добавляем классификацию к новой Таксономии

Если вы правильно добавили таксономию “Операционная система” в файле functions.php, она должна появится в виде нового пункта, в блоке “Записи”, вашей панели управления. Кликните по нему, чтобы добавить необходимые классификации.

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

Добавляем больше Таксономий

Оставшиеся таксономии добавляем аналогичным способом, то есть для каждой таксономии в файле functions.php, создается своя функция register_taxonomy:

register_taxonomy( 'ram', 'post', array( 'hierarchical' => true, 'label' => 'RAM', 'query_var' => true, 'rewrite' => true ) );
  
register_taxonomy( 'hard_drive', 'post', array( 'hierarchical' => true, 'label' => 'Hard Drive', 'query_var' => true, 'rewrite' => true ) );

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

// Custom Taxonomy Code  
add_action( 'init', 'build_taxonomies', 0 );  
  
function build_taxonomies() {  
register_taxonomy( 'operating_system', 'post', array( 'hierarchical' => true, 'label' => 'Operating System', 'query_var' => true, 'rewrite' => true ) );  
register_taxonomy( 'ram', 'post', array( 'hierarchical' => true, 'label' => 'RAM', 'query_var' => true, 'rewrite' => true ) );  
register_taxonomy( 'hard_drive', 'post', array( 'hierarchical' => true, 'label' => 'Hard Drive', 'query_var' => true, 'rewrite' => true ) );  
}  

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

Создайте несколько записей, указав необходимую классификацию, в окне создания/редактирования записей, вы увидите панели вашей таксономии.

Отображение различной таксономии записей

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

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

Вывод таксономии на индивидуальной странице

В дефолтной теме Twenty Ten, как и во многих других темах WordPress, данные о рубрике и метках записи, выводятся непосредственно под текстом этой записи. Мы будем выводить нашу таксономию, если она существует, чуть выше блока рубрик с метками.

Шаг 1. Редактирование файла single.php

Шаблон индивидуальной записи называется single.php, и расположен он внутри папки с вашей темой. Если такого шаблона у вас нет, его можно создать, и скопировать в него содержимое файла index.php.

Найдите в шаблоне single.php строчку:

<div class="entry-utility"> 

В теме Twenty Ten, этот блок содержит название рубрик, метки, ссылки  и другую информацию о текущей записи. Код для вывода нашей таксономии, мы будем размещать непосредственно над этим блоком.

Шаг 2. Получение таксономии для текущей записи

Здесь мы определяем несколько переменных, для хранения вывода пользовательской таксономии.

<?php  
// Эта переменная используется для вывода таксономии, если она существует
$taxo_text = "";  
  
// Список переменных, для хранения списков таксономии
// Эта строка получает данные о классификации "Операционная система"
$os_list = get_the_term_list( $post->ID, 'operating_system', '<strong>Operating System(s):</strong> ', ', ', '' );  

Для получения информации о таксономии текущей записи, мы используем функцию get_the_term, со следующими параметрами:

  • $post->ID : id текущей записи
  • ‘operation_system’ : имя пользовательской таксономии. Мы проверяем, была ли назначена текущей записи, какая-либо классификация из пользовательской таксономии operation_system.
  • ‘Операционная система (ы)’ : если данные будут найдены, эта строчка будет вставлена, перед их выводом на экран.
  • ‘, ’ :  если найденных значений будет несколько, то они будут разделены запятой
  • : если данные будут найдены, эта строка будет вставлена после вывода данных. В нашем случае, мы оставляем ее пустой.

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

$ram_list = get_the_term_list( $post->ID, 'ram', '<strong>RAM Option(s):</strong> ', ', ', '' );  
$hd_list = get_the_term_list( $post->ID, 'hard_drive', '<strong>Hard Drive Option(s):</strong> ', ', ', '' );  

Шаг 3. Форматирование полученного результата

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

// Добавляем список ОС, если они указаны
if ( '' != $os_list ) {  
    $taxo_text .= "$os_list<br />\n";  
}  
// Добавляем данные об Оперативной памяти, если они указаны
if ( '' != $ram_list ) {  
    $taxo_text .= "$ram_list<br />\n";  
}  
// Добавляем данные о жестком диске, если они указаны
if ( '' != $hd_list ) {  
    $taxo_text .= "$hd_list<br />\n";  
}  

Шаг 4. Выводим классификацию, если она найдена

Проверяем, была ли получена таксономия из предыдущих шагов. Если таксономия существует, выводим ее, предварительно обернув в div с классом “entry-utility”.

// Выводим пользовательскую таксономию, если она существует 
// Обратите внимание: Мы не будет открывать div, если у него не будет содержимого
if ( '' != $taxo_text ) {  
?>  
<div class="entry-utility">  
<?php  
echo $taxo_text;  
?>  
</div>  
<?  
} // endif  
?>  

Шаг 5. Проверяем результаты

Теперь, если открыть страницу любой записи, вы должны увидеть пользовательскую классификацию, расположенную сразу после текста записи.

Просмотр списка записей, построенный на основе пользовательской таксономии

Теперь, на странице индивидуальной записи, мы можем узнать к какой классификации принадлежит текущая запись. Вы, наверное, заметили, что при отображении пользовательской классификации, термины выводятся в виде ссылки, которая должна вести на страницу с записями, принадлежащими к этой классификации. К примеру, кликнув по ссылке “Mac OS”, мы по идее, должны увидеть страницу со списком записей, с классификацией “Mac OS”.

Однако, ничего такого не происходит. Для того, чтобы у нас выводилась такая страница, нам нужно создать специальный шаблонный файл, с именем taxonomy.php. WordPress пытается грузить этот шаблон (если он существует) каждый раз, при просмотре записей, группированных пользовательской таксономией.

Шаг 1

Откройте файл category.php, скопируйте его контент, и вставьте в новый файл, сохранив его под именем “taxonomy.php”.

Шаг 2 Получение информации о текущей классификации

В файле taxonomy.php, нам необходимо получить информацию о текущей, просматриваемой таксономии. Скорее всего, нам понадобится название и описание (если есть) для выбранной классификации.

Сразу после строки <?php get_header(); ?> следующую строку:

$term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) ); 

Эта строка получает всю информацию о таксономии и возвращает ее в виде объекта, записанного в переменную $term. Например, классификация “Mac OS” возвращает следующий объект:

stdClass Object  
(  
    [term_id] => 13  
    [name] => Mac OS  
    [slug] => mac-os  
    [term_group] => 0  
    [term_taxonomy_id] => 22  
    [taxonomy] => operating_system  
    [description] =>  
    [parent] => 0  
    [count] => 2  
)  

Шаг 3 Вывод Названия классификации и ее описание

Нам нужно изменить название страницы, чтобы пользователи видели, какая классификация отображена на странице. Поскольку мы скопировали содержимое шаблона category.php, мы можем взять строку кода, использующуюся для вывода названия рубрики, и немного ее изменить, с тем, чтобы она отображала текущее название классификации, и (если доступно) ее описание.

Измените следующую строку, взятую из шаблона category.php

printf( __( 'Category Archives: %s', 'twentyten' ), '<span>' . single_cat_title( '', false ) . '</span>' );  

следующим образом:

printf( __( 'Posts classified under: %s', 'twentyten' ), '<span>' . $term->name . '</span>' );  

Эта строка выведет название текущей классификации. Далее, ниже добавьте следующую строчку:

if ('' != $term_descr ) {  
echo "<p>$term_descr</p>\n";  
}  

Здесь, как не трудно догадаться, будет выведено описание классификации, если оно доступно.

Проверить как работает классификационный список записей, очень просто. Откройте любую, отдельную запись, и кликните на ссылку-название классификации.

Перевод статьи “Introducing WordPress 3 Custom Taxonomies”, автор Paul Kaiser

Введение в пользовательскую таксономию WordPress 3.0: 52 комментария

    1. Когда она выйдет точно знают видимо только разработчики, в расписании значится 15 мая

  1. Разработчики ворпресса вообще супер молодцы! Это то, чего не хватало, чтобы на этой платформе оооочень хорошие сайты делать. Именно сайты, хотя для блогов такая штука тоже полезна.

  2. Ну что сказать. С нетерпением будем ждать выхода третьего ВП. дабы заценить все эти волшебные плюшки))))
    Как по мне так и сейчас Вордпрес демонстрирует наилучшие возможности системы. Он удобен, прост и без лишних ненужных заморочек)

  3. Привет! А подскажи, пожалуйста, как вывести все записи с определёнными значениями в такой таксономии? В ф-и get_posts() есть параметр tag, по которому можно выбирать записи с определёнными метками, но возможности выбирать по term’у не могу найти (

    Спасибо!

  4. А вот Я так и не понял, зачем эта таксономия нужна. Я вижу здесь только возможность добавить новые древа рубрик — и не более.

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

      1. Я пользуюсь произвольными полями с плагином Custom Field Template. Туда всё, что надо, и ввожу. А потом вывожу в каталог. Для чего Мне ещё пара деревьев рубрик — ума не приложу…

        1. Произвольные поля не обеспечивают иерархии, к тому же не совсем удобны в использовании, если без плагина. К тому же они не предназначены для классификации, скорее для хранения какой-то произвольной информации о записи. Но это конечно вопрос привычки и удобства.

          1. Когда нужна иерархичность — Я применяю категории. И Мне их почему-то хватает.

          2. При наличии большого количества разной информации, которую необходимо классифицировать, категории разрастаются до таких пределов, что ими становится просто неудобно пользоваться. Вот в таких случаях и требуется использовать пользовательский тип записи, и пользовательскую же таксономию.

          3. пользовательский тип записи

            Простите, это как и зачем?
            Вот, на примере того же каталога интернет-магазина компьютеров. Есть, к примеру, одни записи, в записях фотки компов и данные о них (цены, состав железа, свойства, ОС). Есть другие: в них новости компьютерного мира. Одни пусть будут в рубрике «Компьютеры», другие— в «Новости». Зачем усложнять?

          4. А теперь представьте, что вам нужно группировать ваши записи о компьютерах, по ОС, производителю, назначению (игровой, планшет, нетбук), характеристикам железа и еще чего-нибудь. Затем, новости компьютерного мира, вам нужно подразделить на рубрики программного обеспечения, железа, новых технологий и прочего. Потом вдруг, выяснится, что нужно еще добавить записи, с какими-нибудь советами для читателей, которые в свою очередь, тоже должны подразделяться на рубрики. В результате у вас огромный, длинный список категорий, с большим уровнем вложенности. Если вам удобно этим пользоваться — пожалуйста, вас, слава богу, никто не принуждает. Пользовтельская таксономия — это лишь возможность все упростить, и разделить различные типы информации и их классификацию.

          5. А, ну тогда понятно. Просто разделить список категорий на несколько. Ясно.
            Тогда, может, подскажете, как Мне удобнее управлять списком категорий марок машин? Это не сарказм, Мне действительно нужна помощь :)
            Там такая иерархия:
            Toyota
            Allion
            Celsior
            Chaser
            Nissan
            Cube
            March
            Wingroad
            Ну так далее. Только вот у Тойоты, например, уже 24 марки. Mitsubishi — 12. Короче, длинный список. Как бы его удобнее использовать? Может, как-нибудь заставить сворачиваться дерево категорий в Консоли при добавлении записи? Или, может, так: сначала выпадающее меню — производитель, а потом подгружаются его марки…

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

  5. Есть, кстати, плагин — More Taxonomies называется (и лежит в офф. репозитории плагинов) — делает всё то же, что в статье, только через Консоль.

    1. Одна только тонкость: в поле «Taxonomy name singular» нужно вводить на латинице, иначе Консоль покажет ошибку (пишите русское название в поле «Taxonomy name plural»).

    1. Мне не приходилось это делать, поэтому сходу сказать как, я не смогу. Если будет время, обязательно разберусь и напишу статью

  6. Скажите пожалуйста, а как реализовать поиск по таксономиям например на дополнительной странице page-name.php, нужно сделать чекбоксами прям как в админке. Спасибо заранее

  7. Здравствуйте, сделал все как написано(перечитывал, вроде ничего не упустил), но ссылки так и не заработали, файл «taxonomy.php» — создал подправил, но при переходе по ссылке выдается ошибка 404.
    Подскажите пожалуйста в чем может быть ошибка?

      1. Решение найдено! Оказывается, после этих манипуляция нужно просто обновить пермалинки :)

        1. Спасибо!!! Я уже все варианты испробовал, а вот про ссылки забыл! Автору конечно тоже большой респект :) Ура!

  8. Привет. То что искал. Перерыл очень большое количество плагинов. И хотел через произвольные поля. Но этот вариант действительно лучше.

    Вопрос (уже задавался) — Как осуществить сортировку по конкретным параметрам (с использованием чекбоксов)?. Спасибо.

  9. Привет. можно подробнее об этом «Я бы выбрала вариант с последующей загрузкой дерева». Как это организовать?

  10. Пытаюсь вставить вывод таксономии в заметке, ничего не получаеться, версия 3.3.1
    Или может есть какие нить плагины, для создания каталогов с фильмами

  11. Хочу вывести таксономию в посте.
    Сделал как здесь описано, но вместо div’а с классом entry-utility у меня есть div’ка с айдишкой dole, которая стоит после дивки с контентом поста.
    А ошибка у меня выходит такая:
    Parse error: syntax error, unexpected T_VARIABLE in Z:\bla-bla-bla.com\bla-bla-bla\blablabla\single.php on line 34
    Из-за переменной $taxo_text

  12. Отличный сайт! Замечательная и самое главное чуть-ли не единственная статья о Таксе на русском. Благодарю!

  13. Здраствуйте почему с ЧПУ неработает не кто неподскажет ? … премолинки обновляю… переходя по ссылке таксономической где должны все записии ввыводится из данной таксономии пишется «нечего не найдено» а без чпу все работает…

  14. Здравствуйте, нужен профессиональный дельный совет. Есть сайт игровой тематики, ничего общего с блогом)
    Вообщим на сайте есть два типа таксономий игровые жанры и платформы, сейчас же я хочу сделать более осмысленную конструкцию и создать таксономию игры (или тип), чтобы при написании статьи можно было выбирать к какой игре она относится, а сами игры при этом вы водились отдельно. Ну, например, захожу в статью гайд по тетрису, а там ссылка на страницу с игрой или другие материалы по этой игре, сама же игра в виде страницы со статьей.
    Также прикрутил к теме профиль пользователей, если при всем при этом можно было бы добавить у него список с играми, мол, в какие игры я сейчас играю, вообще было бы замечательно.
    У кого какие советы, код писать не надо, просто посоветуйте, как лучше реализовать (без плагинов)

  15. СПАСИБО ВАМ ОГРОМНОЕ! Пол-инета перегуглил. Если не тяжело будет — сможете объяснить, что делает запись «get_query_var( ‘term’ )». Заранее благодарю.

    1. Попробуйте гденить в шаблоне рубрики вставить
      global $wp_query;
      ‘.print_r($wp_query->query_vars,true).»;
      — узнаете ответ на свой вопрос

  16. Сделал всё как здесь написано но при переходе по ссылке в тэгах попадаю на страницу No-results (Ничего не найдено).

    Кто нить сталкивался, помочь можете?

  17. Большое спасибо автору!
    Никак не мог понять, как же использовать пользовательскую таксономию, теперь увидел примеры и всё встало на свои места! ))

  18. запилил таксономию, теперь пытаюсь подключить к страницам комментарии

    но комментарии не работают. Подскажи как быть ?

  19. Здравствуйте!
    Хочу сделать на странице вывода записей блога, такую интересную штуку.
    Что бы выводилась Родительская рубрики (вернее ее только название) и подрубрики с активными ссылками, нажал и вывелся полностью все записи в которой есть эта подрубрика.?
    Wordpress 3.9
    Заранее спасибо!

  20. Можно ли создать таксономию без slug? Чтобы запись имела адрес сайт/запись?
    И если уже существует таксономия с slug, как ее убрать? Сначала убрать ее в коде, а потом заменить адреса в базе данных?

  21. Несмотря на то, что версия WordPress 3.0, все равно большое спасибо. Сейчас уже 4.4.2. Искал именно информацию по таксономиям. Узнал много полезного.

  22. Как всегда в ВП изобрели свой велосипед, вопрос только зачем. В джумла еще в версии 2 убрали всю эту ебаторию с разделами и заменили неограниченой вложености категориями, а в третьей версии добавили метки, чего хватает для 90% задач. В вордпресс задачу усложнили по максимуму что бы усеры смогли почувствовать себя говнокодерами.
    Самый секс начинается когда сторонние плагины не поддерживают кастомные поля и с последующими обновлениями.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *