Cómo iterar sobre todos los nodos de un tipo de contenido

22

Quiero recuperar información de un campo de todos los nodos de un tipo de contenido específico. Sé cómo hacerlo usando a db_queryy obteniendo toda la ID del nodo y luego iterar sobre ellos. Lo que me gustaría saber es si hay otra forma de evitar esto usando las funciones de drupal.

drcelus
fuente

Respuestas:

28

Puede consultar esa información directamente a través de node_load_multiple()

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

Puede agregar tantas condiciones de propiedad a la $conditionsmatriz (segundo argumento) como desee, por lo que el estado, la creación, etc. también son un juego justo.

$conditionsestá técnicamente en desuso (me imagino a favor EntityFieldQuery), pero las posibilidades de que esa funcionalidad se elimine de Drupal 7 son básicamente ninguna. Se rompería demasiado.

Clive
fuente
3
Sin embargo, se fue en Drupal 8.
mpdonadio
Aceptaré esta respuesta ya que es exactamente lo que estaba buscando, pero usaré la solución @MPD porque también funcionará con Drupal 8 :)
drcelus
@drcelus Sí, el método de MPD es definitivamente el mejor camino a seguir, probablemente debería haber mencionado que, en EntityFieldQuerytodo momento :) Puse esto es más para la posteridad que cualquier otra cosa
Clive
1
entity_load_multipleexiste en D8. Sin embargo, no puede cargar por propiedades.
Gracias por la aclaración. Quise decir que $ condiciones se han ido de D8.
mpdonadio
34

El núcleo de Drupal proporciona una clase llamada EntityFieldQuery(). También hay una página de documento útil para usarlo, que tiene muchos ejemplos. En su forma más 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
  }
}

Esto cargará todos los nodos publicados del tipo "página". Periódicamente necesita ajustar esto a

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

para evitar cargar demasiado de una vez, lo que puede causar problemas de memoria.

mpdonadio
fuente