Могу ли я удалить узлы данного типа контента с помощью Drush?


Просто интересно, способен ли Drush удалять узлы данного типа контента.

Что-то вроде: $ drush delete-node --type=MyContentType

Если это невозможно, могу ли я создать метод подобным образом?

 14
Author: chefnelone, 2012-06-14

14 answers

Вы могли бы создать функцию следующим образом:

function MYMODULE_delete_all_the_things() {
  $query = new EntityFieldQuery;

  $result = $query->entityCondition('entity_type', 'node')
    ->propertyCondition('type', 'YOUR-CONTENT-TYPE')
    ->execute();

  if (isset($result['node']) && count($result['node'])) {

    $node_ids = array_keys($result['node']);

    node_delete_multiple($node_ids);
  }
}

Примечание - Вы также можете использовать простой запрос SELECT, но, учитывая, что вы работаете с сущностями, кажется более разумным/общепринятым использовать запрос EntityFieldQuery.

Это также должно быть довольно легко изменить или добавить аргументы. Вы также можете довольно легко поместить его в команду Drush - в репозитории Drush есть пример того, как это сделать (проверьте раздел "Команды" внизу).

 4
Author: Chapabu, 2015-03-09 16:52:11

Установите модуль разработки и используйте drush для удаления всех узлов,

$  drush genc --kill 0 0 

Вы также можете указать параметр типа,

$  drush genc --kill --types=article 0 0
 23
Author: ericj, 2013-11-19 11:48:00

Друш 9

drush entity:delete node --bundle=my_content_type

 17
Author: Denis Viunyk, 2018-10-18 08:02:30

Я думаю, вы можете сделать это, используя приведенную ниже команду

drush node_delete <nid>

РЕДАКТИРОВАТЬ: Найден модуль, который делает что-то/связанное с вопросом

Http://drupal.org/project/delete_all

Использование

Драш

drush delete-all

Пример: drush delete-all article

 16
Author: ninjascorner, 2012-06-16 00:01:07

Что-то вроде этого будет работать (непроверено):

$query = new EntityFieldQuery();

$entities = $query->entityCondition('entity_type', 'node', '=')
  ->entityCondition('bundle', 'Announcements')
  ->execute();

$nids = array_keys($entities['node']);

node_delete_multiple($nids);

Это позволит найти все узлы с типом контента Annoucements с помощью EntityFieldQuery(). Затем он получает все $nids из результата и удаляет их с помощью node_delete_multiple().

Вы можете взять этот код, поместить его в отдельный PHP-файл, а затем выполнить его с помощью drush scr.

Использование API гарантирует, что все правильные крючки сработают. Помимо прочего, они также удалят ревизии узлов и данные полей (и их редакции), чтобы у вас не было потерянных данных в базе данных.

 5
Author: mpdonadio, 2013-10-04 16:58:11

В этой теме есть несколько хороших идей. Если вы на самом деле не хотите заниматься программированием и хотите использовать Drush, вы можете посмотреть на Удалить все внесенный модуль:

Drush
drush delete-all
Example: drush delete-all article

Drush on Drupal 7 version

Delete all nodes, nodes of a specific content type or users.

Examples:
 drush delete-all article             Delect all article nodes.
 drush delete-all all                 Delete nodes of all types.
 drush delete-all --reset             Delete nodes of all types, and reset node, revision and comment counters.
 drush delete-all users               Delete users.

Options:
 --reset                              Reset counter for node, revision and comment tables.
 --roles                              pick roles

Aliases: da
 5
Author: tenken, 2013-10-04 19:55:14

VBO имеет интеграцию Drush. Создайте представление узлов VBO, выполните его с помощью Drush (используя drush vbo-execute), передайте тип узла в качестве аргумента.

 4
Author: Bojan Zivanovic, 2012-06-15 15:30:36

Вы также можете создать сценарий drush (скажем, он называется"bulk_delete.php "и помещается в корневую папку Drupal):

#!/usr/bin/env drush

$res = db_delete('node')
  ->condition('type', 'mycontenttype', '=')
  ->execute();

echo "deleted:" . $res;

Это абсолютно самый быстрый способ сделать это: прямой запрос к бд, используя функцию db_delete от Drupal

Использование:

:~# cd /var/www/www.mysite.com
:~# drush --uri=www.mysite.com scr bulk_delete.php 

Документ: https://api.drupal.org/api/drupal/includes!база данных!база данных.inc/функция/db_delete/7

Предупреждение: этот процесс не удаляет данные их полей. Во всяком случае, тот же самый процесс может быть применен к этим полям (глядя на столбец "связка" каждого поля). Например:

#!/usr/bin/env drush

$field_tables = array(
  'field_data_field_body',
  'field_data_field_mycoolfield',
  'field_revision_body',
  'field_revision_field_mycoolfield'
);

foreach ($field_tables as $field_table) {
  $res = db_delete($field_table)
    ->condition('bundle', 'mycontenttype', '=')
    ->execute();

  echo "deleted:" . $res . "\n\n";
}

Где "mycontenttype" - это тип, используемый в первом запросе.

 1
Author: Mauro Mascia, 2013-10-08 17:32:04

Друпал 7

Попробуйте следующий однострочный, он удаляет все узлы MyContentType из Drupal:

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

Или вы можете удалить все сущности на основе имени типа сущности (например, узел):

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

Примечание: node - это имя вашего типа сущности, вы можете изменить его при необходимости.


Если вы получите ошибки памяти или тайм-аута, вы можете добавить следующие наборы непосредственно перед $res:

ini_set('memory_limit', -1); ini_set('max_execution_time', 0);
 1
Author: kenorb, 2014-08-07 11:59:37

Чтобы удалить все узлы определенного типа контента, вы можете попробовать выполнить следующую команду через drush:

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

Где MyContentType - это имя типа содержимого вашего компьютера (например, Страница).

 1
Author: kenorb, 2014-08-19 12:33:28

Для отдельных узлов:

$ drush php-eval 'node_delete($node->nid);'

Drush php-оценка
Оценить произвольный php-код после начальной загрузки Drupal

 1
Author: edmitry, 2016-11-28 14:57:32

Обновление ответа, предоставленного @kenorb.

В Drupal 8

drush eval '$nids = \Drupal::entityQuery('node')->execute(); $storage = Drupal::entityTypeManager()->getStorage('node'); $e = $storage->loadMultiple($nids); $storage->delete($e);'
 1
Author: Jason Yarrington, 2018-03-07 05:30:58

Вы можете использовать

drush node_delete NID чтобы удалить определенный узел, но если вы хотите удалить все узлы по типу контента, я думаю, вы можете создать плагин drush с помощью пакетного api.

 0
Author: user8012, 2012-06-14 10:13:39

Вы также можете сделать это с помощью модуля devel, как указано в Могу ли я удалить узлы данного типа контента с помощью Drush?

Установите модуль разработки и используйте drush для удаления всех узлов,

$drush genc --убить 0 0

Вы также можете указать параметр типа,

$drush genc --убить--типы=статья 0 0

 0
Author: wranvaud, 2017-04-13 12:47:09