Как зарегистрировать детские таксономии?

Вопрос или проблема

  1. Следует ли регистрировать обоих – родителя и ребенка как 'hierarchical' => true, если нет внуков?

  2. Если “Фильм” является таксономией верхнего уровня, когда я регистрирую ребенка, достаточно ли просто: 'parent_item' => __( 'Родительский фильм' )?

  3. Как автоматически назначить дочернюю таксономию посту? Пока что я понял, как назначить таксономию посту, но работает ли это правильно с дочерней таксономией? wp_set_object_terms($post_ID, $cat, 'category');

  4. Если я запрашиваю родительскую таксономию, будет ли дочерняя включена в результаты или нет?

  5. Если таксономии не перечислены в args функции register_post_type, будут ли они все равно работать?

Слишком много для комментария, поэтому я оставлю это для ответа:

  1. Вы задаете много вопросов, которые на самом деле должны быть другими вопросами, а не объединены в один.
  2. (По пункту 1.) Вы не регистрируете “дочерние” или “родительские” таксономии. Вы добавляете (дочерние) термины к иерархической таксономии через интерфейс WP Back-End. Вы можете сделать это программно с помощью wp_set_post_terms();, wp_set_object_terms(); или других функций, но это больше внутренние вещи и сложно справляться, так как вам нужно проверять при каждом запросе, существует ли он уже (добавляет запросы к БД), поэтому это не рекомендуется, так как вы не можете делать это при активации темы, пока WP не предоставляет хук для этого.
  3. (По пункту 4.) Вы можете запрашивать несколько таксономий одновременно, как показано в статье WP_Query в Codex. Это запрашивает таксономию и все назначенные посты. Вы также можете запрашивать термины, которые находятся внутри иерархической таксономии. Но нет “дочерних” таксономий. Только “дочерние” термины. Эти дочерние термины вы можете добавлять в ваши аргументы tax_query. Что-то вроде if is child of можно сделать с помощью функций, таких как get_term_children();. Если вы ссылаетесь на архив термина, вы можете изменить запрос (ищите WPSE), чтобы включить дочерние термины тоже.
  4. (По пункту 3.) Как указано в других ответах и комментариях к некоторым из ваших других вопросов, вам нужно будет подключиться к таким вещам, как save_post и подобные. Вы найдете достаточно ответов здесь на WPSE, которые показывают вам, как это сделать. Вы близки.
  5. (По пункту 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 важно правильно использовать соответствующие функции и хуки. Это не только упростит вашу работу, но и улучшит взаимодействие с контентом через админ-интерфейс. Следуя вышеописанным шагам, вы сможете эффективно работать с родительскими и дочерними терминами, обеспечивая их правильное назначение и запрос.

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

Капча загружается...