В чем разница между иерархическими и неиерархическими таксономиями?
Вопрос заключается в том, "В чем разница между иерархическими и неиерархическими таксономиями?" Этот вопрос сначала поставил меня в тупик, поэтому я решил показать различия для тех, кто ищет объяснение этих особенностей.
Конкретно вопрос касается аргумента 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' ),
));
Отмечу, что я собираюсь ответить на свой собственный вопрос, но не буду отмечать его как лучший, если никто другой не предложит действительно хороший ответ. Также моя интуиция подсказывает, что я мог упустить некоторые различия между этими двумя типами, поэтому, если это так, пожалуйста, дайте нам знать, что я пропустил.

Простой ответ заключается в том, что термины в иерархических таксономиях могут иметь дочерние термины. Но что еще?
'hierarchical'=>false
Когда вы указываете 'hierarchical'=>false
, вы получаете следующий тип метабокса, который WordPress также использует для Меток (тегов):
'hierarchical'=>true
Однако, когда вы указываете 'hierarchical'=>true
, вы получаете следующий тип метабокса, который WordPress также использует для Категорий:
Конечно, приведенный выше пример также показывает, где иерархическая категоризация может быть неоднозначной, потому что в реальной жизни подкатегории часто относятся ко многим родительским категориям. Тем не менее, разрешение "многих родителей" не является принципом работы иерархических таксономий в 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' ),
));
}
Надеюсь, это поможет!

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

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