Julio 20, 2013
enzo
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.