Jak iterować po wszystkich węzłach z typu zawartości

22

Chcę odzyskać niektóre informacje z pola wszystkich węzłów określonego typu zawartości. Wiem, jak to zrobić za pomocą a db_queryi uzyskać cały identyfikator węzła, a następnie iterować nad nimi. Chciałbym wiedzieć, czy istnieje inny sposób na skorzystanie z funkcji drupal.

drcelus
źródło

Odpowiedzi:

28

Możesz zapytać o te informacje bezpośrednio przez node_load_multiple()

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

Możesz dodać dowolną liczbę warunków właściwości do $conditionstablicy (drugi argument), więc status, utworzone itp. Są również uczciwą grą.

$conditionsjest technicznie przestarzałe (wyobrażam sobie na korzyść EntityFieldQuery), ale szanse, że ta funkcjonalność kiedykolwiek zostanie usunięta z Drupala 7, są w zasadzie żadne. Za bardzo by się zepsuło.

Clive
źródło
3
Nie ma go jednak w Drupal 8.
mpdonadio
Przyjmę tę odpowiedź, ponieważ dokładnie tego szukałem, ale użyję rozwiązania @MPD, ponieważ będzie ono również działać z
Drupalem
@drcelus Tak Metoda MPD jest zdecydowanie najlepszą drogą, prawdopodobnie powinienem wspomnieć, że - EntityFieldQuerydo końca :) Włożyłem to bardziej dla potomności niż cokolwiek innego
Clive
1
entity_load_multipleistnieje w D8. Nie można jednak załadować według właściwości.
Dziękuję za wyjaśnienie. Miałem na myśli to, że $ warunki zniknęły z D8.
mpdonadio
34

Rdzeń Drupala zapewnia klasę o nazwie EntityFieldQuery(). Istnieje również przydatna strona dokumentu do jej używania, która zawiera wiele przykładów. W najprostszej formie:

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

Spowoduje to załadowanie wszystkich opublikowanych węzłów typu „strona”. Musisz okresowo to dostosowywać

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

aby uniknąć zbyt dużego ładowania na raz, co może powodować problemy z pamięcią.

mpdonadio
źródło