Jak uzyskać listę wszystkich terminów taksonomii przypisanych do węzła?

13

Mam węzeł i chcę uzyskać wszystkie warunki taksonomii przypisane do węzła.

W drupal 6 mogłem używać $node->taxonomyi taxonomy_*funkcje, ale te nie istnieją w drupal 7.

Rwky
źródło

Odpowiedzi:

21

Warunki taksonomii są implementowane w polach w Drupal 7. Zakładając, że zdefiniowałeś pole taksonomii o nazwie field_category dla swojego typu zawartości, możesz uzyskać do niej dostęp jako:

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

Jeśli nie masz dostępu do nazwy pola, prawdopodobnie najłatwiejszym sposobem dla węzłów jest zapytanie bezpośrednio do bazy danych:

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

Pamiętaj jednak, że jeśli masz więcej niż jedną dziedzinę taksonomii, możesz skończyć z mnóstwem terminów z różnych słowników.

klucz
źródło
Co jeśli nie znam nazwy pola systematyki? Nazwy będą się różnić w zależności od typu zawartości i chcę uzyskać wszystkie warunki dla dowolnego węzła.
Rwky,
1
Dodano metodę, jeśli nie znasz nazwy pola.
keithm
4
Zwłaszcza w drugiej wersji można użyć taxonomy_term_load_multiple($results->fetchCol());do załadowania terminów w jednym zapytaniu.
Berdir,
1
Och, i możesz użyć, field_get_items('node', $node, 'field_category')aby uzyskać pola we właściwym języku.
Berdir,
Zwróć uwagę, że technika select from taxonomy_index działa tylko z opublikowanymi węzłami. Ta tabela nie jest utrzymywana dla niepublikowanych treści.
Dave Cohen
2

Oto bardzo ogólny sposób przechwytywania wszystkich terminów bez podawania nazw pól i bez 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
źródło
Dla początkujących Drupala chciałbym dodać, if (arg(0) == 'node' && is_numeric(arg(1))) {$nid = arg(1);}aby uzyskać nidi $node = node_load($nid);, aby Twoja funkcja działała.
Sébastien Gicquel