ノードに割り当てられているすべての分類用語のリストを取得するにはどうすればよいですか?


13

ノードがあり、ノードに割り当てられているすべての分類用語を取得したい。

drupal 6では使用できますが$node->taxonomytaxonomy_*機能はdrupal 7には存在しません。

回答:


21

分類用語は、Drupal 7のフィールドに実装されています。コンテンツタイプにfield_categoryという名前の分類フィールドを定義している場合、次のようにアクセスできます。

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

フィールド名にアクセスできない場合、おそらくノードの最も簡単な方法は、データベースに直接照会することです。

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

ただし、分類フィールドが複数ある場合は、さまざまな語彙から寄せ集めの用語を扱うことになります。


分類フィールド名がわからない場合はどうなりますか?名前はコンテンツタイプによって異なるため、任意のノードのすべての用語を取得します。
-Rwky

1
フィールド名がわからない場合のメソッドを追加しました。
キース

4
特に2番目のバージョンでtaxonomy_term_load_multiple($results->fetchCol());は、1つのクエリで用語を読み込むために使用できます。
ベルディール

1
ああ、あなたfield_get_items('node', $node, 'field_category')は正しい言語でフィールドを取得するために使用できます。
ベルディール

taxonomy_indexからの選択手法は、公開されたノードでのみ機能することに注意してください。そのテーブルは、非公開コンテンツに対しては維持されません。
デイブコーエン

2

以下は、フィールド名を指定して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;
}

Drupalの初心者のために、私は追加することになりif (arg(0) == 'node' && is_numeric(arg(1))) {$nid = arg(1);}得るために、nidそして$node = node_load($nid);あなたの関数が仕事にするために。
セバスチャンギケル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.