如何获得分配给节点的所有分类术语的列表?


13

我有一个节点,想要获取分配给该节点的所有分类术语。

在drupal 6中,我可以使用$node->taxonomytaxonomy_*函数,但是在drupal 7中不存在。

Answers:


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

但请记住,如果您有多个分类法字段,那么最终可能会遇到来自不同词汇表的混杂术语。


如果我不知道分类字段名怎么办?内容类型之间的名称将有所不同,我想获取任何节点的所有术语。
2011年

1
如果您不知道字段名称,则添加了一种方法。
keithm 2011年

4
特别是在第二版中,您可以用来taxonomy_term_load_multiple($results->fetchCol());在单个查询中加载术语。
2011年

1
哦,您可以使用field_get_items('node', $node, 'field_category')来获取正确语言的字段。
2011年

注意,taxonomy_index技术中的select仅适用于已发布的节点。该表不维护未发布的内容。
Dave Cohen

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);为了使你的函数工作。
塞巴斯蒂安吉凯尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.