Hero

Cómo hacer un borrado masivo de nodos en Drupal 7 con Drush

Julio 20, 2013

enzo
Drupal
Desarrollo de Modulos
Drush
Programación

En algunos casos necesitamos muchos nodos de nuestra instalación de Drupal, ya sea por un proceso de migración fallido o para tratar de hacer una versión reducida de nuestro ambiente de producción para llevarlo a un ambiente de pruebas.

Sea cual sea la razón este proceso debería hacerse de forma formal es decir haciendo un llamado a la función nodo_delete, ya esta función garantiza que todos los elementos relacionados con el nodo sera borrados como por ejemplo archivos, imágenes, nodos referenciados etc y así evitar que nuestra base de datos quede corrupta en términos de datos.

Para realizar esta tarea les presento el siguiente script para ser ejecutado vía drush.

<pre title="bulk_delete.php">// Load node.module from the node module.
module_load_include('module', 'node', 'node');
  
$content_types = array('article','page','blog');
 
 $results = db_select('node', 'n')
              ->fields('n', array('nid'))
              ->condition('type', $content_types, 'IN')
	          ->condition('created', strtotime("1 March 2013"),'<')
              ->orderRandom()
              ->range(0,100)
	      ->execute();
  foreach ($results as $result) {
    $nids[] = $result->nid;
  }

print 'Nodes to delete:' . count($nids). "\n";
 
  if(!empty($nids)) {
    node_delete_multiple($nids);
    drupal_set_message(t('Deleted %count nodes.', array('%count' => count($nids))));
  }   

En el código anterior se crea una consulta a la tabla node indicando ciertas condiciones por ejemplo:

  • Línea #5: Filtrar los resultados por tipos de nodo.
  • Línea #6: Filtrar los resultados a nodos creados antes de una fecha exacta.
  • Línea #7: Aplicar un orden, es este caso escogí randon para en caso de falla un nodo por algún motivo volver a correr el script e intentar el borrado con otros nodos.
  • Línea #8: Definir un rango de resultados, para definir cuantos nodos sera borrados en cada ejecución del script.

Luego de ejecutar la consulta se obtienes todos los NID de los nodos y si no esta vació se llama a la función node_delete_multiplepara hacer el borrado masivo.

Para ejecutar el script con drush solo debemos hacer

 drush php-script bulk_delete.php

Espero que haya sido de ayuda.

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.