¿Cómo eliminar 1600 usuarios y 2500 publicaciones?

10

Hace un par de años configuré un sitio con Drupal 6.9, y luego lo olvidé. Tengo 160 páginas de usuarios que son todos spammers y necesito eliminar todos menos 3. Hacer esta página a la vez es muy lento debido a las llamadas de MySQL (supongo). También tengo alrededor de 2500 publicaciones en el foro para eliminar.

Tengo un poco de miedo de eliminar registros de la base de datos directamente.

Vi un módulo llamado "eliminación masiva", pero es para la versión 5 de Drupal y no está disponible para la versión 6.

John R
fuente

Respuestas:

17

Puede usar Views Bulk Operations , un módulo que permite ejecutar operaciones masivas en nodos, usuarios, comentarios; También permite aplicar la operación seleccionada a todos los nodos, usuarios o comentarios utilizando la API de Batch . La API por lotes permite que el procesamiento de formularios se distribuya entre varias solicitudes de página, lo que garantiza que el procesamiento no se interrumpa debido a un tiempo de espera de PHP, al tiempo que permite al usuario recibir comentarios sobre el progreso de las operaciones en curso.

kiamlaluno
fuente
1
Seleccionar todos los elementos para eliminar es, una vez más, dolorosamente lento: hay una configuración en las opciones de VBO de la vista para habilitar un select allbotón que selecciona todos los elementos en todas las páginas. ¡Haga clic y Kill-em-all!
AyeshK
3

Esta forma de matar nodos es muy lenta, pero más segura

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

Para los usuarios, ¿puede determinar mediante programación el usuario a quien desea eliminar? Si es posible, puede usar la función anterior como ejemplo para eliminar usuarios no deseados.

Dobeerman
fuente
3
Sugeriría envolverlo con un lote de Batch API para evitar que se agote el tiempo de espera.
Descifrar el
Sin lugar a duda. Es un ejemplo simple.
Dobeerman 03 de
3

En lugar de crear un módulo personalizado para esta tarea, puede usar un script simple y ejecutarlo con Drush . Como necesita procesar muchos usuarios y nodos, se recomienda el uso de la API de Batch (y se puede usar con Drush ).

Pierre Buyle
fuente
2

Si, como yo, prefiere un enfoque de Python (probablemente raro, pero aún así), esta es una forma transparente y efectiva de solucionar este 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'

Los pasos son básicamente:

  1. Inicie sesión en su base de datos con drush sql-cli -r $your-path-to-drupal -l $your-site-url
  2. Ejecute el SQL anterior con su propia condición where y pegue los resultados en la variable de usuario.
  3. Actualice su ruta de drupal y el nombre del sitio en el comando drush
  4. Ejecute el script con python delete-users.py

Estoy seguro de que hay una mejor manera de hacerlo, pero esta es mi solución pirateada que funciona bien.

mlissner
fuente
1
También puedes hacer esto como una frase. for i in `drush sql-query 'SELECT list of usernames'`; do drush --yes user-cancel --delete-content $i; done.
David L
1

He implementado un módulo personalizado para eliminar todos los usuarios de indrupal 7. En el área admin / people hay un nuevo formulario para completar esta operación.

Demasiado con drush.

Es un proyecto de sandbox. Thk.

Enlace al proyecto.

lgrtm
fuente
1

Utilice el módulo de usuario avanzado . Este módulo agrega una pestaña "avanzada" a la página de administración de usuarios. En esa pestaña, puede filtrar usuarios por cualquier atributo (rol, estado, etc.) y seleccionar todos. Si selecciona el método de eliminación de los usuarios como eliminar el usuario y eliminar todo el contenido, también puede eliminar todo el contenido creado por ellos.

Sinan Erdem
fuente
0

El módulo Eliminar todo podría ser útil.

Una vez instalado, puede hacer, por ejemplo:

drush delete-all articles

o

drush delete-all users

Versión de Drupal 6 en dev pero de las notas:

Todo debería funcionar, excepto la eliminación rápida.

Mauro Sardu
fuente
-1

Si tiene acceso a Drush y desea una solución rápida que le permita mantener en la lista blanca a los usuarios y no implique la instalación de módulos adicionales:

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

Asegúrese de ajustar tanto la @example.orglista de usuarios como la que se debe guardar ('keepthisuser1', 'andthisuser2')en lo anterior antes de copiar y pegar :)

Chris Burgess
fuente
Esto dejará colas, como los campos de usuario y todo.
niksmac
¿Puedes dar detalles de lo que quieres decir? Acabo de probar esto en el último Drupal 7, y no dejó datos en los campos de usuario. No entiendo lo que quieres decir con "colas".
Chris Burgess
Veo que esta respuesta duplica una similar envuelta en Python arriba.
Chris Burgess