批量删除评论


11

如何一次删除所有评论?我已经看到了如何使用节点和bulkdelete模块来做到这一点,如何删除给定内容类型的所有节点? 但我正在寻找一种类似的解决方案以发表评论。

我正在寻找一种不会在数据库中保留任何工件的解决方案。Views Bulk Operations是最好的解决方案吗?

Answers:


7

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的答案。]


7

这不是替代答案,而是对marcvangend的详尽阐述,但是我无法评论他的答案并留下示例代码。因此,使用devel的execute代码块的手动方法看起来有点像:


$cids = db_select('comment', 'c')
  ->fields('c', array('cid'))
  ->execute()
  ->fetchCol();

comment_delete_multiple($cids);

正如marcvangend指出的那样,这将仅限于服务器上的执行时间,因此,如果您有很多评论,则需要暂时​​提高它。感谢manarth和instanceofjamie的dbtng帮助。


1
感谢您的指导,但您的语法已关闭。该表是comment,您需要一个别名,并且原始对象的结果不能直接输入到comment_delte_multiple
brian_d 2011年

@brian_d您将如何处理准备用于comment_delte_multiple()的原始对象结果?
jackocnr 2012年

2

就个人而言,我将使用“ 视图批量操作”模块。

该模块通过允许对显示的行执行批量操作来增强视图。通过在每个节点的前面显示一个复选框,并添加一个包含可以应用的操作的选择框,可以做到这一点。可以使用Drupal Core或Rules操作。


0

老实说,当我需要执行此操作时,我只是在数据库中执行了此操作。您删除评论,修复评论统计信息和po,所有评论都消失了。如果您有模块以某种奇怪的方式与注释进行交互,那么我会避免这样做,否则我会建议这样做。

截断表注释

更新node_comment_statistics SET comment_count = 0


我认为使用drupal API调用的优势comment_delete_multiple在于它可以为您调用其他的drupal挂钩,从而使您的数据库可能更干净。
brian_d 2011年

这就是为什么我说如果您有与评论交互的模块,我建议您避免这样做。否则,如果您有库存评论,我永远不会注意到它的任何问题。如果您的网站上充斥着成千上万的评论,那么这样做无疑会容易得多。
G.Martin'3

您还需要截断表“ field_data_comment_body”,因为这是注释内容的存储位置。
Creynders

0

一些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 ...

  1. 启用以上模块后,返回至评论管理页面
  2. 勾选全选(注意,请确保您要删除所有评论...)
  3. 选择“删除”和“提交”(注意,稍后不再确认按钮...)

0

通过使用“备份和迁移”模块,删除了大约45,000条注释。在“从以下表中排除数据”的高级设置中-首先按Ctrl键,然后在列表中选择注释-(请小心,因为此处已选择了不必要的缓存表)-备份-从此备份文件中还原。欢呼!


0

这个答案类似于已经列出的答案,但我对其进行了修改,以防止出现“内存不足错误”,涉及大约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

0

我通常建议使用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

-2

启用PHP过滤器,并使用以下代码创建基本页面:

<?php
  db_query("TRUNCATE TABLE {comment}");
  db_query("UPDATE {node_comment_statistics} SET comment_count = 0");
?>

1
永远不要对这样的事情使用PHP过滤器(即使对于其他任何事情,PHP过滤器通常也是Drupal中最糟糕的想法之一)
Alejandro Moreno 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.