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

31

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

Greg
источник

Ответы:

32

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

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

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

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

Berdir
источник
Вау, я полностью пропустил это. Хорошая находка.
Грег
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')));прямого вызова .

tim.plunkett
источник
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».

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

areynolds
источник
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);
  }
?>
Satya
источник
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
shrish
источник
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тип контента для удаления.

Tangurena
источник
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

sunzu
источник
Это подмодуль Devel, devel_generateкоторый нужно включить. И для нескольких типов этоdrush genc 0 --kill --types="article, page"
leymannx
3

Я использую модуль « Удалить все », он отлично работает с D8 и предоставляет очень полезные команды drush. Например, чтобы удалить все содержимое типа articleсодержимого:

drush delete-all article  
gerzenstl
источник
Это работает с 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

Onlink
источник
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.'));
  }
}

berramou
источник
-1

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

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

Редактировать / Предупреждение: см. Комментарий Бердира ниже. Этот метод не очищает все данные, связанные с узлами.

Greg
источник
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»

user9869932
источник