Wie lösche ich 1600 Benutzer und 2500 Beiträge?


10

Vor ein paar Jahren habe ich eine Site mit Drupal 6.9 konfiguriert und dann vergessen. Ich habe 160 Seiten mit Benutzern, die alle Spammer sind, und ich muss alle bis auf 3 löschen. Das Ausführen dieser einen Seite zu einer Zeit ist aufgrund der MySQL-Aufrufe schmerzhaft langsam (denke ich). Ich habe auch ungefähr 2500 Forenbeiträge zu löschen.

Ich habe ein wenig Angst, Datensätze direkt aus der Datenbank zu löschen.

Ich habe ein Modul namens "Massenlöschung" gesehen, aber es ist für Drupal Version 5 und nicht für Version 6 verfügbar.

Antworten:


17

Sie können Views Bulk Operations verwenden , ein Modul, mit dem Bulk-Operationen auf Knoten, Benutzern und Kommentaren ausgeführt werden können. Außerdem kann die ausgewählte Operation mithilfe der Stapel-API auf alle Knoten, Benutzer oder Kommentare angewendet werden . Die Stapel-API ermöglicht die Verteilung der Formularverarbeitung auf mehrere Seitenanforderungen, wodurch sichergestellt wird, dass die Verarbeitung nicht aufgrund eines PHP-Timeouts unterbrochen wird, und der Benutzer Feedback zum Fortschritt der laufenden Vorgänge erhält.


1
Das Auswählen aller zu löschenden Elemente ist wiederum schmerzhaft langsam. In den VBO-Optionen der Ansicht gibt es eine Einstellung, mit der eine select allSchaltfläche aktiviert werden kann, mit der alle Elemente auf allen Seiten ausgewählt werden können. Klicken Sie darauf und Kill-em-all!
AyeshK

3

Diese Art, Knoten zu töten, ist sehr langsam, aber am sichersten

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");
}

Können Sie für Benutzer programmgesteuert den Benutzer bestimmen, den Sie entfernen möchten? Wenn es möglich ist, können Sie die vorherige Funktion als Beispiel verwenden, um Benutzer ohne Ruder zu entfernen.


3
Ich würde vorschlagen, dies mit einem Batch-API-Batch zu verpacken, um ein Timeout zu vermeiden.
Entschlüsseln Sie den

Sicher. Es ist ein einfaches Beispiel.
Dobeerman


2

Wenn Sie wie ich einen Python-Ansatz bevorzugen (hier wahrscheinlich selten, aber immer noch), ist dies ein transparenter und effektiver Weg, um dieses Problem zu beheben:

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'

Die Schritte sind im Grunde:

  1. Melden Sie sich mit bei Ihrer Datenbank an drush sql-cli -r $your-path-to-drupal -l $your-site-url
  2. Führen Sie die obige SQL mit Ihrer eigenen where-Bedingung aus und fügen Sie die Ergebnisse in die Benutzervariable ein.
  3. Aktualisieren Sie Ihren Drupal-Pfad und den Site-Namen im Drush-Befehl
  4. Führen Sie das Skript mit aus python delete-users.py

Ich bin sicher, es gibt einen besseren Weg, dies zu tun, aber dies ist meine gehackte Lösung, die gut funktioniert.


1
Sie können dies auch als Einzeiler tun. for i in `drush sql-query 'SELECT list of usernames'`; do drush --yes user-cancel --delete-content $i; done.
David L


1

Ich habe ein benutzerdefiniertes Modul zum Löschen aller Benutzer in Gruppe 7 implementiert. Im Bereich admin / people gibt es ein neues Formular, um diesen Vorgang abzuschließen.

Auch mit Drush.

Ist ein Sandbox-Projekt. Thk.

Link zum Projekt.


1

Verwenden Sie das erweiterte Benutzermodul . Dieses Modul fügt der Benutzerverwaltungsseite eine Registerkarte "Erweitert" hinzu. Auf dieser Registerkarte können Sie Benutzer nach beliebigen Attributen (Rolle, Status usw.) filtern und alle auswählen. Wenn Sie die Löschmethode der Benutzer als Benutzer löschen und alle Inhalte entfernen auswählen, können Sie auch alle von ihnen erstellten Inhalte löschen.


0

Das Modul Alle löschen könnte sich als nützlich erweisen.

Nach der Installation können Sie beispielsweise Folgendes tun:

drush delete-all articles

oder

drush delete-all users

Drupal 6 Version in dev aber aus den Notizen:

Bis auf das schnelle Löschen sollte alles funktionieren.


-1

Wenn Sie Zugriff auf Drush haben und eine schnelle Lösung suchen, mit der Sie Benutzer auf die Whitelist setzen können und keine zusätzlichen Module installieren müssen:

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

Stellen Sie sicher, dass Sie sowohl die @example.orgListe als auch die Liste der Benutzer so anpassen , dass sie ('keepthisuser1', 'andthisuser2')oben bleiben, bevor Sie sie einfügen :)


Dies hinterlässt Schwänze, wie Benutzerfelder und alle.
Niksmac

Können Sie Einzelheiten dazu angeben, was Sie meinen? Ich habe dies gerade auf dem neuesten Drupal 7 getestet und es wurden keine Daten in Benutzerfeldern belassen. Ich verstehe nicht, was du mit "Schwänzen" meinst.
Chris Burgess

Ich sehe, dass diese Antwort eine ähnliche dupliziert, die oben in Python verpackt ist.
Chris Burgess
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.