Comment supprimer 1600 utilisateurs et 2500 messages?

10

Il y a quelques années, j'ai configuré un site avec Drupal 6.9, puis je l'ai oublié. J'ai 160 pages d'utilisateurs qui sont tous des spammeurs et je dois les supprimer tous sauf 3. Faire cette page à la fois est douloureusement lent à cause des appels MySQL (je suppose). J'ai également environ 2500 messages sur le forum à supprimer.

J'ai un peu peur de supprimer directement les enregistrements de la base de données.

J'ai vu un module appelé "mass delete", mais il est pour Drupal version 5 et n'est pas disponible pour la version 6.

John R
la source

Réponses:

17

Vous pouvez utiliser Views Bulk Operations , un module qui permet d'exécuter des opérations en bloc sur les nœuds, les utilisateurs, les commentaires; il permet également d'appliquer l'opération sélectionnée à tous les nœuds, utilisateurs ou commentaires à l'aide de l' API Batch . L'API par lots permet de répartir le traitement des formulaires sur plusieurs demandes de page, garantissant ainsi que le traitement ne soit pas interrompu en raison d'un timeout PHP, tout en permettant à l'utilisateur de recevoir des commentaires sur la progression des opérations en cours.

kiamlaluno
la source
1
La sélection de tous les éléments à supprimer est, encore une fois, douloureusement lente - Il existe un paramètre dans les options VBO de View pour activer un select allbouton qui sélectionne tous les éléments sur toutes les pages - cliquez dessus et Tuez-les tous!
AyeshK
3

Cette façon de tuer les nœuds est très lente, mais plus sûre

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

Pour les utilisateurs, pouvez-vous déterminer par programme l'utilisateur que vous souhaitez supprimer? Si possible, vous pouvez utiliser la fonction précédente comme exemple pour supprimer les utilisateurs indésirables.

dobeerman
la source
3
Je suggère d'envelopper cela avec un lot d'API Batch pour l'empêcher de se terminer.
Déchiffrer le
Pour sûr. C'est un exemple simple.
dobeerman
3

Au lieu de créer un module personnalisé pour cette tâche, vous pouvez utiliser un script simple et l'exécuter avec Drush . Étant donné que vous devez traiter un grand nombre d'utilisateurs et de nœuds, l'utilisation de l'API Batch est recommandée (et peut être utilisée avec Drush ).

Pierre Buyle
la source
2

Si, comme moi, vous préférez une approche Python (rare ici probablement, mais quand même), c'est un moyen transparent et efficace de résoudre ce problème:

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'

Les étapes sont essentiellement:

  1. Connectez-vous à votre base de données avec drush sql-cli -r $your-path-to-drupal -l $your-site-url
  2. Exécutez le SQL ci-dessus avec votre propre condition where et collez les résultats dans la variable users.
  3. Mettez à jour votre chemin drupal et votre nom de site dans la commande drush
  4. Exécutez le script avec python delete-users.py

Je suis sûr qu'il existe une meilleure façon de le faire, mais c'est ma solution piratée qui fonctionne bien.

mlissner
la source
1
Vous pouvez également le faire en une seule ligne. for i in `drush sql-query 'SELECT list of usernames'`; do drush --yes user-cancel --delete-content $i; done.
David L
1

Essayez ces 2 modules pour D6:

User Prune https://drupal.org/project/user_prune et User Delete https://drupal.org/project/user_delete

User Prune vous permet de supprimer en masse les utilisateurs inactifs en fonction des critères que vous spécifiez.

La suppression d'utilisateur vous permet de supprimer un utilisateur et de supprimer tout le contenu soumis, y compris les nœuds et les commentaires

FreeScholar
la source
1

J'ai implémenté un module personnalisé pour supprimer tous les utilisateurs indrupal 7. Dans la zone admin / people il y a un nouveau formulaire pour terminer cette opération.

Trop de drush.

Est un projet sandbox. Thk.

Lien vers le projet.

lgrtm
la source
1

Utilisez le module utilisateur avancé . Ce module ajoute un onglet "avancé" à la page de gestion des utilisateurs. Dans cet onglet, vous pouvez filtrer les utilisateurs par n'importe quel attribut (rôle, statut, etc.) et tout sélectionner. Si vous sélectionnez la méthode de suppression des utilisateurs comme supprimer l'utilisateur et supprimer tout le contenu, vous pouvez également supprimer tout le contenu créé par eux.

Sinan Erdem
la source
0

Si vous avez accès à Drush et souhaitez une solution rapide qui vous permet de conserver les utilisateurs sur liste blanche et qui n'implique pas l'installation de modules supplémentaires:

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

Assurez-vous d'ajuster à la fois la @example.orgliste des utilisateurs et la liste à conserver ('keepthisuser1', 'andthisuser2')avant de copier-coller :)

Chris Burgess
la source
Cela laissera des queues, comme les champs utilisateur et tout.
niksmac
1
Pouvez-vous donner des détails sur ce que vous voulez dire? Je viens de tester cela sur le dernier Drupal 7, et il n'a pas laissé de données dans les champs utilisateur. Je ne comprends pas ce que vous entendez par "queues".
Chris Burgess
1
Je vois que cette réponse reproduit une réponse similaire enveloppée dans Python ci-dessus.
Chris Burgess
1
J'ai inversé mon vote sur cette réponse car elle fonctionne en fait comme requis. Recommander @niksmac changer le vote pour voter. Notez qu'il ne s'agit pas uniquement d'une réponse SQL et utilise drush.
Christian
0

Le module Supprimer tout pourrait être utile.

Une fois installé, vous pouvez par exemple:

drush delete-all articles

ou

drush delete-all users

Version Drupal 6 en dev mais d'après les notes:

Tout devrait fonctionner, sauf pour la suppression rapide.

Mauro Sardu
la source
0

La question d'origine est pour 6, mais l'utilisation de la réponse de Chris Burgess peut être appliquée à Drupal 8 ainsi;

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
Christian
la source