Drupal で、古くなったノードを hook_cron で削除する方法

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