Comment obtenir une liste de tous les termes de taxonomie attribués à un nœud?

13

J'ai un nœud et je souhaite obtenir tous les termes de taxonomie attribués au nœud.

Dans drupal 6, je pourrais utiliser $node->taxonomyet les taxonomy_*fonctions mais celles-ci n'existent pas dans drupal 7.

Rwky
la source

Réponses:

21

Les termes de taxonomie sont implémentés dans les champs de Drupal 7. En supposant que vous ayez défini un champ de taxonomie nommé field_category pour votre type de contenu, vous pouvez y accéder en tant que:

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

Si vous n'avez pas accès au nom du champ, le moyen le plus simple pour les nœuds est probablement d'interroger directement la base de données:

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

Gardez cependant à l'esprit que vous pourriez finir par traiter un mélange de termes provenant de vocabulaires différents si vous avez plus d'un champ de taxonomie.

Keithm
la source
Que faire si je ne connais pas le nom du champ de taxonomie? Les noms différeront entre les types de contenu et je veux obtenir tous les termes pour n'importe quel nœud.
Rwky
1
Ajout d'une méthode si vous ne connaissez pas le nom du champ.
keithm
4
Surtout dans la deuxième version, vous pouvez utiliser taxonomy_term_load_multiple($results->fetchCol());pour charger les termes dans une seule requête.
Berdir
1
Oh, et vous pouvez utiliser field_get_items('node', $node, 'field_category')pour obtenir les champs dans la bonne langue.
Berdir
Notez que la technique select from taxonomy_index ne fonctionne qu'avec les nœuds publiés. Ce tableau n'est pas conservé pour le contenu non publié.
Dave Cohen
2

Voici un moyen très générique de saisir tous les termes sans spécifier de noms de champ et sans 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
la source
Pour Drupal débutant, j'ajouterais if (arg(0) == 'node' && is_numeric(arg(1))) {$nid = arg(1);}pour obtenir le nidet $node = node_load($nid);afin de faire fonctionner votre fonction.
Sébastien Gicquel