Bagaimana cara saya mendapatkan daftar semua istilah taksonomi yang ditugaskan ke sebuah simpul?

13

Saya memiliki simpul dan ingin mendapatkan semua istilah taksonomi yang ditugaskan ke simpul.

Di drupal 6 saya bisa menggunakan $node->taxonomydan taxonomy_*fungsinya tetapi ini tidak ada di drupal 7.

Rwky
sumber

Jawaban:

21

Istilah taksonomi diterapkan di bidang dalam Drupal 7. Dengan asumsi Anda telah mendefinisikan bidang taksonomi bernama field_category untuk jenis konten Anda, Anda dapat mengaksesnya sebagai:

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

Jika Anda tidak memiliki akses ke nama bidang, mungkin cara termudah untuk node adalah dengan menanyakan database secara langsung:

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

Perlu diingat, bahwa Anda mungkin akhirnya berurusan dengan tumpukan istilah dari berbagai kosa kata jika Anda memiliki lebih dari satu bidang taksonomi.

keithm
sumber
Bagaimana jika saya tidak tahu nama bidang taksonomi? Nama-nama akan berbeda antara tipe konten dan saya ingin mendapatkan semua persyaratan untuk simpul apa pun.
Rwky
1
Menambahkan metode jika Anda tidak tahu nama bidangnya.
keithm
4
Terutama di versi kedua, Anda dapat menggunakan taxonomy_term_load_multiple($results->fetchCol());untuk memuat istilah dalam satu permintaan.
Berdir
1
Oh, dan Anda bisa menggunakan field_get_items('node', $node, 'field_category')untuk mendapatkan bidang dalam bahasa yang benar.
Berdir
Perhatikan teknik select from taxonomy_index hanya berfungsi dengan node yang dipublikasikan. Tabel itu tidak dikelola untuk konten yang tidak dipublikasikan.
Dave Cohen
2

Berikut cara yang sangat umum untuk mengambil semua istilah tanpa menentukan nama bidang dan tidak ada 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
sumber
Untuk pemula Drupal, saya akan menambahkan if (arg(0) == 'node' && is_numeric(arg(1))) {$nid = arg(1);}untuk mendapatkan niddan $node = node_load($nid);untuk membuat fungsi Anda berfungsi.
Sébastien Gicquel