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.

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.