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


22

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

回答:


28

その情報を直接クエリすることができます node_load_multiple()

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

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

$conditions技術的には非推奨です(私はに賛成EntityFieldQueryすると思います)が、Drupal 7からその機能が削除される可能性は基本的にありません。それはあまりにも壊れます。


3
ただし、Drupal 8では削除されています。
mpdonadio

私が探していたものであるため、この答えを受け入れますが、Drupal 8でも動作するため@MPDソリューションを使用します:)
drcelus

@drcelusはいMPDの方法は間違いなく行くための最良の方法ですが、私はおそらくことを言及している必要があります- EntityFieldQueryすべての方法を:)私は、これは何よりも後世のためのより多くのである置く
クライヴ

1
entity_load_multipleD8に存在します。ただし、プロパティで読み込むことはできません。

説明をありがとう。D8から$ conditionsがなくなったことを意味しました。
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
  }
}

一度に大量にロードすることを避けるため、メモリの問題を引き起こす可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.