Как перебрать все узлы из типа контента

22

Я хочу восстановить некоторую информацию из поля всех узлов определенного типа контента. Я знаю, как это сделать, используя db_queryи получая все идентификаторы узлов, а затем перебирать их. Я хотел бы знать, есть ли другой способ обойти это, используя функции drupal.

drcelus
источник

Ответы:

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 предоставляет класс под названием 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
  }
}

чтобы не загружать слишком много сразу, что может вызвать проблемы с памятью.

mpdonadio
источник