Como obtenho uma lista de todos os termos de taxonomia atribuídos a um nó?

13

Eu tenho um nó e quero obter todos os termos de taxonomia atribuídos ao nó.

No drupal 6 eu poderia usar $node->taxonomye as taxonomy_*funções, mas elas não existem no drupal 7.

Rwky
fonte

Respostas:

21

Os termos de taxonomia são implementados nos campos do Drupal 7. Supondo que você tenha definido um campo de taxonomia chamado field_category para o seu tipo de conteúdo, você pode acessá-lo como:

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

Se você não tiver acesso ao nome do campo, provavelmente a maneira mais fácil para os nós é consultar o banco de dados diretamente:

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

Porém, lembre-se de que você pode acabar lidando com uma série de termos de diferentes vocabulários, se tiver mais de um campo de taxonomia.

keithm
fonte
E se eu não souber o nome do campo de taxonomia? Os nomes diferem entre os tipos de conteúdo e desejo obter todos os termos para qualquer nó.
Rwky
1
Adicionado um método se você não souber o nome do campo.
KeithM
4
Especialmente na segunda versão, você pode usar taxonomy_term_load_multiple($results->fetchCol());para carregar os termos em uma única consulta.
Berdir 19/11/11
1
Ah, e você pode usar field_get_items('node', $node, 'field_category')para obter os campos no idioma correto.
Berdir 19/11/11
Observe que a técnica select from taxonomy_index funciona apenas com nós publicados. Essa tabela não é mantida para conteúdo não publicado.
Dave Cohen
2

Aqui está uma maneira muito genérica de obter todos os termos sem especificar nomes de campos e sem 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
fonte
Para Drupal iniciante, gostaria de acrescentar if (arg(0) == 'node' && is_numeric(arg(1))) {$nid = arg(1);}para obter o nide $node = node_load($nid);a fim de fazer o seu trabalho função.
Sébastien Gicquel