¿Cómo cargar un nodo en función de su título?


32

Solo sé el título de un nodo y quiero cargar el nodo usando node_load().

¿Cómo puedo hacer eso?


Si arg(1)se trata de una página normal, debe obtener el NID , será nodo / X para todas las páginas. y node_load()funciona solo con NID
GoodSp33d

mi url es projects / {username} / {node title}, es por eso que uso arg (2)
helxsz

en drupal 7 no puede usar node_load () para obtener el nodo por su título, solo por nid
abd

¿Tus títulos son únicos?
Artur

Respuestas:


17

En Drupal 6, puede usar el siguiente código.

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

Si también conoce el tipo de nodo, puede usar el siguiente código.

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

node_load () siempre devuelve un solo nodo. Esto se debe a que la función no recorre el recurso de resultado de consulta de la base de datos devuelto por 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 Tenga en cuenta que los títulos no tienen que ser únicos y pueden cambiarse en cualquier momento. Si puede cambiar a la referencia por id de nodo, sería más seguro.
David L

44
Drupal no es fanático de CamelCase.
Sivaji

1
Este ejemplo también simplemente no funcionará en D7. node_load(). Han editado la etiqueta de pregunta para reflejar esto.
Chapabu

3
Versión D7 (aunque utilizando el $conditionsparámetro obsoleto ):$nodes = node_load_multiple(array(), array('title' => 'node title'));
Clive

47

En Drupal 7, los parámetros para node_load()han cambiado. Para obtener los nodos que coinciden con algunas condiciones, debe usar la clase 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')) - esto quedará obsoleto pronto, por lo que esta respuesta es correcta.
Nikit

1
Esto es tan largo para cargar un solo nodo; /
kenorb

12

Drupal 7

Aquí hay una manera más simple (como ya lo sugirió Clive y SO ):

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

y mucho más fácil de recordar que usar la clase EntityFieldQuery .

Consulte también: Obtención programática de nodos por título en Drupal 7 en SO


1
¡Esta debería ser la respuesta aceptada!
Alex Skrypnyk

3
enfoque agradable, unfortunalty intented a morir, como se expone en [ api.drupal.org/api/drupal/modules%21node%21node.module/function/... (función node_load_multiple) @todo Remove $conditions in Drupal 8.
augusto

10

En Drupal 7, puede usar un código similar al siguiente.

$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

En Drupal 8, ejecute esto:

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

$node será un objeto de nodo completamente instanciado.


1

También en Drupal 8

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

y después:

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

No olvides que necesitas

use Drupal\node\Entity\Node;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.