Comment itérer sur tous les nœuds d'un type de contenu

22

Je veux récupérer des informations à partir d'un champ de tous les nœuds d'un type de contenu spécifique. Je sais comment le faire en utilisant un db_queryet en obtenant tous les ID de nœud, puis itérer dessus. Ce que j'aimerais savoir, c'est s'il y a un autre moyen de contourner cela en utilisant les fonctions drupal.

drcelus
la source

Réponses:

28

Vous pouvez interroger ces informations directement via node_load_multiple()

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

Vous pouvez ajouter autant de conditions de propriété au $conditionstableau (deuxième argument) que vous le souhaitez, afin que le statut, créé, etc. soit également un jeu équitable.

$conditionsest techniquement obsolète (j'imagine en faveur de EntityFieldQuery), mais les chances que cette fonctionnalité soit supprimée de Drupal 7 sont pratiquement nulles. Cela casserait trop.

Clive
la source
3
Il a disparu dans Drupal 8, cependant.
mpdonadio
J'accepterai cette réponse car c'est exactement ce que je cherchais, mais j'utiliserai la solution @MPD car elle fonctionnera également avec Drupal 8 :)
drcelus
@drcelus Oui, la méthode MPD est certainement la meilleure voie à suivre, j'aurais probablement dû mentionner que - EntityFieldQuerytout le chemin :) Je mets cela pour plus de postérité qu'autre chose
Clive
1
entity_load_multipleexiste en D8. Cependant, vous ne pouvez pas charger par propriétés.
Merci pour la clarification. Je voulais dire que $ conditions a disparu de D8.
mpdonadio
34

Le noyau Drupal fournit une classe appelée EntityFieldQuery(). Il y a aussi une page de document pratique pour l'utiliser, qui a beaucoup d'exemples. Dans sa forme la plus simple:

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

Cela chargera tous les nœuds publiés de type "page". Vous devez périodiquement l'ajuster à

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

pour éviter de charger trop à la fois, ce qui peut entraîner des problèmes de mémoire.

mpdonadio
la source