Як видалити всі вузли заданого типу вмісту?


31

У мене є кілька тисяч вузлів певного типу вмісту. Використовуючи веб-інтерфейс (example.com/admin/content), я можу видалити лише приблизно 50 одночасно. Як швидко їх видалити?

Відповіді:


32

Для цього є модуль (TM).

Див. Групове видалення .

Це використовує пакетний API для видалення вузлів, щоб уникнути затримки часу або пам’яті при видаленні тисяч вузлів одним викликом node_delete_multiple ().

Масове видалення - це покинутий модуль. Подивіться альтернативи:


Нічого собі, я цілком пропустив цей. Гарна знахідка.
Грег

4
Ще один метод, який може бути корисний , якщо ви робите більше , ніж простий фільтр типу контенту, є використання масових операцій Переглядів: drupal.org/project/views_bulk_operations
geerlingguy

Модуль групового видалення зараз покинутий. Там пропонується використовувати масові операції Views.
Refineo

26

Дивлячись на модуль Devel Generate для натхнення, ось його функція "вбити вміст" devel_generate_content_kill:

function devel_generate_content_kill($values) {
  $results = db_select('node', 'n')
              ->fields('n', array('nid'))
              ->condition('type', $values['node_types'], 'IN')
              ->execute();
  foreach ($results as $result) {
    $nids[] = $result->nid;
  }

  if (!empty($nids)) {
    node_delete_multiple($nids);
    drupal_set_message(t('Deleted %count nodes.', array('%count' => count($nids))));
  }
}

Тому я б спробував або використовувати Devel Generate для видалення всіх вузлів, але не створювати нових, або використовувати example.com/devel/php для виклику devel_generate_content_kill(array('node_types' => array('my_node_type')));безпосередньо.


17

У Drupal 8 одним із способів є використання методу entitQuery () за допомогою методу EntityStorageInterface :: delete () :

$result = \Drupal::entityQuery("node")
    ->condition("type", "YOUR_CONTENT_TYPE_NAME")
    // If the update is being executed via drush entityQuery will only
    // return the content uid 0 have access to. To return all set
    // accessCheck to false since it defaults to TRUE. 
    ->accessCheck(FALSE)
    ->execute();

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadMultiple($result);
$storage_handler->delete($entities);

Якщо вам потрібно застосувати інші фільтри / умови, ви можете перевірити сторінку інтерфейсу QueryInterface

EDIT (Інший спосіб, завдяки @ 4k4 ):

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadByProperties(["type" => "YOUR_CONTENT_TYPE_NAME"]);
$storage_handler->delete($entities);

Якщо ви хочете перевірити код, ви можете використовувати:

drush php-eval '$storage_handler = \Drupal::entityTypeManager()->getStorage("node"); $entities = $storage_handler->loadByProperties(["type" => "article"]); $storage_handler->delete($entities);'

Це видалить усі ваші статті.


Це невірно, delete () очікує завантажених об'єктів, а не ідентифікаторів, що повертає запит сутності. Замість не описового $ результату використовуйте $ ids або $ nids, а потім $ storage-> delete ($ storage-> load ($ ids)).
Бердір

@Berdir спасибі, я ще раз перевірю код, можливо, ця проблема була введена в одній редакції
Адріан Сид Альмагер

@Berdir Я оновлюю відповідь і перевіряю код, і він працює, проблема була введена в одному редагуванні.
Адріан Сид Альмагюр

2
@AdrianCidAlmaguer, ви можете замінити запит на$entities = $storage_handler->loadByProperties(['type' => 'YOUR_CONTENT_TYPE_NAME']);
4k4

1
Нещодавно використовуючи це в гачку оновлення, варто зазначити, що якщо ви використовуєте, entityQuery ви повинні встановити accessCheckоператор on. В іншому випадку, якщо ви запускаєте його в друку, за замовчуванням accessCheck встановлено значення true і всі вузли, до яких uid 0 не має доступу, не будуть повернуті.
awm

13

Якщо ви хочете зробити це виключно через інтерфейс користувача, ви можете використовувати модуль devel_generate.

  1. Перейдіть до меню "Створити вміст" у розділі "Конфігурація" (адміністратор / конфігурація / розвиток / генерування / вміст).
  2. Виберіть типи вмісту, які потрібно видалити.
  3. Переконайтесь, що прапорець "Видалити весь вміст у цих типах вмісту перед створенням нового вмісту" встановлено.
  4. Встановіть кількість вузлів, які ви хочете створити, на "0".

Таким чином, не буде створено жодних вузлів, а всі вузли вибраних типів буде видалено.


10

Створіть файл із кодом нижче в корені інсталяції drupal та виконайте його.

<?php
  require_once './includes/bootstrap.inc';
  drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

  $aquery= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'company'");
  while ($row = db_fetch_object($aquery)) {
    node_delete($row->nid);
  }
?>

1
db_fetch_object не є частиною api бази даних D7.
ya.teck

10

Це можна зробити в Drupal 7, використовуючи частину модуля Devel Execute PHP Code, ввівши:

$result= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'TYPE'");
foreach ($result as $record) {
  node_delete($record->nid);
}

1
Це буде виконуватися дуже повільно, якщо вам потрібно видалити тисячі вузлів, краще скористатися методом, який використовує пакетний API, такий як VBO.
abielefeldt

6

Зробіть це в терміналі, якщо ви використовуєте Drush та видаліть весь модуль:

 drush delete-all [content-type-machine-name]


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

5

Перегляд "Масових" операцій забезпечує екран з адмініструванням вузла BatchAPI з можливістю фільтрування за типом, вибір усіх вузлів, що відповідають вашим критеріям пошуку тощо.

Це моє рішення в друкарському режимі в Drupal 6 - окрім пакетного видалення, ви можете групово редагувати вузли та виконувати купу інших матеріалів.

Схоже, версія Drupal 7 ще не готова - але я б дивився цей модуль на випуск D7.


4

Ще один фрагмент:

$query = db_query("SELECT n.nid FROM {node} n WHERE n.type = 'TO_BE_DELETED'"); 
while ($n = db_fetch_object($query)) 
{
     node_delete($n->nid); 
} 

де TO_BE_DELETEDтип вмісту, який потрібно видалити


3
Слід зазначити, що працює лише для Drupal 4.6, 5 та 6. Версія Drupal 7db_delete('node')
Грег

4

За допомогою модуля Devel за допомогою барабану:

drush genc 0 --types=article --kill

Або в інтерфейсі користувача, як пояснено тут: http://befused.com/drupal/delete-nodes-devel


Це підмодуль Devel, devel_generateякий потрібно активувати. А для декількох типів цеdrush genc 0 --kill --types="article, page"
leymannx

3

Я використовую Видалити всі модулі, він прекрасно працює з D8 і забезпечує дуже корисні команди ударних. Наприклад, щоб видалити весь вміст типу articleвмісту:

drush delete-all article  

Це працює з D8? Я ввімкнув модуль, але я отримав команду drush 'delete-all article' не вдалося знайти. Я також очистив кеш-пам'ять
Yassin Tahtah

1

Ви можете спробувати Видалити весь модуль, перейдіть до 'admin / content / delete_content', і вам буде представлена ​​форма для видалення вмісту, що належить певним типам контенту.

З повагою



0

Цей модуль використовується для видалення всього вмісту та / або користувачів із сайту. Це в основному інструмент для розробників, який може стати в нагоді в декількох випадках

https://www.drupal.org/project/delete_all

як і модуль групового видалення видалить будь-які вузли певного типу вузла за допомогою пакетного api. Для невеликої кількості вузлів рекомендується використовувати модуль Views Batch Operations (VBO). Але якщо вам доведеться видалити 10 000 вузлів, цей модуль може бути кращим варіантом.

https://www.drupal.org/project/bulkdelete


0

Програмно видаляйте всі вузли типу вмісту. Тут є допоміжна функція:


function _delete_all_nodes_of_type($type = '') {
  // Return all nids of nodes of type.
  $nids = db_select('node', 'n')
    ->fields('n', array('nid'))
    ->condition('n.type', $type)
    ->execute()
    ->fetchCol(); // returns an indexed array
  if (!empty($nids)) {
    node_delete_multiple($nids);
    drupal_set_message(format_plural(count($nids), count($nids) . ' node Deleted.', count($nids) . ' nodes Deleted.'));
  }
}


-1

Я закінчив використовувати db_delete , не потрібні модулі:

<?php
  db_delete('node')
    ->condition('type', 'MY_CONTENT_TYPE')
    ->execute();
?>

Редагування / попередження: Дивіться коментар Бердіра нижче. Цей метод не очищує всі дані, пов'язані з вузлами.


3
Проблема такого підходу полягає в тому, що інші модулі також не здатні реагувати та видаляти свою інформацію. Залежно від типу вмісту, у таблиці content_type цього вузла є специфічна інформація про вузол, поля, таксономії (поле теж насправді), коментарі тощо. Таким чином, ви, можливо, у вашій базі даних буде багато інформації.
Бердір

@Berdir - Цікаво. Чи є кращий вбудований спосіб видалення вузлів?
Грег

3
Є node_delete () та node_delete_multiple (), див. Відповідь tim.plunket, але він не призначений для обробки тисяч вузлів, див. Api.drupal.org/api/drupal/modules--node--node.module/function /… . Він завантажує всі вузли, а потім повторює їх в одному запиті. Таким чином, в значній мірі доводиться використовувати модуль contrib, наприклад bulkdelete, якщо ви хочете видалити сотні чи тисячі вузлів.
Бердір

-1

Якщо ви не хочете кодувати, ви можете спробувати цей модуль, https://drupal.org/project/total_control

Просто перейдіть на Інформаційну панель -> Вміст, виберіть увесь вміст (ви можете фільтрувати за типом вмісту), а потім виберіть "Видалити елемент"

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