如何一次删除所有评论?我已经看到了如何使用节点和bulkdelete模块来做到这一点,如何删除给定内容类型的所有节点? 但我正在寻找一种类似的解决方案以发表评论。
我正在寻找一种不会在数据库中保留任何工件的解决方案。Views Bulk Operations是最好的解决方案吗?
如何一次删除所有评论?我已经看到了如何使用节点和bulkdelete模块来做到这一点,如何删除给定内容类型的所有节点? 但我正在寻找一种类似的解决方案以发表评论。
我正在寻找一种不会在数据库中保留任何工件的解决方案。Views Bulk Operations是最好的解决方案吗?
Answers:
AFAIK,VBO应该可以完成这项工作,但是我自己还没有尝试删除评论。
另一种方法是运行一些代码(在模块中或在Devel模块的“ execute php”块中),该代码从db获取所有查询的列表,构建注释ID数组,并将该数组传递给comment_delete_multiple函数。请注意,这可能需要一段时间才能完成(取决于服务器性能和注释的数量),因此您可以通过使用set_time_limit(http://php.net/manual/zh/function (.set-time-limit.php)或Drupal的批处理API。
[更新:有关基于此方法的示例代码,请参见Chris Cohen的答案。]
这不是替代答案,而是对marcvangend的详尽阐述,但是我无法评论他的答案并留下示例代码。因此,使用devel的execute代码块的手动方法看起来有点像:
$cids = db_select('comment', 'c')
->fields('c', array('cid'))
->execute()
->fetchCol();
comment_delete_multiple($cids);
正如marcvangend指出的那样,这将仅限于服务器上的执行时间,因此,如果您有很多评论,则需要暂时提高它。感谢manarth和instanceofjamie的dbtng帮助。
老实说,当我需要执行此操作时,我只是在数据库中执行了此操作。您删除评论,修复评论统计信息和po,所有评论都消失了。如果您有模块以某种奇怪的方式与注释进行交互,那么我会避免这样做,否则我会建议这样做。
截断表注释
更新node_comment_statistics SET comment_count = 0
comment_delete_multiple
在于它可以为您调用其他的drupal挂钩,从而使您的数据库可能更干净。
一些UI工具您可以在下面安装模块
视图-drupal.org/project/views
我相信每个Drupal网站都需要...它在后端生成SQL并显示可配置设置,过滤器,排序,分页等结果。
VBO- http : //drupal.org/project/views_bulk_operations 允许批量操作(即删除该线程的注释)
管理视图- http://drupal.org/project/admin_views 以查看和VBO的优点,取代原来的contnet,评论,用户管理页面由menu_alter ...
这个答案类似于已经列出的答案,但我对其进行了修改,以防止出现“内存不足错误”,涉及大约27,000条评论。根据评论的数量,这将需要一段时间才能执行。简单地截断注释表可能不是一个好主意。最好让Drupal处理内容的删除。
我创建了一个PHP脚本:
$cids = db_select('comment', 'c')
->fields('c', array('cid'))
->execute()
->fetchCol();
foreach($cids as $cid)
{
comment_delete($cid);
}
...然后用Drush运行脚本
drush @my_alias php-script my_script.php
我通常建议使用VBO批量删除注释或节点,但是如果您遇到的情况是成千上万的注释,而您又没有太多的时间,这是一个sql查询,它将删除所有未批准的注释以及与这些注释相关的所有修订和数据,以我为例,这占用了DB 1.2 GB的空间
DELETE c, rcb, dcb
FROM
comment AS c
JOIN field_revision_comment_body AS rcb ON (c.cid = rcb.entity_id)
JOIN field_data_comment_body AS dcb ON (rcb.entity_id = dcb.entity_id)
WHERE
c. STATUS = 0
启用PHP过滤器,并使用以下代码创建基本页面:
<?php
db_query("TRUNCATE TABLE {comment}");
db_query("UPDATE {node_comment_statistics} SET comment_count = 0");
?>
comment
,您需要一个别名,并且原始对象的结果不能直接输入到comment_delte_multiple