Come scorrere su tutti i nodi da un tipo di contenuto


22

Voglio recuperare alcune informazioni da un campo di tutti i nodi di un tipo di contenuto specifico. So come farlo usando a db_querye ottenendo tutto l'ID nodo quindi ripetendo su di essi. Quello che vorrei sapere è se c'è un altro modo per aggirare questo usando le funzioni drupal.

Risposte:


28

È possibile richiedere tali informazioni direttamente tramite node_load_multiple()

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

Puoi aggiungere $conditionsall'array tutte le condizioni di proprietà (secondo argomento) che desideri, quindi anche lo stato, la creazione, ecc. Sono un gioco equo.

$conditionsè tecnicamente deprecato (immagino a favore di EntityFieldQuery) ma le possibilità che tale funzionalità venga mai rimossa da Drupal 7 non sono praticamente nessuna. Si spezzerebbe troppo.


3
È andato in Drupal 8, però.
mpdonadio

Accetterò questa risposta poiché è esattamente quello che stavo cercando, ma userò la soluzione @MPD perché funzionerà anche con Drupal 8 :)
drcelus,

@drcelus Sì, il metodo MPD è sicuramente il modo migliore di procedere, probabilmente avrei dovuto menzionarlo - EntityFieldQueryfino in fondo :) L'ho messo più per i posteri che per qualsiasi altra cosa
Clive

1
entity_load_multipleesiste in D8. Tuttavia, non è possibile caricare per proprietà.

Grazie per il chiarimento. Intendevo dire che $ $ è passata da D8.
mpdonadio

34

Drupal core fornisce una classe chiamata EntityFieldQuery(). C'è anche una comoda pagina di documento per usarlo, che ha molti esempi. Nella sua forma più semplice:

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

Questo caricherà tutti i nodi pubblicati di tipo "pagina". È necessario regolarlo periodicamente su

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

per evitare di caricare troppo contemporaneamente, il che può causare problemi di memoria.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.