Как удалить узел или список узлов с помощью Drush?

8

Я обнаружил модуль Удалить все, который дает вам возможность удалить все узлы данного типа контента. Однако с этим модулем вы не можете удалить ни один узел, ни список узлов.

На вопрос « Могу ли я удалить узлы заданного типа контента с помощью Drush? », Я нашел 2 ответа, говорящих о команде, drush node_delete <nid>но не могу найти эту команду.

В обсуждении о node_delete () я обнаружил некоторый код, использующий eval для выполнения этой задачи, но он использует eval:

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

В случае, если не существует функциональности, реализованной для достижения этой цели, как лучше реализовать эту функциональность: в модуле Drush или создать новый модуль?

Адриан Сид Альмагер
источник

Ответы:

6

Если вы используете модуль Drush Entity , вы можете запустить, drush entity-delete node 123чтобы удалить nid 123 с вашего сайта.

РЕДАКТИРОВАТЬ: Если кому-то нужно использовать drush entity-deleteкоманду, следует использовать версию модуля dev: https://www.drupal.org/project/drush_entity/releases/7.x-5.x-dev

greg_1_anderson
источник
спасибо Грэг, ты всегда помогаешь с дрюшками ;-)
Адриан Сид Алмагуер,
Я обнаружил ошибку в модуле сущности drush, которая не позволяет удалять узлы, я исправлю патч позже.
Адриан Сид Альмагуер
1
Вы можете найти проблему и патч в drupal.org/node/2756071#comment-11339679
Адриан Сид Альмагуер
Патч был представлен, если кому-то нужно использовать drush entity-deleteкоманду, в данный момент следует использовать dev-версию модуля Drush
Adrian Cid Almaguer,
7

Наконец я создаю свой собственный модуль с именем drush_delete

Внутри drush_delete.drush.incфайла поместите этот код:

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

Установите модуль, запустите, drush cc drushчтобы очистить кэш-память, и используйте следующую команду:

Чтобы удалить узел, используйте:

drush node-delete 1
drush nd 1

Для удаления нескольких узлов используйте:

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

Вы можете найти команду в этом модуле:

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

Адриан Сид Альмагер
источник
6

ИМХО самый простой способ с 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
источник
Спасибо, но я думаю, что если у вас есть команда drush, вы можете добавить аргументы и опции, которые могут понадобиться. И вы можете добавить проверки в простой способ.
Адриан Сид
Мне нравится этот ответ. Никакая пользовательская команда не требуется.
Джонатан Элмор