7.x node.api.php hook_node_load($nodes, $types)

Act on arbitrary nodes being loaded from the database.

This hook should be used to add information that is not in the node or node revisions table, not to replace information that is in these tables (which could interfere with the entity cache). For performance reasons, information for all available nodes should be loaded in a single query where possible.

This hook is invoked during node loading, which is handled by entity_load(), via classes NodeController and DrupalDefaultEntityController. After the node information is read from the database or the entity cache, hook_load() is invoked on the node's content type module, then field_attach_load_revision() or field_attach_load() is called, then hook_entity_load() is invoked on all implementing modules, and finally hook_node_load() is invoked on all implementing modules.


$nodes: An array of the nodes being loaded, keyed by nid.

$types: An array containing the node types present in $nodes. Allows for an early return for modules that only support certain node types. However, if your module defines a content type, you can use hook_load() to respond to loading of just that content type.

For a detailed usage example, see nodeapi_example.module.

Related topics

7 functions implement hook_node_load()

Note: this list is generated by pattern matching, so it may include some functions that are not actually implementations of this hook.

book_node_load in modules/book/book.module
Implements hook_node_load().
comment_node_load in modules/comment/comment.module
Implements hook_node_load().
entity_crud_hook_test_node_load in modules/simpletest/tests/entity_crud_hook_test.module
Implements hook_node_load().
forum_node_load in modules/forum/forum.module
Implements hook_node_load().
node_access_test_node_load in modules/node/tests/node_access_test.module
Implements hook_node_load().

... See full list

2 invocations of hook_node_load()
field_attach_load in modules/field/field.attach.inc
Loads fields for the current revisions of a group of entities.
node_preview in modules/node/node.pages.inc
Generates a node preview.


modules/node/node.api.php, line 557
Hooks provided by the Node module.


function hook_node_load($nodes, $types) {

  // Decide whether any of $types are relevant to our purposes.
  if (count(array_intersect($types_we_want_to_process, $types))) {

    // Gather our extra data for each of these nodes.
    $result = db_query('SELECT nid, foo FROM {mytable} WHERE nid IN(:nids)', array(
      ':nids' => array_keys($nodes),

    // Add our extra data to the node objects.
    foreach ($result as $record) {
      $nodes[$record->nid]->foo = $record->foo;


andyceo’s picture

Calling node_access() inside hook_node_load() may cause infinite loop, when some implementation of hook_node_access() calling node_load() or entity_load().

For example, in Orgainc Groups module, og_node_access() call og_get_group() function, that may call og_load(), then og_load_mutiple() and finally entity_load().

It's okay to call node_load() and entity_load() inside hook_node_access().

tonebari’s picture

I have a module with a hyphen in the name. Using [module_name]_node_load, the function was not called.
I moved the call into another module without the hyphenated name, temporarily, but as it calls a table that is installed by my module: this is a hack at best. Anyone know why my hook was not called? Certainly it is not a no-no to name modules with hyphens in the name: I have seen this on many high visibility modules.

Scyther’s picture

Did you clear all cache?

cafuego’s picture

A module name cannot have a hyphen. Letters and underscores only. Numvers are permitted, but not as first character.

The reason is that the module name informs the function names of the hooks it implements, and in PHP the hyphen means minus ... it cannot be part of a function name.

You should rename your module.

jlpena123’s picture

I migrate using this code from PHP 5.2 to 5.4 but I got this error.

Warning: Creating default object from empty value in module_node_load()

I tried to instantiate the node object again using code below but it didn't work.

$nodes[$record->nid] = new stdClass();

Any ideas?

Thanks for the help.

Swarnendu-Dutta’s picture

I guess we have to use hook_entity_load for drupal 8.

tea.time’s picture

I'd guess you could use: hook_ENTITY_TYPE_load()