¿Cómo obtengo una lista de todos los términos de taxonomía asignados a un nodo?

13

Tengo un nodo y quiero obtener todos los términos de taxonomía asignados al nodo.

En drupal 6 podría usar $node->taxonomylas taxonomy_*funciones, pero estas no existen en drupal 7.

Rwky
fuente

Respuestas:

21

Los términos de taxonomía se implementan en los campos de Drupal 7. Suponiendo que haya definido un campo de taxonomía llamado field_category para su tipo de contenido, puede acceder a él 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']);
}

Si no tiene acceso al nombre del campo, probablemente la forma más fácil para los nodos es consultar la base de datos directamente:

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

Sin embargo, tenga en cuenta que puede terminar manejando una mezcla de términos de diferentes vocabularios si tiene más de un campo de taxonomía.

keithm
fuente
¿Qué pasa si no sé el nombre del campo de taxonomía? Los nombres diferirán entre los tipos de contenido y quiero obtener todos los términos para cualquier nodo.
Rwky
1
Se agregó un método si no conoce el nombre del campo.
keithm
44
Especialmente en la segunda versión, puede usar taxonomy_term_load_multiple($results->fetchCol());para cargar los términos en una sola consulta.
Berdir el
1
Ah, y puede usar field_get_items('node', $node, 'field_category')para obtener los campos en el idioma correcto.
Berdir
Tenga en cuenta que la técnica select from taxonomy_index solo funciona con nodos publicados. Esa tabla no se mantiene para contenido no publicado.
Dave Cohen
2

Aquí hay una forma muy genérica de obtener todos los términos sin especificar nombres de campo y sin 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
fuente
Para principiantes de Drupal, agregaría if (arg(0) == 'node' && is_numeric(arg(1))) {$nid = arg(1);}para obtener nidy $node = node_load($nid);para que su función funcione.
Sébastien Gicquel