我有一个 D5 站点,其中包含数千个节点和更多评论。由于该站点以新闻为导向,因此许多故事不再相关并出于存档原因而保留。我想保留节点并删除与一年前的节点相关的所有评论。
我对 SQL 和构建自己的模块很满意,我想知道如果我删除旧评论可能会遇到什么问题。任何提示或建议都将受到欢迎。
:]
我有一个 D5 站点,其中包含数千个节点和更多评论。由于该站点以新闻为导向,因此许多故事不再相关并出于存档原因而保留。我想保留节点并删除与一年前的节点相关的所有评论。
我对 SQL 和构建自己的模块很满意,我想知道如果我删除旧评论可能会遇到什么问题。任何提示或建议都将受到欢迎。
:]
删除评论并不像从数据库中删除一行那么简单。我前段时间写了这个 sippet 来删除Drupal 5 站点的所有评论:
<?php
$result = db_query('SELECT c.*, u.name AS registered_name, u.uid FROM {comments} c INNER JOIN {users} u ON u.uid = c.uid');
while ($comment = db_fetch_object($result)) {
$comment->name = $comment->uid ? $comment->registered_name : $comment->name;
_comment_delete_thread($comment);
_comment_update_node_statistics($comment->nid);
}
?>
它基于comment_delete()和comment_confirm_delete_submit()中的代码,并确保执行所有相关操作,例如调用挂钩和更新统计信息。在您的情况下,您必须在查询中添加 where 子句,以确保您只删除旧评论。
根据服务器的性能和必须删除的评论数量,您可能需要在 while 块中添加set_time_limit()以防止 php 超时。
此代码片段可以从自定义模块运行,但您也可以安装 Devel 模块并从它的“执行 php”块运行代码。
应该没有任何问题。把他们消灭掉!
免责声明:我从未使用过 drupal 5.x 进行开发。只有6.所以我可能需要对一些小细节进行一些更正。
我打算推荐 Views Bulk Operations 来删除每个节点类型的评论,但是,它似乎不是为 5.x 开发的。
你有几个选择如何做到这一点。这是一个:
更新挂钩:
如果您有辅助模块,请创建一个更新挂钩。然后你可以使用 update.php 运行它。这背后的逻辑是这样的(我没有测试过查询)
SELECT c.cid FROM comments c
INNER JOIN node ON n.nid = c.nid
WHERE n.type = 'story'
然后
foreach ($cids as $cid) {
comment_delete($cid);
}
但是,如果评论过多,您的请求可能会超时。
如果您熟悉 Views 模块,我认为您可以使用Views Bulk Operations模块批量删除旧评论。Drupal 5 版本不再列在模块页面上,但您可以通过单击查看所有版本找到它。