Como iterar sobre todos os nós de um tipo de conteúdo

22

Quero recuperar algumas informações de um campo de todos os nós de um tipo de conteúdo específico. Eu sei como fazê-lo usando um db_querye obtendo todo o ID do nó e iterar sobre eles. O que eu gostaria de saber é se existe outra maneira de contornar isso usando funções drupal.

drcelus
fonte

Respostas:

28

Você pode consultar essas informações diretamente através node_load_multiple()

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

Você pode adicionar tantas condições de propriedade à $conditionsmatriz (segundo argumento) quanto desejar, para que status, criado, etc. também sejam um jogo justo.

$conditionsé tecnicamente reprovado (imagino a favor de EntityFieldQuery), mas as chances dessa funcionalidade ser removida do Drupal 7 são basicamente inexistentes. Isso iria quebrar demais.

Clive
fonte
3
É no Drupal 8, no entanto.
mpdonadio
Eu vou aceitar essa resposta, uma vez que é exatamente o que eu estava procurando, mas vai usar a solução @MPD porque vai também trabalhar com Drupal 8 :)
drcelus
@drcelus método de Sim MPD é definitivamente a melhor maneira de ir, eu provavelmente deveria ter mencionado que - EntityFieldQuerytodo o caminho :) Eu coloquei isso é mais para a posteridade que qualquer outra coisa
Clive
11
entity_load_multipleexiste em D8. Você não pode carregar por propriedades.
Obrigado pelo esclarecimento. Eu quis dizer que $ conditions desapareceu do D8.
mpdonadio
34

O núcleo Drupal fornece uma classe chamada EntityFieldQuery(). Há também uma página de documento útil para usá-lo, com muitos exemplos. Na sua forma mais simples:

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

Isso carregará todos os nós publicados do tipo "página". Periodicamente, é necessário ajustar isso para

$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 carregar muito de uma só vez, o que pode causar problemas de memória.

mpdonadio
fonte