Как получить список всех терминов таксономии, назначенных узлу?

13

У меня есть узел, и я хочу получить все термины таксономии, назначенные этому узлу.

В Drupal 6 я мог бы использовать $node->taxonomyи taxonomy_*функции, но их нет в Drupal 7.

Rwky
источник

Ответы:

21

Термины таксономии реализованы в полях в Drupal 7. Предполагая, что вы определили поле таксономии с именем field_category для своего типа контента, вы можете получить к нему доступ как:

$language = 'und'; // or will be provided by some Drupal hooks
foreach ($node->field_category[$language] as $delta => $value) {
  $term = taxonomy_term_load($value['tid']);
}

Если у вас нет доступа к имени поля, возможно, самый простой способ для узлов - это запросить базу данных напрямую:

$results = db_query('SELECT tid FROM {taxonomy_index} WHERE nid = :nid', array(':nid' => $node->nid));
foreach ($results as $result) {
  $term = taxonomy_term_load($result->tid);
}

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

keithm
источник
Что если я не знаю названия поля таксономии? Имена будут различаться в зависимости от типа контента, и я хочу получить все условия для любого узла.
Rwky
1
Добавлен метод, если вы не знаете имя поля.
Keithm
4
Особенно во второй версии, вы можете использовать taxonomy_term_load_multiple($results->fetchCol());для загрузки терминов в одном запросе.
Бердир
1
О, и вы можете использовать, field_get_items('node', $node, 'field_category')чтобы получить поля на правильном языке.
Бердир
Обратите внимание, что метод select from taxonomy_index работает только с опубликованными узлами. Эта таблица не поддерживается для неопубликованного контента.
Дэйв Коэн
2

Вот очень общий способ получить все термины без указания имен полей и без db_query:

function example_get_terms($node) {
  $terms = array();

  foreach (field_info_instances('node', $node->type) as $fieldname => $info) {
    foreach (field_get_items('node', $node, $fieldname) as $item) {
      if (is_array($item) && !empty($item['tid']) && $term = taxonomy_term_load($item['tid'])) {
        $terms[] = $term->name;
      }
    }
  }
  return $terms;
}
Ronnbot
источник
Для начинающих Drupal, я бы добавил, if (arg(0) == 'node' && is_numeric(arg(1))) {$nid = arg(1);}чтобы получить nidи $node = node_load($nid);для того, чтобы заставить вашу функцию работать.
Себастьян