¿Cómo eliminar un nodo o una lista de nodos con Drush?

8

Descubrí el módulo Eliminar todo , que le permite eliminar todos los nodos de un tipo de contenido determinado. Sin embargo, con este módulo no puede eliminar un solo nodo o una lista de nodos.

En la pregunta " ¿Puedo eliminar nodos de un tipo de contenido dado con Drush? " Encontré 2 respuestas hablando sobre el comando, drush node_delete <nid>pero no puedo encontrar este comando.

En una discusión sobre node_delete () encontré un código que usa eval para realizar esta tarea, pero usa eval:

drush php-eval "global \$user; \$user = user_load(1); node_delete(nid);"

En caso de que no exista una funcionalidad implementada para lograr esto, ¿cuál es la mejor manera de implementar esta funcionalidad: en el módulo Drush o crear un nuevo módulo?

Adrian Cid Almaguer
fuente

Respuestas:

6

Si usa el módulo Drush Entity , puede ejecutar drush entity-delete node 123para eliminar el nid 123 de su sitio.

EDITAR: si alguien necesita usar el drush entity-deletecomando, debe usar la versión de desarrollo del módulo: https://www.drupal.org/project/drush_entity/releases/7.x-5.x-dev

greg_1_anderson
fuente
gracias Greg, siempre estás ayudando con las cosas drush ;-)
Adrian Cid Almaguer
Encontré un error dentro del módulo de entidad drush que no permite la eliminación de nodos, enviaré el parche más tarde.
Adrian Cid Almaguer
1
Puede encontrar el problema y el parche en drupal.org/node/2756071#comment-11339679
Adrian Cid Almaguer el
Se envió el parche, si alguien necesita usar el drush entity-deletecomando debe usar en este momento la versión de desarrollo del módulo Drush Entity drupal.org/project/drush_entity/releases/7.x-5.x-dev
Adrian Cid Almaguer
7

Finalmente creo mi propio módulo llamado drush_delete

Dentro del drush_delete.drush.incarchivo pon este código:

<?php
/**
 * @file
 * The Drush Delete drush commands.
 */

/**
* Implements hook_drush_command().
*/
function drush_delete_drush_command() {
  $items['node-delete'] = array(
    'description' => dt("Delete nodes."),
    'aliases' => array('nd'),
    'arguments' => array(
      'nids' => dt('The nids of the nodes to delete'),
    ),
    'examples' => array(
      'drush node-delete 1' => dt('Delete the node with nid = 1.'),
      'drush node-delete 1 2 3' => dt('Delete the nodes with nid = 1, 2 and 3.'),

    ),
  );
  return $items;
}

/**
 * Callback for the node-delete command
 */
function drush_drush_delete_node_delete() {
  $nids = func_get_args();
  $nids = array_filter($nids, 'is_numeric');
  $nids = array_map('intval', $nids);
  $nids = array_unique($nids);
  $nids = array_values($nids);
  $cant = count($nids);

  if ($cant > 0) {
    node_delete_multiple($nids);

    drush_print(dt("Deleted nodes:"));
    drush_print(implode(' ', $nids));
  }
  else {
    drush_set_error('DRUSH_ERROR_CODE', dt("You must enter at least one nid"));
  }
}

Instale el módulo, ejecute drush cc drushpara borrar el caché drush y use el comando como este:

Para eliminar un nodo, use:

drush node-delete 1
drush nd 1

Para eliminar múltiples nodos use:

drush node-delete 1 2 3
drush nd 1 2 3

Puede encontrar el comando en este módulo:

https://github.com/adrian-cid/drush_commands

Adrian Cid Almaguer
fuente
6

En mi humilde opinión, la forma más fácil es con php-eval:

drush php-eval "node_delete_multiple(array(NODE_ID));"

...

drush php-eval "node_delete_multiple(array(34));"     // for node/34

drush php-eval "node_delete_multiple(array(34, 35));" // for node ids 34 and 35
Pere
fuente
Gracias, pero creo que si tiene un comando drush puede agregar argumentos y opciones que tal vez sean necesarias. Y puede agregar validaciones de una manera fácil.
Adrian Cid Almaguer
Me encanta esta respuesta No se necesita un comando drush personalizado.
Johnathan Elmore