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 calls to node_delete()

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

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.

The core issue mentioned

The core issue mentioned above was fixed in early 2010.

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

node does not exist still displaying

I have deleted unwanted node from database still displaying in a block. I have also cleared cache. How to remove it from display?
Please suggest.

Login or register to post comments