如何从内容类型遍历所有节点


22

我想从特定内容类型的所有节点的字段中恢复一些信息。我知道如何使用a db_query并获取所有节点ID,然后遍历它们。我想知道的是,使用drupal函数是否还有另一种解决方法。

Answers:


28

您可以直接通过以下方式查询该信息 node_load_multiple()

$nodes = node_load_multiple(array(), array('type' => 'my_type'));

您可以根据需要向$conditions数组(第二个参数)添加尽可能多的属性条件,因此状态,创建等也很公平。

$conditions在技​​术上已弃用(我想赞成EntityFieldQuery),但是从Drupal 7中删除该功能的可能性基本上没有。它会破裂太多。


3
不过,它在Drupal 8中消失了。
mpdonadio

我将接受此答案,因为它正是我所要的,但是将使用@MPD解决方案,因为它也可与Drupal 8一起使用:)
drcelus 2013年

@drcelus是的,MPD的方法绝对是最好的方法,我可能应该一直提到- EntityFieldQuery一直:)我说的是,后代比什么都重要
Clive

1
entity_load_multiple存在于D8中。但是,您无法按属性加载。

感谢您的澄清。我确实是说$ conditions从D8中消失了。
mpdonadio

34

Drupal核心提供了一个名为的类EntityFieldQuery()。还有一个方便使用的文档页面,其中包含许多示例。最简单的形式:

$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'page')
  ->propertyCondition('status', 1);

$result = $query->execute();

if (!empty($result['node'])) {
  $nids = array_keys($result['node']);
  $nodes = node_load_multiple($nids);

  foreach ($nodes as $node) {
    // do something awesome
  }
}

这将加载“页面”类型的所有已发布节点。您需要定期对此进行调整

$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'page')
  ->propertyCondition('status', 1);

$result = $query->execute();

if (!empty($result['node'])) {
  $nids = array_keys($result['node']);

 foreach ($nids as $nid) {
    $node = node_load($nid, NULL, TRUE);
    // do something awesome
  }
}

以避免一次加载太多,这可能会导致内存问题。

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.