Como excluir um nó ou uma lista de nós com o Drush?

8

Descobri o módulo Excluir tudo , que permite excluir todos os nós de um determinado tipo de conteúdo. No entanto, com este módulo, você não pode excluir um único nó ou uma lista de nós.

Na pergunta " Posso excluir nós de um determinado tipo de conteúdo com o Drush? ", Encontrei 2 respostas falando sobre o comando, drush node_delete <nid>mas não consigo encontrar esse comando.

Eu encontrei em uma discussão sobre node_delete () algum código usando eval para realizar esta tarefa, mas está usando eval:

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

Caso não exista uma funcionalidade implementada para fazer isso, qual é a melhor maneira de implementar essa funcionalidade: no módulo Drush ou crie um novo módulo?

Adrian Cid Almaguer
fonte

Respostas:

6

Se você usar o módulo Drush Entity , poderá executar drush entity-delete node 123para excluir o nid 123 do seu site.

EDIT: Se alguém precisar usar o drush entity-deletecomando, deve usar a versão dev do módulo: https://www.drupal.org/project/drush_entity/releases/7.x-5.x-dev

greg_1_anderson
fonte
obrigado Greg, você sempre ajudando com os animais;
Adrian Cid Almaguer
Eu encontrei um bug dentro do módulo da entidade drush que não permite a exclusão de nós, vou confirmar o patch mais tarde.
Adrian Cid Almaguer
11
Você pode encontrei o problema eo patch no drupal.org/node/2756071#comment-11339679
Adrian Cid Almaguer
O patch foi submetido, se precisar de alguém para usar o drush entity-deletecomando deve usar neste momento a versão dev do módulo Drush Entidade drupal.org/project/drush_entity/releases/7.x-5.x-dev
Adrian Cid Almaguer
7

Por fim, crio meu próprio módulo chamado drush_delete

Dentro do drush_delete.drush.incarquivo, coloque 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 o módulo, execute drush cc drushpara limpar o cache de drush e use o comando da seguinte maneira:

Para excluir um nó, use:

drush node-delete 1
drush nd 1

Para excluir vários nós, use:

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

Você pode encontrar o comando neste módulo:

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

Adrian Cid Almaguer
fonte
6

IMHO a maneira mais fácil é com o 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
fonte
Obrigado, mas acho que se você tiver um comando drush, poderá adicionar argumentos e opções que talvez sejam necessários. E você pode adicionar validações de maneira fácil.
Adrian Cid Almaguer
Eu amo essa resposta. Nenhum comando drush personalizado é necessário.
Johnathan Elmore