| 5 node.module | node_load($param = array(), $revision = NULL, $reset = NULL) |
| 6 node.module | node_load( |
| 7 node.module | node_load($nid = NULL, $vid = NULL, $reset = FALSE) |
| 8 node.module | node_load($nid = NULL, $vid = NULL, $reset = FALSE) |
Load a node object from the database.
Parameters
$param: Either the nid of the node or an array of conditions to match against in the database query
$revision: Which numbered revision to load. Defaults to the current version.
$reset: Whether to reset the internal node_load cache.
Return value
A fully-populated node object.
44 calls to node_load()
File
- modules/
node/ node.module, line 709 - The core that allows content to be submitted to the site. Modules and scripts may programmatically submit nodes using the usual form API pattern.
Code
function node_load($param = array(), $revision = NULL, $reset = NULL) {
static $nodes = array();
if ($reset) {
$nodes = array();
}
$cachable = ($revision == NULL);
$arguments = array();
if (is_numeric($param)) {
if ($cachable) {
// Is the node statically cached?
if (isset($nodes[$param])) {
return is_object($nodes[$param]) ? drupal_clone($nodes[$param]) : $nodes[$param];
}
}
$cond = 'n.nid = %d';
$arguments[] = $param;
}
elseif (is_array($param)) {
// Turn the conditions into a query.
foreach ($param as $key => $value) {
$cond[] = 'n.' . db_escape_table($key) . " = '%s'";
$arguments[] = $value;
}
$cond = implode(' AND ', $cond);
}
else {
return FALSE;
}
// Retrieve a field list based on the site's schema.
$fields = drupal_schema_fields_sql('node', 'n');
$fields = array_merge($fields, drupal_schema_fields_sql('node_revisions', 'r'));
$fields = array_merge($fields, array('u.name', 'u.picture', 'u.data'));
// Remove fields not needed in the query: n.vid and r.nid are redundant,
// n.title is unnecessary because the node title comes from the
// node_revisions table. We'll keep r.vid, r.title, and n.nid.
$fields = array_diff($fields, array('n.vid', 'n.title', 'r.nid'));
$fields = implode(', ', $fields);
// Rename timestamp field for clarity.
$fields = str_replace('r.timestamp', 'r.timestamp AS revision_timestamp', $fields);
// Change name of revision uid so it doesn't conflict with n.uid.
$fields = str_replace('r.uid', 'r.uid AS revision_uid', $fields);
// Retrieve the node.
// No db_rewrite_sql is applied so as to get complete indexing for search.
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));
}
if ($node && $node->nid) {
// Call the node specific callback (if any) and piggy-back the
// results to the node or overwrite some values.
if ($extra = node_invoke($node, 'load')) {
foreach ($extra as $key => $value) {
$node->$key = $value;
}
}
if ($extra = node_invoke_nodeapi($node, 'load')) {
foreach ($extra as $key => $value) {
$node->$key = $value;
}
}
if ($cachable) {
$nodes[$node->nid] = is_object($node) ? drupal_clone($node) : $node;
}
}
return $node;
}
Login or register to post comments
Comments
Return = False if nid is not valid
Note that this function returns a (bool) FALSE if the node is not found.
Loading lots of nodes
If you are loading a *lot* of nodes with node_load(), make sure to use the $reset parameter so that every node isn't kept in the function's static cache (and increasing memory usage):
<?phpnode_load($nid, NULL, TRUE);
?>
Specifically, what that does
Specifically, what that does is clear node_load()'s cache before adding the node to be loaded to it. That means that there will always be at least one loaded node in the cache if you load nodes this way. If you want to clear the cache for good, try:
<?phpnode_load(FALSE, NULL, TRUE);
?>
…which will return FALSE. (The first parameter could also be NULL, or anything else that isn't an array, number, or numeric string.)
Caching depends on parameter form
Often modules load nodes using the following construct:
<?php$node = node_load(array("nid" => $nid));
?>
If I understand the function code correctly, this calling form will always do a database call, i.e. it will bypass caching.
Yes, but...
Yes, it will always do a database call, but it will still store the result in the static variable. If you want to make sure the cache doesn't get too big, you have to set $reset to TRUE at least some of the time.
menu_get_object: Get a loaded object from a router item. => menu
http://api.drupal.org/api/function/menu_get_object/6
menu_get_object()
http://api.drupal.org/api/function/menu_get_object/6
is beautiful... no icky node_load() calls. Thank you wils.solutions!
It seems node_load is always
It seems node_load is always calling taxonomy_node_get_terms, even if no taxonomy is associated with that node. Is this a bug?
You can see it here
http://api.drupal.org/api/drupal/modules--taxonomy--taxonomy.module/func...
load node by param example d6
to load a node by a param of the node, as vid (revision):
$node = node_load(array('vid' => $myVID));