Могу ли я удалить узлы данного типа контента с помощью Drush?
Просто интересно, способен ли Drush удалять узлы данного типа контента.
Что-то вроде: $ drush delete-node --type=MyContentType
Если это невозможно, могу ли я создать метод подобным образом?
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 есть пример того, как это сделать (проверьте раздел "Команды" внизу).
Установите модуль разработки и используйте drush для удаления всех узлов,
$ drush genc --kill 0 0
Вы также можете указать параметр типа,
$ drush genc --kill --types=article 0 0
Друш 9
drush entity:delete node --bundle=my_content_type
Я думаю, вы можете сделать это, используя приведенную ниже команду
drush node_delete <nid>
РЕДАКТИРОВАТЬ: Найден модуль, который делает что-то/связанное с вопросом
Http://drupal.org/project/delete_all
Использование
Драш
drush delete-all
Пример: drush delete-all article
Что-то вроде этого будет работать (непроверено):
$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 гарантирует, что все правильные крючки сработают. Помимо прочего, они также удалят ревизии узлов и данные полей (и их редакции), чтобы у вас не было потерянных данных в базе данных.
В этой теме есть несколько хороших идей. Если вы на самом деле не хотите заниматься программированием и хотите использовать 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
VBO имеет интеграцию Drush.
Создайте представление узлов VBO, выполните его с помощью Drush (используя drush vbo-execute
), передайте тип узла в качестве аргумента.
Вы также можете создать сценарий 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" - это тип, используемый в первом запросе.
Друпал 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);
Чтобы удалить все узлы определенного типа контента, вы можете попробовать выполнить следующую команду через drush:
drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'
Где MyContentType - это имя типа содержимого вашего компьютера (например, Страница).
Для отдельных узлов:
$ drush php-eval 'node_delete($node->nid);'
Drush php-оценка
Оценить произвольный php-код после начальной загрузки Drupal
Обновление ответа, предоставленного @kenorb.
В Drupal 8
drush eval '$nids = \Drupal::entityQuery('node')->execute(); $storage = Drupal::entityTypeManager()->getStorage('node'); $e = $storage->loadMultiple($nids); $storage->delete($e);'
Вы можете использовать
drush node_delete NID
чтобы удалить определенный узел, но если вы хотите удалить все узлы по типу контента, я думаю, вы можете создать плагин drush с помощью пакетного api.
Вы также можете сделать это с помощью модуля devel, как указано в Могу ли я удалить узлы данного типа контента с помощью Drush?
Установите модуль разработки и используйте drush для удаления всех узлов,
$drush genc --убить 0 0
Вы также можете указать параметр типа,
$drush genc --убить--типы=статья 0 0