Wie erhalte ich eine Liste aller Taxonomiebegriffe, die einem Knoten zugewiesen sind?

13

Ich habe einen Knoten und möchte alle dem Knoten zugewiesenen Taxonomiebegriffe erhalten.

In Drupal 6 konnte ich $node->taxonomyund die taxonomy_*Funktionen verwenden, aber diese existieren in Drupal 7 nicht.

Rwky
quelle

Antworten:

21

Taxonomiebegriffe werden in Feldern in Drupal 7 implementiert. Vorausgesetzt, Sie haben ein Taxonomiefeld mit dem Namen field_category für Ihren Inhaltstyp definiert, können Sie darauf zugreifen als:

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

Wenn Sie keinen Zugriff auf den Feldnamen haben, besteht der wahrscheinlich einfachste Weg für Knoten darin, die Datenbank direkt abzufragen:

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

Beachten Sie jedoch, dass Sie möglicherweise eine Menge Begriffe aus verschiedenen Vokabularen verwenden, wenn Sie mehr als ein Taxonomiefeld haben.

keithm
quelle
Was ist, wenn ich den Taxonomiefeldnamen nicht kenne? Die Namen unterscheiden sich zwischen den Inhaltstypen und ich möchte alle Begriffe für jeden Knoten erhalten.
Rwky
1
Es wurde eine Methode hinzugefügt, wenn Sie den Feldnamen nicht kennen.
Keithm
4
Insbesondere in der zweiten Version können Sie taxonomy_term_load_multiple($results->fetchCol());die Begriffe in einer einzigen Abfrage laden.
Berdir
1
Oh, und Sie können verwenden field_get_items('node', $node, 'field_category'), um die Felder in der richtigen Sprache abzurufen.
Berdir
Beachten Sie, dass die Methode select from taxonomy_index nur mit veröffentlichten Knoten funktioniert. Diese Tabelle wird nicht für unveröffentlichte Inhalte verwaltet.
Dave Cohen
2

Hier ist eine sehr allgemeine Methode, um alle Begriffe ohne Angabe von Feldnamen und ohne Angabe von db_query abzurufen:

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
quelle
Für Drupal-Anfänger würde ich hinzufügen if (arg(0) == 'node' && is_numeric(arg(1))) {$nid = arg(1);}, um das nidund $node = node_load($nid);zu erhalten, damit Ihre Funktion funktioniert.
Sébastien Gicquel