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

13

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

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

Если это невозможно, могу ли я создать такой метод ?

chefnelone
источник

Ответы:

4

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

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 (см. Раздел «Команды» внизу).

Chapabu
источник
Я вижу, похоже, что ссылка на репозиторий показывает, как правильно добавить метод drush.
chefnelone
Ага! В файле readme есть несколько разных способов их реализации!
Чапабу
21

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

$  drush genc --kill 0 0 

Вы также можете указать опцию типа

$  drush genc --kill --types=article 0 0
ericj
источник
Умно, мне это нравится.
m4olivei
3
Это работает с D8. devel_generateМодуль включен с разви, но должна быть включена с drush en devel_generate Genc обычно используется для создания узлов, так что 0 0 в конце говорит это , чтобы не создавать ничего нового, и --kill удалить то , что уже есть.
Уильям Туррелл
15

Я думаю, вы можете с помощью приведенной ниже команды

drush node_delete <nid>

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

http://drupal.org/project/delete_all

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

Drush

drush delete-all

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

ninjascorner
источник
Я имел в виду удалить все узлы по типу контента.
Chefnelone
Вы пробовали этот модуль drupal.org/project/delete_all Использование Drush drush delete-all Пример: drush delete-all статья
ninjascorner
где я могу найти команду drush node_delete <nid>?
Адриан Сид Альмагуер
Чтобы сэкономить время людей, по состоянию на декабрь 2016 года delete_all еще не перенесен на Drupal 8 , но ответ genc работает.
Уильям Туррелл
5

Примерно так будет работать (не проверено):

$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 обеспечит срабатывание всех правильных хуков. Помимо прочего, они также будут удалять ревизии узлов и данные полей (и их ревизии), чтобы у вас не было потерянных данных в базе данных.

mpdonadio
источник
5

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

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

Drush на Drupal 7 версии

Удалить все узлы, узлы определенного типа контента или пользователей.

Примеры:
 drush delete-all article Отменить выбор всех узлов статьи.
 drush delete-all all Удалить узлы всех типов.
 drush delete-all --reset Удалить узлы всех типов и сбросить счетчики узлов, ревизий и комментариев.
 drush delete-all users Удалить пользователей.

Параметры:
 --reset Сбросить счетчик для таблиц узлов, ревизий и комментариев.
 - роли выбирают роли

Псевдонимы: da
tenken
источник
5

Drush 9

drush entity:delete node --bundle=my_content_type

Денис Вюник
источник
2
Лучший ответ сегодня!
Джонатан
4

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

Боян Живанович
источник
Я думаю, что это то, что мне нужно. Просто 2 вопроса: Какой метод drush выполняет представление? и будет ли этот метод быстрее выполнения представления в браузере?
chefnelone
Отредактировал ответ, чтобы указать точную команду drush. И да, это будет быстрее, потому что таким образом представление не отображается.
Боян Живанович
1

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

#!/usr/bin/env drush

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

echo "deleted:" . $res;

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

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

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

Документ: https://api.drupal.org/api/drupal/includes!database!database.inc/function/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» - это тот, который использовался в первом запросе.

Мауро Маскиа
источник
Почему состояние 'nid' > 5000?
Елин Й.
это пример, как тип.
Mauro Mascia
Но оригинальный постер не упоминает о таком состоянии, поэтому я думаю, что пример не имеет значения, поэтому вводит в заблуждение.
Елин Й.
1

Drupal 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);
kenorb
источник
1

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

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

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

kenorb
источник
1

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

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

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

edmitry
источник
Пожалуйста, добавьте некоторые подробности, чтобы объяснить ваш код, без этого это может рассматриваться как некачественный ответ (и, следовательно, он может быть удален посредством модерации).
Pierre.Vriens
1

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

В Друпале 8

drush eval '$nids = \Drupal::entityQuery('node')->execute(); $storage = Drupal::entityTypeManager()->getStorage('node'); $e = $storage->loadMultiple($nids); $storage->delete($e);'
Джейсон Яррингтон
источник
drush ev '$ type =' \ '' node '\' '; entity_delete_multiple ($ type, \ Drupal :: entityQuery ($ type) -> execute ()); '
geek-merlin
Чтобы обновить существующий ответ, оставьте комментарий, чтобы предложить редактирование.
Leymannx
0

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

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

user8012
источник
Я не могу найти команду NID drush node_delete.
Адриан Сид Альмагер