web-dev-qa-db-ja.com

コンテンツタイプからすべてのノードを反復処理する方法

特定のコンテンツタイプのすべてのノードのフィールドから一部の情報を回復したい。 db_queryを使用してすべてのノードIDを取得し、それらを反復処理する方法を知っています。私が知りたいのは、drupal関数を使用してこれを回避する別の方法があるかどうかです。

22
drcelus

node_load_multiple() を介してその情報を直接クエリできます

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

$conditions配列(2番目の引数)に必要なだけプロパティ条件を追加できるため、ステータス、作成済みなども公平なゲームです。

$conditionsは技術的には非推奨ですが(EntityFieldQueryを支持することを想像します)、Drupal 7からその機能が削除される可能性は基本的にありません。これも壊れます。たくさん。

28
Clive

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

メモリの問題を引き起こす可能性のある、一度にロードしすぎないようにします。

34
mpdonadio