Просто интересно, способен ли Drush удалять узлы с данным типом контента.
Что-то вроде: $ drush delete-node --type=MyContentType
Если это невозможно, могу ли я создать такой метод ?
Просто интересно, способен ли Drush удалять узлы с данным типом контента.
Что-то вроде: $ drush delete-node --type=MyContentType
Если это невозможно, могу ли я создать такой метод ?
Ответы:
Вы можете создать функцию следующим образом:
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 (см. Раздел «Команды» внизу).
Установите модуль devel и используйте drush для удаления всех узлов,
$ drush genc --kill 0 0
Вы также можете указать опцию типа
$ drush genc --kill --types=article 0 0
devel_generate
Модуль включен с разви, но должна быть включена с drush en devel_generate
Genc обычно используется для создания узлов, так что 0 0 в конце говорит это , чтобы не создавать ничего нового, и --kill удалить то , что уже есть.
Я думаю, вы можете с помощью приведенной ниже команды
drush node_delete <nid>
РЕДАКТИРОВАТЬ: Нашел модуль, который делает что-то / связано с вопросом
http://drupal.org/project/delete_all
использование
Drush
drush delete-all
Пример: drush delete-all article
delete_all
еще не перенесен на Drupal 8 , но ответ genc работает.
Примерно так будет работать (не проверено):
$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 Пример: 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
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;
Это абсолютно быстрый способ сделать это: прямой запрос к БД с использованием функции 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
?
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);
Чтобы удалить все узлы определенного типа контента, вы можете попробовать выполнить следующую команду с помощью drush:
drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'
Где MyContentType - это имя типа содержимого вашего компьютера (например, Page).
Для отдельных узлов:
$ drush php-eval 'node_delete($node->nid);'
drush php-eval
Оценка произвольного php-кода после начальной загрузки Drupal
Обновление ответа предоставлено @kenorb.
В Друпале 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?
Установите модуль devel и используйте drush для удаления всех узлов,
$ drush genc --kill 0 0
Вы также можете указать опцию типа
$ drush genc --kill --types = article 0 0