Как удалить все узлы данного типа контента?


31

У меня есть несколько тысяч узлов определенного типа контента. Используя веб-интерфейс (example.com/admin/content), я могу удалить только около 50 одновременно. Как я могу быстро удалить их?

Ответы:


32

Для этого есть модуль (ТМ).

См. Массовое удаление .

При этом будет использоваться пакетный API для удаления узлов, чтобы избежать проблем с тайм-аутом или памятью при удалении тысяч узлов одним вызовом node_delete_multiple ().

Массовое удаление - это заброшенный модуль. Смотрите альтернативы:


Вау, я полностью пропустил это. Хорошая находка.
Грег

4
Еще один метод, который может быть полезен, если вы делаете больше, чем простой фильтр типов контента, - это использовать Bulk Operations: drupal.org/project/views_bulk_operations
geerlingguy

Модуль «Массовое удаление» больше не используется. Там предлагается использовать Views Bulk Operations.
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 одним из способов является использование метода entityQuery () с методом 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

РЕДАКТИРОВАТЬ (Другой способ, благодаря @ 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 () ожидает загруженные сущности, а не ID, что и возвращает запрос сущности. Вместо не описательного результата $ используйте $ ids или $ nids и затем $ storage-> delete ($ storage-> load ($ ids)).
Бердир

@Berdir спасибо, я еще раз протестирую код, может быть, эта проблема была введена в одном редакторе
Адриан Сид Альмагер

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

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

1
Недавно использовал это в хуке обновления, стоит отметить, что если вы используете, entityQuery вы должны установить accessCheckв заявлении. В противном случае, если вы запустите его в drush, по умолчанию accessCheck будет иметь значение true, и любые узлы, к которым uid 0 не имеет доступа, возвращаться не будут.
AWM

13

Если вы хотите сделать это исключительно через пользовательский интерфейс, вы можете использовать модуль devel_generate.

  1. Перейдите в меню «Создать контент» в «Конфигурация» (admin / config / development / generate / content).
  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.
я.тек

10

Вы можете сделать это в Drupal 7, используя часть Execute PHP Code модуля Devel, введя:

$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 и модуль delete all :

 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:

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 и предоставляет очень полезные команды drush. Например, чтобы удалить все содержимое типа articleсодержимого:

drush delete-all article  

Это работает с D8? Я включил модуль, но получил команду drush 'delete-all article'. Я также очистил тайник с мусором
Яссин Тахта

1

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

С уважением



0

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

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

так же как и модуль Bulk Delete, удалит все узлы определенного типа, используя пакетный 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

Просто зайдите в Dashboard -> Content, выберите весь контент (вы можете фильтровать по типу контента), затем выберите «Delete item»

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.