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


13

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

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

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

Ответы:


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


Я вижу, похоже, что ссылка на репозиторий показывает, как правильно добавить метод drush.
chefnelone

Ага! В файле readme есть несколько разных способов их реализации!
Чапабу

21

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

$  drush genc --kill 0 0 

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

$  drush genc --kill --types=article 0 0

Умно, мне это нравится.
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


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


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


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);

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).


1

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

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

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


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


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

0

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

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

$ drush genc --kill 0 0

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

$ drush genc --kill --types = article 0 0

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.