1600人のユーザーと2500件の投稿を削除する方法


10

数年前、私はDrupal 6.9でサイトを構成しましたが、それを忘れていました。私は160ページのユーザーがすべてスパマーであり、3つを除くすべてを削除する必要があります。これは、MySQLの呼び出しが原因で、一度に1ページずつ行うのは非常に遅くなります(おそらく)。また、削除するフォーラム投稿が約2500あります。

データベースから直接レコードを削除するのは少し怖いです。

「大量削除」と呼ばれるモジュールを見ましたが、それはDrupalバージョン5用であり、バージョン6では使用できません。

回答:


17

あなたは使用することができますビューは、Operationsバルク、ノード、ユーザ、コメントの一括操作を実行することを可能にするモジュールと、また、バッチAPIを使用して、選択した操作をすべてのノード、ユーザー、またはコメントに適用することもできます。バッチAPIを使用すると、フォーム処理を複数のページリクエストに分散できるため、PHPタイムアウトが原因で処理が中断されないようにすると同時に、ユーザーは進行中の操作の進行状況に関するフィードバックを受け取ることができます。


1
削除するすべてのアイテムを選択すると、やはり非常に遅くなります。ビューのVBOオプションには、select allすべてのページですべてのアイテムを選択するボタンを有効にする設定があります。クリックして、Kill-em-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
それをバッチAPIバッチでラップして、タイムアウトしないようにすることをお勧めします。
2011

確かに。簡単な例です。
dobeerman


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. でDBにログインします drush sql-cli -r $your-path-to-drupal -l $your-site-url
  2. 上記のSQLを独自のwhere条件で実行し、結果をユーザー変数に貼り付けます。
  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

D6用に次の2つのモジュールを試してください。

ユーザープルーン https://drupal.org/project/user_prune およびユーザー削除 https://drupal.org/project/user_delete

User Pruneを使用すると、指定した基準に基づいて非アクティブなユーザーを一括削​​除できます。

ユーザーの削除により、ユーザーを削除し、ノードやコメントを含むすべての送信済みコンテンツを削除できます


1

私はすべてのユーザーを削除するためのカスタムモジュール7を実装しました。管理者/人の領域には、この操作を完了するための新しいフォームがあります。

しつこすぎる。

サンドボックスプロジェクトです。よし

プロジェクトにリンクします。


1

使用する高度なユーザーモジュールを。このモジュールは、ユーザー管理ページに「詳細」タブを追加します。そのタブでは、任意の属性(ロール、ステータスなど)でユーザーをフィルタリングし、すべてを選択できます。ユーザーの削除方法をユーザーの削除として選択し、すべてのコンテンツを削除する場合、ユーザーが作成したすべてのコンテンツを削除することもできます。


0

すべて削除モジュールが役に立ちます。

インストールしたら、次のようにできます。

drush delete-all articles

または

drush delete-all users

Drupal 6バージョンはdevにありますが、ノートから:

クイック削除以外はすべて機能しているはずです。


-1

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 2015年

どういう意味ですか?これを最新のDrupal 7でテストしたところ、ユーザーフィールドにデータが残っていませんでした。「尾」の意味がわかりません。
Chris Burgess

この回答は、上記のPythonでラップされた同様の回答と重複しています。
Chris Burgess、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.