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)) { <pre>// 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_; } ?>