Відповіді:
Ви можете створити функцію таким чином:
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 (перевірте розділ Commands внизу).
Встановіть модуль розробки та використовуйте "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>
EDIT: Знайдено модуль, який щось робить / пов’язаний із питанням
http://drupal.org/project/delete_all
Використання
Дриль
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 delete-all Приклад: стаціонарна стаття видалення Натисніть на версію Drupal 7 Видаліть усі вузли, вузли певного типу вмісту або користувачів. Приклади: drush delete all - Вилучити всі статті статті. drush delete - всі всі Видалити вузли всіх типів. drush delete-all - reset Видалити вузли всіх типів та скинути вузол, лічильник перегляду та коментарів. drush delete - всі користувачі Видалити користувачів. Параметри: --встановити лічильник скидання для вузлів, таблиць ревізії та коментарів. --ролі вибирають ролі Псевдоніми: так
VBO має інтеграцію Drush. Створіть перегляд VBO вузлів, виконайте його через Drush (використовуючи drush vbo-execute
), передайте тип вузла як аргумент.
Ви також можете створити сценарій друку (скажімо, він називається "bulk_delete.php" і розміщений під кореневою папкою Drupal):
#!/usr/bin/env drush
$res = db_delete('node')
->condition('type', 'mycontenttype', '=')
->execute();
echo "deleted:" . $res;
Це абсолютно найшвидший спосіб зробити це: прямий запит на db, використовуючи функцію 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 - ваше ім’я типу вмісту (наприклад, Сторінка).
Для окремих вузлів:
$ 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.
Ви також можете зробити це за допомогою модуля розробки, на який відповіли в розділі Чи можна видалити вузли заданого типу вмісту за допомогою Drush?
Встановіть модуль розробки та використовуйте "drush" для видалення всіх вузлів,
$ drush genc --kill 0 0
Ви також можете надати тип типу,
$ drush genc --kill --types = стаття 0 0