如何根据其标题加载节点?


32

我只知道节点的标题,并且想使用加载节点node_load()

我怎么做?


如果它是正常页面,则应该在arg(1)其中获得NID,即所有页面的node / X。并且node_load()仅适用于NID
GoodSp33d 2012年

我的网址是projects / {username} / {node title},这就是为什么我使用arg(2)
helxsz 2012年

在drupal 7中,您不能仅通过nid使用node_load()来获得node的标题,即
abd

您的头衔独特吗?
阿图尔

Answers:


17

在Drupal 6中,可以使用以下代码。

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

如果您也知道节点的类型,则可以使用以下代码。

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

node_load()始终返回单个节点。那是因为该函数不会遍历从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请记住,标题不必唯一,可以随时更改。如果您可以切换为按节点ID进行引用,那将更加安全。
David L

4
Drupal不喜欢CamelCase。
Sivaji

1
此示例也只能在D7中正常使用。node_load()。编辑了问号以反映这一点。
Chapabu 2012年

3
D7版本(尽管使用了不建议使用的$conditions参数):$nodes = node_load_multiple(array(), array('title' => 'node title'));
Clive

47

在Drupal 7中,的参数node_load()已更改。要获取符合某些条件的节点,应使用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'))-这很快就会过时,所以这个答案是正确的。
Nikit 2014年

1
为了加载单个节点,这太长了; /
kenorb

12

Drupal 7

这是一种更简单的方法(正如CliveSO所建议的那样):

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

并且比使用EntityFieldQuery类更容易记住。

另请参见:在SO的Drupal 7中编程方式按标题获取节点


1
这应该是公认的答案!
Alex Skrypnyk '16

3
不错的方法,不幸死了,如[ api.drupal.org/api/drupal/modules%21node%21node.module/function/… (函数node_load_multiple)中 所公开的那样@todo Remove $conditions in Drupal 8.
augusto

10

在Drupal 7中,可以使用类似于以下代码的代码。

$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();

不客气:D。
2012年

6

在Drupal 8中,运行以下命令:

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

$node 将是完全实例化的节点对象。


1

同样在Drupal 8中

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

接下来:

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

不要忘记你的需要

use Drupal\node\Entity\Node;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.