Como carregar um nó com base em seu título?


32

Eu sei apenas o título de um nó e quero carregar o nó usando node_load().

Como faço isso?


Se for uma página normal, você deve obter o NID, arg(1)pois será o nó / X para todas as páginas. e node_load()funciona apenas no NID #
2013 GoodSp33d

meu url é projetos / {nome de usuário} / {title nó}, é por isso que eu uso arg (2)
helxsz

em Drupal 7, você não pode usar node_load () para obter nó por ele do título, apenas nid
abd

Seus títulos são únicos?
Artur

Respostas:


17

No Drupal 6, você pode usar o seguinte código.

$node = node_load(array('title' => 'node title'));

Se você também conhece o tipo do nó, pode usar o seguinte código.

$node = node_load(array('title' => 'node title', 'type' => 'page'));

node_load () sempre retorna um único nó. Isso ocorre porque a função não faz loop no recurso de resultado da consulta ao banco de dados retornado de db_query () .

  if ($revision) {
    array_unshift($arguments, $revision);
    $node = db_fetch_object(db_query('SELECT ' . $fields . ' FROM {node} n INNER JOIN {users} u ON u.uid = n.uid INNER JOIN {node_revisions} r ON r.nid = n.nid AND r.vid = %d WHERE ' . $cond, $arguments));
  }
  else {
    $node = db_fetch_object(db_query('SELECT ' . $fields . ' FROM {node} n INNER JOIN {users} u ON u.uid = n.uid INNER JOIN {node_revisions} r ON r.vid = n.vid WHERE ' . $cond, $arguments));
  }

3
@sokratis Lembre-se de que os títulos não precisam ser exclusivos e podem ser alterados a qualquer momento. Se você puder alternar para a referência pelo ID do nó, isso seria mais seguro.
David L

4
Drupal não é fã do CamelCase.
Sivaji 28/06

1
Este exemplo também simplesmente não funcionará no D7. node_load(). Edite a tag de pergunta para refletir isso.
Chapabu 28/05

3
Versão D7 (embora usando o $conditionsparâmetro preterido ):$nodes = node_load_multiple(array(), array('title' => 'node title'));
Clive

47

No Drupal 7, os parâmetros para node_load()foram alterados. Para obter os nós que correspondem a algumas condições, você deve usar a classe EntityFieldQuery .

$query = new EntityFieldQuery();


 $entities = $query->entityCondition('entity_type', 'node')
  ->propertyCondition('type', 'your_node_type')
  ->propertyCondition('title', 'your node title')
  ->propertyCondition('status', 1)
  ->range(0,1)
  ->execute();

  if (!empty($entities['node'])) {
    $node = node_load(array_shift(array_keys($entities['node'])));
  }

1
node_load (array ('title' => 'node title', 'type' => 'page')) - isso ficará obsoleto em breve, portanto, esta resposta está correta.
Nikit

1
Isso é muito longo para carregar um único nó; /
kenorb

12

Drupal 7

Aqui está uma maneira mais simples (como já sugerido por Clive e no SO ):

$nodes = node_load_multiple(NULL, array("title" => "Foo Bar"));
$node = current($nodes);

e muito mais fácil de lembrar do que usar EntityFieldQuery classe .

Consulte também: Obtendo programaticamente nós por título no Drupal 7 no SO


1
essa deve ser a resposta aceita!
Alex Skrypnyk

3
agradável abordagem, unfortunalty intented de morrer, como exposto em [ api.drupal.org/api/drupal/modules%21node%21node.module/function/... (função node_load_multiple) @todo Remove $conditions in Drupal 8.
Augusto

10

No Drupal 7, você pode usar código semelhante ao seguinte.

$result = db_query("SELECT n.nid FROM {node} n WHERE n.title = :title AND n.type = :type", array(":title"=> $title, ":type"=> $type));  
$nid = $result->fetchField();

de nada: D.
abd

6

No Drupal 8, execute o seguinte:

$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties(['title' => $title]);
foreach ( $nodes as $node ) {
  $node->doSomething(...);
}

$node será um objeto de nó totalmente instanciado.


1

Também em Drupal 8

$nids = \Drupal::entityQuery('node')
->condition('title', 'YourNodeTitle')
->sort('nid', 'DESC')
->execute();

e a seguir:

$node = \Drupal\node\Entity\Node::load(HEREYOUNODEID);

Não esqueça que você precisa

use Drupal\node\Entity\Node;
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.