В чем разница между иерархическими и неиерархическими таксономиями?

22 авг. 2010 г., 09:37:56
Просмотры: 31.9K
Голосов: 37

Вопрос заключается в том, "В чем разница между иерархическими и неиерархическими таксономиями?" Этот вопрос сначала поставил меня в тупик, поэтому я решил показать различия для тех, кто ищет объяснение этих особенностей.

Конкретно вопрос касается аргумента hierarchical, который передается в функцию register_taxonomy(). Точнее, в чем разница между этим:

'hierarchical' => false

register_taxonomy('movie-genre', 'movie', array(
  'hierarchical'    => false,
  'label'           => 'Жанр',
  'query_var'       => 'movie-genre',
  'rewrite'         => array('slug' => 'genres' ),
));

И этим?

'hierarchical' => true

register_taxonomy('movie-genre', 'movie', array(
  'hierarchical'    => true,
  'label'           => 'Жанр',
  'query_var'       => 'movie-genre',
  'rewrite'         => array('slug' => 'genres' ),
));

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

1
Комментарии

Можете также объяснить, что является иерархическим по отношению к чему? Является ли таксономия-группа иерархической по отношению к типу записи? Или отдельная таксономия является иерархической по отношению к таксономии-группе? Меня немного смущает слово "иерархический". Спасибо.

Dave Dave
24 янв. 2012 г. 22:28:37
Все ответы на вопрос 1
2
47

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

'hierarchical'=>false

Когда вы указываете 'hierarchical'=>false, вы получаете следующий тип метабокса, который WordPress также использует для Меток (тегов):

Метабокс терминов таксономии в редакторе записи, когда $hierarchical==false

'hierarchical'=>true

Однако, когда вы указываете 'hierarchical'=>true, вы получаете следующий тип метабокса, который WordPress также использует для Категорий:

Метабокс терминов таксономии в редакторе записи, когда $hierarchical==true

Конечно, приведенный выше пример также показывает, где иерархическая категоризация может быть неоднозначной, потому что в реальной жизни подкатегории часто относятся ко многим родительским категориям. Тем не менее, разрешение "многих родителей" не является принципом работы иерархических таксономий в WordPress. На мой взгляд, идеальная категоризация чего-либо практически невозможна независимо от того, как работает WordPress. Так что Caveat Emptor! (Покупатель берегись!)

О регистрации пользовательской таксономии, или "Почему она не сохраняется?"

Хотя это не имеет прямого отношения к вопросу, если вы новичок, пробующий работать с пользовательскими таксономиями (или опытный разработчик, который невнимателен, как случилось со мной, когда я писал это!), вы, вероятно, попытаетесь добавить register_taxonomy() прямо в файл functions.php вашей темы, как в коде из вопроса. Ой!

Если вы добавите код напрямую в functions.php, ваш метабокс отобразится, но не сохранит новые добавленные термины (а в метабоксе с 'hierarchical'=>true существующие термины не загрузятся с чекбоксами). Это происходит потому, что пользовательские таксономии (и типы записей) нужно регистрировать внутри хука init, например так:

<?php
add_action('init','register_movie_genre_taxonomy');
  function register_movie_genre_taxonomy() {
    register_taxonomy('movie-genre', 'movie', array(
      'hierarchical'    => true,
      'label'           => 'Жанры фильмов',
      'query_var'       => 'movie-genre',
      'rewrite'         => array('slug' => 'genres' ),
    ));
}

Надеюсь, это поможет!

22 авг. 2010 г. 09:42:03
Комментарии

Является ли иерархическая таксономия тем же самым, что и пользовательская категория? А неиерархическая таксономия — это то же самое, что пользовательский тег?

Daniel Daniel
3 июн. 2014 г. 18:11:40

@ravensfan55222 - Не совсем, но почти. Встроенная система категорий — это лишь одна из возможных иерархических таксономий, а не то же самое, что иерархическая таксономия. Аналогично, (постовые) Теги — это лишь один пример неиерархической таксономии. Более правильно говорить, что "иерархичность" — это просто атрибут таксономии, как метка является атрибутом таксономии или цвет — атрибутом автомобиля. Возможно, это именно то, что вы имели в виду, но я хотел уточнить на случай, если это не так.

MikeSchinkel MikeSchinkel
7 июн. 2014 г. 06:17:38