Drupal のドキュメントは、すっごく整備されているようでいて内容を見ると実はよくわからないのがほとんどである。この hook_cron についても、
https://drupal.org の過去ログからやっと探し出したものだ。
ポイントは、node_delete を呼び出す前に必ず
<?php
global $user;
$user = user_load(array('uid' => $node->uid));
?>
と、global $user を $node のもの($node が持つ uid)にしてあげるということである。
Win32 プログラミングで CreateProcessAsUser の前に hTokenImpersonateUser が必要なのと同じようなノリなのだろう。以下の例は、30日以上前のノードを hook_cron (この例では example_cron) で処理する方法。
<?php
function example_cron() { // hook_cron()
  global $user;
  $user_ = $user; // temporary user
  $ago = time() - 30 * 24 * 60 * 60; // 30 days ago
  $result = db_query('SELECT * FROM {example} WHERE `create`<=%d', $ago);
  while ($item = db_fetch_object($result)) {
    // Search node object
    $node = node_load(array('nid' => $item->nid));
    // Search user object (<strong>Must be called if you call node_delete</strong>)
    $user = user_load(array('uid' => $node->uid)); // global $user
    if($node) {
      // delete node
      node_delete($node->nid);  // with example_delete
    }
  }
  $user = $user_;
}
?>
    トラックバック URL:
    https://perltips.twinkle.cc/trackback/169