Community Documentation

node_delete

5 node.module node_delete($nid)
6 node.module node_delete($nid)
7 node.module node_delete($nid)
8 node.module node_delete($nid)

Delete a node.

▾ 4 functions call node_delete()

blogapi_blogger_delete_post in modules/blogapi/blogapi.module
Blogging API callback. Removes the specified blog node.
forum_taxonomy in modules/forum/forum.module
Implementation of hook_taxonomy().
node_delete_confirm_submit in modules/node/node.pages.inc
Execute node deletion
node_multiple_delete_confirm_submit in modules/node/node.admin.inc

File

modules/node/node.module, line 974
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

<?php
function node_delete($nid) {

  // Clear the cache before the load, so if multiple nodes are deleted, the
  // memory will not fill up with nodes (possibly) already removed.
  $node = node_load($nid, NULL, TRUE);

  if (node_access('delete', $node)) {
    db_query('DELETE FROM {node} WHERE nid = %d', $node->nid);
    db_query('DELETE FROM {node_revisions} WHERE nid = %d', $node->nid);
    db_query('DELETE FROM {node_access} WHERE nid = %d', $node->nid);

    // Call the node-specific callback (if any):
    node_invoke($node, 'delete');
    node_invoke_nodeapi($node, 'delete');

    // Clear the page and block caches.
    cache_clear_all();

    // Remove this node from the search index if needed.
    if (function_exists('search_wipe')) {
      search_wipe($node->nid, 'node');
    }
    watchdog('content', '@type: deleted %title.', array('@type' => $node->type, '%title' => $node->title));
    drupal_set_message(t('@type %title has been deleted.', array('@type' => node_get_types('name', $node), '%title' => $node->title)));
  }
}
?>

Comments

Note that node_delete() calls

Note that node_delete() calls node_load(), which keeps a cache of loaded nodes. That means it's possible to load a node with node_load() which should have been explicitly deleted with node_delete() earlier in the session! In other words, this works:

<?php
node_delete
($nid);
$node = node_load($nid);
?>

There are performance implications to this, and possibly security ones as well. See the node_load() documentation and its comments for information on how to clear node_load()'s cache. Also see this issue in Drupal's issue queue.

Note that node_delete calls

Note that node_delete calls node_access check so cannot be used in some occasions, like when running cron with an anon user.

Or, say, trying to delete a node as anon with drush php-eval "node_delete(nid) ;", however drush php-eval "global \$user; \$user = user_load(1);node_delete(nid) ;" works

For security, it's a good

For security, it's a good practice to restore $user to original state - e.g.

global $user;
$original_user = $user;
$user = user_load(1);
node_delete($nid);
$user = $original_user;

Official documentation on how to impersonate a different user

There is official documentation on how to do that.
On that page the afore mentioned method has been explicitly declared unsafe.
See Safely Impersonating Another User

Login or register to post comments