Вопрос или проблема
-
Следует ли регистрировать обоих – родителя и ребенка как
'hierarchical' => true
, если нет внуков? -
Если “Фильм” является таксономией верхнего уровня, когда я регистрирую ребенка, достаточно ли просто:
'parent_item' => __( 'Родительский фильм' )
? -
Как автоматически назначить дочернюю таксономию посту? Пока что я понял, как назначить таксономию посту, но работает ли это правильно с дочерней таксономией?
wp_set_object_terms($post_ID, $cat, 'category');
-
Если я запрашиваю родительскую таксономию, будет ли дочерняя включена в результаты или нет?
-
Если таксономии не перечислены в
args
функцииregister_post_type
, будут ли они все равно работать?
Слишком много для комментария, поэтому я оставлю это для ответа:
- Вы задаете много вопросов, которые на самом деле должны быть другими вопросами, а не объединены в один.
- (По пункту 1.) Вы не регистрируете “дочерние” или “родительские” таксономии. Вы добавляете (дочерние) термины к иерархической таксономии через интерфейс WP Back-End. Вы можете сделать это программно с помощью
wp_set_post_terms();
,wp_set_object_terms();
или других функций, но это больше внутренние вещи и сложно справляться, так как вам нужно проверять при каждом запросе, существует ли он уже (добавляет запросы к БД), поэтому это не рекомендуется, так как вы не можете делать это при активации темы, пока WP не предоставляет хук для этого. - (По пункту 4.) Вы можете запрашивать несколько таксономий одновременно, как показано в статье WP_Query в Codex. Это запрашивает таксономию и все назначенные посты. Вы также можете запрашивать термины, которые находятся внутри иерархической таксономии. Но нет “дочерних” таксономий. Только “дочерние” термины. Эти дочерние термины вы можете добавлять в ваши аргументы
tax_query
. Что-то вродеif is child of
можно сделать с помощью функций, таких какget_term_children();
. Если вы ссылаетесь на архив термина, вы можете изменить запрос (ищите WPSE), чтобы включить дочерние термины тоже. - (По пункту 3.) Как указано в других ответах и комментариях к некоторым из ваших других вопросов, вам нужно будет подключиться к таким вещам, как
save_post
и подобные. Вы найдете достаточно ответов здесь на WPSE, которые показывают вам, как это сделать. Вы близки. - (По пункту 2.) Вы смешиваете метки с актуальными аргументами. Аргументы
parent_item
иparent_item_colon
предназначены для установки вашего пользовательского текста и не могут регистрировать “дочерние” таксономии. Они используются только для изменения текста по умолчанию, который вы видите в интерфейсе администратора.
Замечания:
- Пожалуйста, обратите внимание на ваши старые вопросы. У нас действительно есть проблемы с уменьшением количества открытых и безответных вопросов. Вам следует вернуться и попытаться поработать над вашими открытыми вопросами, на которые есть ответы.
- Правильное форматирование очень важно. Ответчики тратят свое время и советы бесплатно, чтобы помочь вам решить вашу проблему. Пожалуйста, приложите такое же усилие к формулированию и форматированию вопроса.
- Будьте вежливы в комментариях к ответу. Это а) будет мотивировать ответчика предложить дальнейшую помощь и б) это открытый формат вопрос-ответ, и ваш вопрос предназначен для того, чтобы помочь другим пользователям избежать повторных вопросов, вместо этого просто прочитать ваш вопрос и соответствующие ответы. Рассматривайте свое поведение при задавании вопросов и комментариях как что-то вроде вашей “визитной карточки”.
Если вы регистрируете таксономию как hierarchical=>true
, она станет категорией, и вы сможете формировать родительские – дочерние отношения внутри этой таксономии. Если же вы регистрируете таксономию как hierarchical=>false
, она станет тегом, что означает отсутствие родительских – дочерних отношений. Вам может понадобиться получить id термина, использовать функцию term_exists, затем использовать wp_insert_term, чтобы вставить новый термин, где родителем будет id, который вы получили с помощью term_exists.
function create_child_taxonomy() {
// Регистрируем дочернюю таксономию (например, ‘поджанр’ под ‘жанром’)
$args = array(
‘hierarchical’ => true,
‘labels’ => array(
‘name’ => ‘Поджанры’,
‘singular_name’ => ‘Поджанр’,
‘search_items’ => ‘Искать поджанры’,
‘all_items’ => ‘Все поджанры’,
‘edit_item’ => ‘Редактировать поджанр’,
‘update_item’ => ‘Обновить поджанр’,
‘add_new_item’ => ‘Добавить новый поджанр’,
‘new_item_name’ => ‘Новое имя поджанра’,
‘menu_name’ => ‘Поджанры’,
),
‘show_ui’ => true,
‘show_admin_column’ => true,
‘query_var’ => true,
‘rewrite’ => array(‘slug’ => ‘subgenre’),
);
register_taxonomy('subgenre', 'post', $args); // Регистрируем 'subgenre' для постов
}
add_action(‘init’, ‘create_child_taxonomy’);
Ответ или решение
Чтобы зарегистрировать таксономии и их дочерние элементы в WordPress, необходимо понимать принцип работы таксономий, их иерархию и методы программирования. Давайте разберем каждый вопрос и представим детальное руководство.
1. Регистрация родительских и дочерних таксономий
Если вы собираетесь создать иерархическую таксономию, необходимо установить 'hierarchical' => true
как для родительской, так и для дочерней таксономий. Однако важно понимать, что термин «дочерняя таксономия» в данном контексте не совсем корректен. Мы говорим о терминах (terms) в рамках одной таксономии, где некоторые термины могут являться родительскими (parent), а другие — дочерними (child).
2. Регистрация дочернего термина
Если у вас есть таксономия, например «Фильм» (Movie), то при добавлении дочернего термина нужно использовать wp_insert_term()
и указывать родительский ID. Этот метод позволяет создавать иерархию терминов:
$parent_id = term_exists('Фильм', 'taxonomy_name'); // Получаем ID родительского термина
wp_insert_term('Дочерний Фильм', 'taxonomy_name', array('parent' => $parent_id['term_id']));
Обратите внимание, что parent_item
используется для определения текста, отображаемого в админ-интерфейсе и не влияет на саму структуру таксономий.
3. Автоматизация назначения дочерней таксономии посту
Для автоматического назначения дочерних терминов к постам используйте хук save_post
, который позволяет выполнять действия при сохранении поста:
add_action('save_post', 'assign_child_taxonomy');
function assign_child_taxonomy($post_id) {
$child_term = 'child-term-name'; // Имя дочернего термина
$taxonomy = 'taxonomy_name'; // Имя вашей таксономии
wp_set_object_terms($post_id, $child_term, $taxonomy);
}
Этот метод будет работать для дочерних терминов, как и для родительских.
4. Включение дочерних терминов в запросы
При запросе постов через таксономию, дочерние термины не будут автоматически включены в результаты. Однако вы можете использовать функцию get_term_children()
для получения всех дочерних терминов и фильтрации постов:
$children = get_term_children($parent_id, 'taxonomy_name');
$query = new WP_Query(array(
'tax_query' => array(
array(
'taxonomy' => 'taxonomy_name',
'field' => 'term_id',
'terms' => $children,
),
),
));
5. Работоспособность таксономий вне аргументов register_post_type
Если таксономии не перечислены в args
при регистрации типа поста, они все равно будут работать, но вам нужно убедиться, что они привязаны к нужным постам. Это можно сделать через админку или программно, как упоминалось ранее. Однако для удобства управления рекомендуется указывать все зарегистрированные таксономии при создании типа поста.
Заключение
В процессе работы с таксономиями и их иерархией в WordPress важно правильно использовать соответствующие функции и хуки. Это не только упростит вашу работу, но и улучшит взаимодействие с контентом через админ-интерфейс. Следуя вышеописанным шагам, вы сможете эффективно работать с родительскими и дочерними терминами, обеспечивая их правильное назначение и запрос.