Come eliminare 1600 utenti e 2500 post?


10

Un paio di anni fa ho configurato un sito con Drupal 6.9 e poi me ne sono dimenticato. Ho 160 pagine di utenti che sono tutti spammer e ho bisogno di eliminarli tutti tranne 3. Fare questa una pagina alla volta è dolorosamente lento a causa delle chiamate MySQL (credo). Ho anche circa 2500 post sul forum da eliminare.

Ho un po 'paura di eliminare direttamente i record dal database.

Ho visto un modulo chiamato "cancellazione di massa", ma è per Drupal versione 5 e non disponibile per la versione 6.

Risposte:


17

È possibile utilizzare Views Bulk Operations , un modulo che consente di eseguire operazioni in blocco su nodi, utenti, commenti; consente inoltre di applicare l'operazione selezionata a tutti i nodi, utenti o commenti utilizzando l' API Batch . L'API batch consente di distribuire l'elaborazione dei moduli su più richieste di pagina, garantendo così che l'elaborazione non venga interrotta a causa di un timeout di PHP, consentendo all'utente di ricevere un feedback sull'avanzamento delle operazioni in corso.


1
La selezione di tutti gli elementi da eliminare è, ancora una volta, dolorosamente lenta - C'è un'impostazione nelle opzioni VBO di View per abilitare un select allpulsante che seleziona tutti gli elementi in tutte le pagine - fai clic su di esso e Kill-em-all!
AyeshK,

3

Questo modo di uccidere i nodi è molto lento, ma molto sicuro

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

Per gli utenti, è possibile determinare a livello di codice l'utente che si desidera rimuovere? Se possibile, è possibile utilizzare la funzione precedente come esempio per rimuovere utenti indesiderati.


3
Suggerirei di racchiuderlo con un batch API Batch per impedirne il timeout.
Decifrare il

Di sicuro. È un semplice esempio.
dobeerman,


2

Se, come me, preferisci un approccio Python (raro da queste parti probabilmente, ma comunque), questo è un modo trasparente ed efficace per risolvere questo problema:

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'

I passaggi sono sostanzialmente:

  1. Accedi al tuo DB con drush sql-cli -r $your-path-to-drupal -l $your-site-url
  2. Esegui l'SQL sopra con la tua condizione e incolla i risultati nella variabile utente.
  3. Aggiorna il tuo percorso drupal e il nome del sito nel comando drush
  4. Esegui lo script con python delete-users.py

Sono sicuro che c'è un modo migliore per farlo, ma questa è la mia soluzione compromessa che funziona bene.


1
Puoi farlo anche come una linea. for i in `drush sql-query 'SELECT list of usernames'`; do drush --yes user-cancel --delete-content $i; done.
David L,


1

Ho implementato un modulo personalizzato per eliminare tutti gli utenti 7. Nell'area admin / people c'è un nuovo modulo per completare questa operazione.

Troppo con la droga.

È un progetto sandbox. Thk.

Link al progetto.


1

Usa il modulo utente avanzato . Questo modulo aggiunge una scheda "avanzata" alla pagina di gestione degli utenti. In quella scheda, puoi filtrare gli utenti per qualsiasi attributo (ruolo, stato, ecc.) E selezionare tutto. Se selezioni il metodo di eliminazione degli utenti come elimina l'utente e rimuovi tutto il contenuto, puoi anche eliminare tutto il contenuto creato da loro.


0

Se hai accesso a Drush e desideri una soluzione rapida che ti consenta di conservare gli utenti nella whitelist e non prevede l'installazione di moduli aggiuntivi:

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

Assicurati di regolare sia l' @example.orgelenco di utenti sia quello da mantenere ('keepthisuser1', 'andthisuser2')sopra prima di copiare e incollare :)


Questo lascerà la coda, come i campi utente e tutto il resto.
niksmac,

1
Puoi fornire dettagli su cosa intendi? Ho appena testato questo sull'ultimo Drupal 7 e non ha lasciato i dati nei campi dell'utente. Non capisco cosa intendi per "code".
Chris Burgess,

1
Vedo che questa risposta ne duplica una simile avvolta in Python sopra.
Chris Burgess,

1
Ho invertito il mio voto su questa risposta perché in effetti funziona come richiesto. Consiglia a @niksmac di cambiare voto per votare. Nota che non è solo una risposta SQL e usa drush.
Christian

0

Il modulo Elimina tutto potrebbe tornare utile.

Una volta installato puoi fare, ad esempio:

drush delete-all articles

o

drush delete-all users

Versione Drupal 6 in in dev ma dalle note:

Tutto dovrebbe funzionare tranne per l'eliminazione rapida.


0

La domanda originale è per 6, ma l'uso della risposta di Chris Burgess può essere applicato a Drupal 8 in questo modo;

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.