Jak usunąć węzeł lub listę węzłów za pomocą Drush?

8

Odkryłem moduł Usuń wszystko , który umożliwia usunięcie wszystkich węzłów danego typu zawartości. Jednak w tym module nie można usunąć pojedynczego węzła ani listy węzłów.

W pytaniu „ Czy mogę usunąć węzły danego typu zawartości za pomocą Drush? ” Znalazłem 2 odpowiedzi mówiące o poleceniu, drush node_delete <nid>ale nie mogę znaleźć tego polecenia.

W dyskusji na temat node_delete () znalazłem trochę kodu używającego eval do wykonania tego zadania, ale używa eval:

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

W przypadku, gdy nie ma zaimplementowanej funkcjonalności pozwalającej to osiągnąć, jaki jest lepszy sposób na wdrożenie tej funkcjonalności: w module Drush lub utworzyć nowy moduł?

Adrian Cid Almaguer
źródło

Odpowiedzi:

6

Jeśli korzystasz z modułu Drush Entity , możesz uruchomić, drush entity-delete node 123aby usunąć nid 123 ze swojej witryny.

EDYCJA: Jeśli ktoś musi użyć drush entity-deletepolecenia, powinien użyć wersji deweloperskiej modułu: https://www.drupal.org/project/drush_entity/releases/7.x-5.x-dev

greg_1_anderson
źródło
dzięki greg, zawsze pomagasz z drushami ;-)
Adrian Cid Almaguer
Znalazłem błąd w module jednostki drush, który nie pozwala na usunięcie węzłów, łatę popiszę później.
Adrian Cid Almaguer,
1
Problem i łatkę można znaleźć w drupal.org/node/2756071#comment-11339679
Adrian Cid Almaguer
Łatka została przesłana, jeśli ktoś musi użyć drush entity-deletepolecenia, powinien w tym momencie użyć wersji deweloperskiej modułu Drush
Adrian Cid Almaguer
7

Wreszcie tworzę własny moduł o nazwie drush_delete

W drush_delete.drush.incpliku umieść ten kod:

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

Zainstaluj moduł, uruchom, drush cc drushaby wyczyścić pamięć podręczną drush i użyj następującego polecenia:

Aby usunąć węzeł, użyj:

drush node-delete 1
drush nd 1

Aby usunąć wiele węzłów, użyj:

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

Możesz znaleźć polecenie w tym module:

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

Adrian Cid Almaguer
źródło
6

IMHO najprościej jest z 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
źródło
Dzięki, ale myślę, że jeśli masz komendę drush, możesz dodać argumenty i opcje, które być może są potrzebne. I możesz łatwo dodawać weryfikacje.
Adrian Cid Almaguer
Uwielbiam tę odpowiedź. Nie jest wymagane niestandardowe polecenie drush.
Johnathan Elmore,