Як отримати список всіх термінів таксономії, призначених для вузла?


13

У мене є вузол і хочу отримати всі умови таксономії, призначені для вузла.

У drupal 6 я міг би використовувати $node->taxonomyі taxonomy_*функції, але таких у drupal 7 не існує.

Відповіді:


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);
}

Майте на увазі, що у вас може виникнути сукупність термінів з різних словникових запасів, якщо у вас є більше одного поля таксономії.


Що робити, якщо я не знаю назви поля таксономії? Назви відрізнятимуться між типами вмісту, і я хочу отримати всі умови для будь-якого вузла.
Rwky

1
Додано метод, якщо ви не знаєте назви поля.
кейт

4
Особливо у другій версії ви можете використовувати taxonomy_term_load_multiple($results->fetchCol());для завантаження термінів в одному запиті.
Бердір

1
О, і ви можете використовувати field_get_items('node', $node, 'field_category')для отримання полів правильною мовою.
Бердір

Зверніть увагу, що метод вибору з таксономії_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;
}

Для Drupal-початківця я б додав, if (arg(0) == 'node' && is_numeric(arg(1))) {$nid = arg(1);}щоб отримати nidі $node = node_load($nid);для того, щоб ваша функція працювала.
Sébastien Gicquel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.