7

How to get nodeid in Drupal for the current page without using the information from the page url? I.e.:

if(arg(0)=='node' && is_numeric(arg(1))){
  $nid = arg(1);
}

I do not want to use the above approach.

6 Answers 6

16

Still comes through the URL indirectly, but this is the easiest way to get it: menu_get_object.

<?
if ($node = menu_get_object()) {
 $nid = $node->nid;
}
?>

Note that if there is a node, it was already loaded by the menu system anyway and this is loaded from the static cache.

1
  • 2
    This approach makes sure the id is valid and accessible, as @chx points out. But can also be very heavy: it often results in many DB-calls. Just last week I replaced one $node = menu_get_object() with something similar to code original question, saving 500+ database requests per page. Use with care!
    – berkes
    Jan 31, 2011 at 21:12
1

Unless there is some technical reason why the arg() method is unavailable (or you NEED to check access as in other posts), the arg() method is the simplest and quickest.

If you then need additional properties you can run a node_load() to get the ID. Assuming you are trying to get the current node, this has pretty much no performance hit.

0

You can get the node's ID by calling $node->nid. Indeed, getting the ID from the URL is not the best solution because you may some day switch to more SEO-friendly URLs.

From this documentation, it looks like $node is defined in page.tpl.php, so it should be available to you.

<?php
  // In a template file...

  if ($node) {
    echo $node->nid;
  }
  else {
    // you are viewing taxonomy, view, etc
  }
?>
3
  • I need to access it outside of the template file.
    – user550265
    Jan 31, 2011 at 20:24
  • Where are you trying to access it from, a module? Under what context are we talking about the "current page"?
    – zourtney
    Jan 31, 2011 at 20:29
  • It should be noted that if the 'internal' url is node/12 and you use path to create a clean url the original code still works this is because the drupal node/12 path is still the url as far as the system is concerned.
    – mirzu
    Feb 1, 2011 at 18:42
0

Easiest way to do this in Drupal 8:

$path_args = explode('/', current_path());
print $path_args[1];
0

Another pretty straight forward and reliable approach in D7 would be

<?php
if (isset($node->nid) && count($node->nid) > 0){
  $nodeid = $node->nid;
}
?>

Zourtney's suggestion causes an undefined index error in my case.

0

Yes, that confused me for ages, but using the arg array should work in almost all circumstances, and Drupal takes care of the conversion from the actual url created by path or pathauto.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.