如何删除1600个用户和2500个帖子?


10

几年前,我用Drupal 6.9配置了一个站点,然后我忘记了它。我有160页的用户都是垃圾邮件发送者,除3外,我都需要删除所有用户。由于MySQL调用,一次只一页一页非常慢(我想)。我也有大约2500个论坛帖子要删除。

我有点害怕直接从数据库中删除记录。

我看到了一个名为“批量删除”的模块,但它适用于Drupal版本5,不适用于版本6。

Answers:


17

您可以使用“ 视图批量操作”,该模块允许对节点,用户,注释执行批量操作;它还允许使用Batch API将所选操作应用于所有节点,用户或注释。批处理API允许将表单处理分散到多个页面请求中,从而确保不会因PHP超时而中断处理,同时允许用户接收有关正在进行的操作进度的反馈。


1
再次选择所有要删除的项目非常缓慢-视图的VBO选项中有一个设置,可以启用一个select all按钮来选择所有页面上的所有项目-单击它并全部杀死!
AyeshK 2013年

3

这种杀死节点的方法非常慢,但最安全

function MYMODULE_menu(){
  $items['admin/mymodule/killnodes/%'] = array(
      'title' => 'Kill nodes',
      'page callback' => 'kill_nodes',
      'page arguments' => array(3),
      'type' => MENU_CALLBACK,
      'access arguments' => array('administer site configuration'),
  );
  return $items;
}

function kill_nodes($type){
  $query = "SELECT node.nid AS nid FROM {node} node WHERE node.type IN ('%s')";
  $result = db_query($query, $type);
  $count = 0;
  while($row = db_fetch_object($result)){
    node_delete($row->nid);
    $count++;
  }
  $message = t('!count nodes has been killed. Pif-Paf!', array('!count' => $count));
  drupal_set_message($message);
  return t("That's all folks");
}

对于用户,您可以通过编程确定要删除的用户吗?如果可能,您可以使用以前的功能作为示例来删除不需要的用户。


3
我建议使用Batch API批处理将其包装起来,以防止其超时。
解密

当然。这是一个简单的例子。
dobeerman 2011年


2

如果像我一样,您更喜欢Python方法(也许在这里,但仍然很少使用),这是解决此问题的透明有效的方法:

import os

# Build up a variable containing the usernames
# This list was built using drush sql-cli, then
# SELECT name FROM users 
#   where $your-where-condition 
#   order by uid asc 
#   INTO 
#     OUTFILE '/tmp/users.csv' 
#     FIELDS TERMINATED BY ',' 
#     ENCLOSED BY '"' 
#     lines terminated by ', ' ;
users = [result from SQL goes here]

for user in users:
    print("Deleting spam user: %s..." % user),
    os.system('drush --yes -r $your-path-to-drupal -l $your-site-url user-cancel --delete-content %s > /dev/null' % user) 
    print 'Done'

这些步骤基本上是:

  1. 使用登录到数据库 drush sql-cli -r $your-path-to-drupal -l $your-site-url
  2. 使用您自己的where条件运行上述SQL,然后将结果粘贴到users变量中。
  3. 将您的Drupal路径和站点名称更新为drush命令
  4. 使用运行脚本 python delete-users.py

我敢肯定有更好的方法可以做到这一点,但这是我被黑的解决方案,效果很好。


1
您也可以单线执行此操作。for i in `drush sql-query 'SELECT list of usernames'`; do drush --yes user-cancel --delete-content $i; done
David L


1

我已经实现了一个自定义模块,用于删除所有用户indrupal7。在admin / people区域中,有一个新表单可以完成此操作。

太匆忙了。

是一个沙盒项目。THK。

链接到项目。


1

使用高级用户模块。此模块将“高级”选项卡添加到用户管理页面。在该标签中,您可以按任何属性(角色,状态等)过滤用户,然后全选。如果选择用户的删除方法作为删除用户并删除所有内容,则还可以删除他们创建的所有内容。


0

如果您可以访问Drush并需要一种快速的解决方案,该解决方案使您可以将用户列入白名单,并且无需安装其他模块:

drush @example.org sqlq "SELECT name FROM users WHERE name NOT IN ('keepthisuser1', 'andthisuser2')" | while read NAME; do
  drush -y @example.org user-cancel $NAME ; 
done

在复制粘贴之前,请确保同时调整@example.org和列表中的用户,以保持('keepthisuser1', 'andthisuser2')上述状态:)


这将留下尾巴,例如用户字段和全部。
niksmac

1
您能否详细说明您的意思?我刚刚在最新的Drupal 7上对此进行了测试,它没有在用户字段中保留数据。我不明白您所说的“尾巴”是什么意思。
克里斯·伯吉斯

1
我看到这个答案重复了上面包装在Python中的类似答案。
克里斯·伯吉斯

1
我对这个答案投了反对票,因为它实际上可以按要求工作。推荐@niksmac更改投票以投票反对。请注意,这不是仅SQL的答案,而是使用drush。
基督教

0

模块全部删除可以派上用场。

安装后,您可以执行以下操作:

drush delete-all articles

要么

drush delete-all users

Drupal 6版本在开发中,但有注释:

除快速删除外,其他所有操作均应正常进行。


0

最初的问题是6,但是使用Chris Burgess的答案可以像这样应用到Drupal 8;

drush sqlq "SELECT name FROM users_field_data WHERE name NOT IN ('admin')" | while read NAME; 
  do drush -y user:cancel --delete-content $NAME; 
done
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.