Чи можна видалити вузли заданого типу вмісту за допомогою 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 (перевірте розділ Commands внизу).


Я бачу, це звучить як посилання на сховище показує, як правильно додати метод буріння.
chefnelone

Так! У readme є кілька різних способів, як ви також можете їх реалізувати!
Чапабу

21

Встановіть модуль розробки та використовуйте "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>

EDIT: Знайдено модуль, який щось робить / пов’язаний із питанням

http://drupal.org/project/delete_all

Використання

Дриль

drush delete-all

Приклад: drush delete-all article


Я мав на увазі видалити всі вузли за типом вмісту.
chefnelone

Чи пробували ви цей модуль drupal.org/project/delete_all Використання Drush Drush видалення-все Приклад: Drush видалення-всі статті
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 delete-all
Приклад: стаціонарна стаття видалення

Натисніть на версію Drupal 7

Видаліть усі вузли, вузли певного типу вмісту або користувачів.

Приклади:
 drush delete all - Вилучити всі статті статті.
 drush delete - всі всі Видалити вузли всіх типів.
 drush delete-all - reset Видалити вузли всіх типів та скинути вузол, лічильник перегляду та коментарів.
 drush delete - всі користувачі Видалити користувачів.

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

Псевдоніми: так

4

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


Я думаю, що це те, що мені потрібно. Просто 2 питання: Який метод буріння для перегляду? і чи буде цей метод швидшим, ніж виконання перегляду в браузері?
chefnelone

Відредаговано відповідь, щоб вказати точну команду boush. І так, це буде швидше, оскільки таким чином подання не відображається.
Боян Живанович

1

Ви також можете створити сценарій друку (скажімо, він називається "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?
Елін Й.

це приклад, як тип.
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 - ваше ім’я типу вмісту (наприклад, Сторінка).


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 =' \ '' вузол '\' '; entit_delete_multiple ($ type, \ Drupal :: entitQuery ($ type) -> Execute ()) '
geek-merlin

Щоб оновити існуючу відповідь, будь ласка, залиште коментар, щоб запропонувати змінити.
leymannx

0

Можна використовувати

drush node_delete NID щоб видалити певний вузол, але якщо ви хочете видалити всі вузли за типом вмісту, я думаю, ви можете створити плагін "drush", використовуючи пакетний api.


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

0

Ви також можете зробити це за допомогою модуля розробки, на який відповіли в розділі Чи можна видалити вузли заданого типу вмісту за допомогою Drush?

Встановіть модуль розробки та використовуйте "drush" для видалення всіх вузлів,

$ drush genc --kill 0 0

Ви також можете надати тип типу,

$ drush genc --kill --types = стаття 0 0

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.