Як перебрати всі вузли типу вмісту


22

Я хочу відновити деяку інформацію з поля всіх вузлів певного типу вмісту. Я знаю, як це зробити за допомогою a db_queryі отримуючи весь ідентифікатор вузла, а потім перебирати їх. Що я хотів би знати, якщо є інший шлях для цього за допомогою функцій drupal.

Відповіді:


28

Ви можете запитувати цю інформацію безпосередньо через node_load_multiple()

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

Ви можете додати до $conditionsмасиву (другий аргумент) стільки умов властивостей, скільки вам подобається, тому статус, створений тощо є також чесною грою.

$conditionsтехнічно застаріла (я думаю, на користь EntityFieldQuery), але шанси на те, що функціонал коли-небудь буде видалений з Drupal 7, в основному немає. Це занадто зламається.


3
Це, однак, в Drupal 8, хоча.
mpdonadio

Я прийму цю відповідь, оскільки це саме те, що я шукав, але буду використовувати @MPD рішення, оскільки він також буде працювати з Drupal 8 :)
drcelus

@drcelus Так, метод MPD, безумовно, найкращий шлях, я, мабуть, мав би зазначити, що - EntityFieldQueryдо кінця :) Я вважаю, що це більше для нащадків, ніж все інше
Клайв

1
entity_load_multipleіснує в D8. Однак ви не можете завантажувати властивості.

Дякуємо за роз’яснення. Я мав на увазі, що $ умови пішли від D8.
mpdonadio

34

Drupal core забезпечує клас під назвою EntityFieldQuery(). Існує також зручна сторінка документа для її використання, на якій є багато прикладів. У своєму найпростішому вигляді:

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

Це завантажить усі опубліковані вузли типу "сторінка". Вам потрібно періодично коригувати це

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

щоб не завантажувати занадто багато одразу, що може спричинити проблеми з пам'яттю.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.