タイトルに基づいてノードをロードする方法は?


32

ノードのタイトルしかわからないので、を使用してノードをロードしますnode_load()

それ、どうやったら出来るの?


通常のページの場合、NIDを取得する必要がありarg(1)、すべてのページでnode / Xになります。node_load()NIDのみで動作します
-GoodSp33d

私のurlはprojects / {username} / {node title}であるため、arg(2)を使用する理由
helxsz

Drupalの7であなただけのNIDによって、それのタイトルノードを取得するために)(node_loadを使用することはできません
ABD

あなたのタイトルはユニークですか?
アルトゥール

回答:


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による参照に切り替えることができる場合は、より安全です。
デビッドL

4
DrupalはCamelCaseのファンではありません。
シヴァジ

1
また、この例はD7では機能しません。node_load()。これを反映するように質問タグを編集しました。
チャパブ

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'))-これはまもなく廃止されるため、この答えは正しいです。
ニキット14

1
これは、単一のノードをロードするために非常に長い; /
kenorb

12

Drupal 7

ここに、より簡単な方法があります(すでにCliveSOで提案されています):

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

EntityFieldQueryクラスを使用するよりもはるかに覚えやすいです。

参照:SO でのDrupal 7でのタイトルによるプログラムによるノードの取得


1
これは受け入れられた答えであるはずです!
アレックスSkrypnyk

3
【に曝されるようunfortunalty、ダイにintented素敵なアプローチ、api.drupal.org/api/drupal/modules%21node%21node.module/function/... (機能node_load_multiple) @todo Remove $conditions in Drupal 8.
アウグスト

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。
アブド

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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.