Wie lösche ich alle Knoten eines bestimmten Inhaltstyps?


31

Ich habe mehrere tausend Knoten eines bestimmten Inhaltstyps. Über das Webinterface (example.com/admin/content) kann ich jeweils nur ca. 50 löschen. Wie kann ich sie schnell löschen?

Antworten:


32

Dafür gibt es ein Modul (TM).

Siehe Massenlöschung .

Mit der Batch-API werden die Knoten gelöscht, um Zeitüberschreitungen oder Speicherprobleme beim Löschen Tausender Knoten mit einem einzigen Aufruf von node_delete_multiple () zu vermeiden.

Bulk Delete ist ein verlassenes Modul. Siehe für Alternativen:


Wow, das habe ich komplett verpasst. Guter Fund.
Greg

4
Eine andere Methode, die nützlich sein kann, wenn Sie mehr als nur einen einfachen Inhaltstypfilter ausführen
geerlingguy

Das Massenlöschmodul wird jetzt verlassen. Dort wird die Verwendung von Views-Massenoperationen empfohlen.
Refineo

26

Wenn Sie sich das Modul "Devel Generate" als Inspiration ansehen, finden Sie hier die Funktion "content kill" 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))));
  }
}

Also würde ich versuchen, entweder mit Devel Generate alle Knoten zu löschen, aber keine neuen zu erstellen, oder mit example.com/devel/php devel_generate_content_kill(array('node_types' => array('my_node_type')));direkt aufzurufen .


17

In Drupal 8 können Sie die entityQuery () -Methode mit der EntityStorageInterface :: delete () -Methode verwenden:

$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);

Wenn Sie andere Filter / Bedingungen anwenden müssen, können Sie die Seite QueryInterface- Schnittstelle überprüfen

BEARBEITEN ( andersrum dank @ 4k4 ):

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

Wenn Sie den Code testen möchten, können Sie Folgendes verwenden:

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

Dadurch werden alle Ihre Artikel gelöscht.


Dies ist nicht korrekt. Delete () erwartet geladene Entitäten und keine IDs. Dies ist der Wert, den die Entitätsabfrage zurückgibt. Verwenden Sie anstelle eines nicht beschreibenden $ result $ ids oder $ nids und dann $ storage-> delete ($ storage-> load ($ ids)).
Berdir

@Berdir danke, ich werde den Code noch einmal testen, vielleicht wurde dieses Problem in einer Bearbeitung eingeführt
Adrian Cid Almaguer

@Berdir Ich aktualisiere die Antwort und ich teste den Code und es funktioniert, das Problem wurde in einer Bearbeitung eingeführt.
Adrian Cid Almaguer

2
@AdrianCidAlmaguer, Sie können die Abfrage durch$entities = $storage_handler->loadByProperties(['type' => 'YOUR_CONTENT_TYPE_NAME']);
4k4

1
Kürzlich in einem Update-Hook verwendet, ist es erwähnenswert, dass, wenn Sie verwenden, entityQuery Sie das accessCheckin der Anweisung festlegen sollten . Andernfalls wird accessCheck standardmäßig auf true gesetzt, wenn Sie es in drush ausführen, und alle Knoten, auf die uid 0 keinen Zugriff hat, werden nicht zurückgegeben.
awm

13

Wenn Sie dies nur über die Benutzeroberfläche tun möchten, können Sie das Modul devel_generate verwenden.

  1. Navigieren Sie in "Konfiguration" zum Menü "Inhalt generieren" (admin / config / development / generate / content).
  2. Wählen Sie die Inhaltstypen aus, die Sie löschen möchten.
  3. Stellen Sie sicher, dass das Kontrollkästchen neben "Alle Inhalte in diesen Inhaltstypen vor dem Generieren neuer Inhalte löschen" aktiviert ist.
  4. Setzen Sie die Anzahl der Knoten, die Sie generieren möchten, auf "0".

Auf diese Weise werden keine Knoten generiert und alle Knoten der ausgewählten Typen werden gelöscht.


10

Erstellen Sie eine Datei mit dem folgenden Code im Stammverzeichnis der Drupal-Installation und führen Sie die Datei aus.

<?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 ist nicht Teil der D7-Datenbank-API.
ya.teck

10

Sie können dies in Drupal 7 mithilfe des Teils "PHP-Code ausführen" des Devel-Moduls tun, indem Sie Folgendes eingeben:

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

1
Dies wird sehr langsam ausgeführt. Wenn Sie Tausende von Knoten löschen müssen, ist es besser, eine Methode zu verwenden, die die Batch-API wie VBO verwendet.
Abielefeldt

6

Tun Sie dies im Terminal, wenn Sie Drush verwenden und das Modul " Alle löschen" verwenden :

 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

Ansichten Massenoperationen bieten einen BatchAPI-fähigen, konfigurierbaren Knotenadministrationsbildschirm, in dem Sie nach Typ filtern, alle Knoten auswählen können, die Ihren Suchkriterien entsprechen usw.

Das ist meine zweifelsfreie Lösung in Drupal 6 - neben dem Batch-Löschen können Sie Knoten in großen Mengen bearbeiten und eine Reihe anderer Aufgaben erledigen.

Es sieht so aus, als ob die Drupal 7-Version noch nicht fertig ist - aber ich würde mir dieses Modul für eine D7-Version ansehen.


4

Ein weiterer Ausschnitt ist:

$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); 
} 

Wo TO_BE_DELETEDist der zu löschende Inhaltstyp?


3
Es sollte beachtet werden, dass dies nur für Drupal 4.6, 5 und 6 funktioniert. Die Drupal 7-Version istdb_delete('node')
Greg

4

Mit dem Devel-Modul mit drush:

drush genc 0 --types=article --kill

Oder in der Benutzeroberfläche wie hier erklärt: http://befused.com/drupal/delete-nodes-devel


Es ist das Entwicklermodul devel_generate, das aktiviert werden muss. Und für mehrere Typen ist esdrush genc 0 --kill --types="article, page"
Leymannx

3

Ich benutze das Delete all Modul, es funktioniert gut mit D8 und bietet sehr nützliche drush Befehle. So löschen Sie beispielsweise den gesamten Inhalt des articleInhaltstyps:

drush delete-all article  

Funktioniert das mit D8? Ich habe das Modul aktiviert, erhalte aber den Befehl 'delete-all article'. Ich habe auch den Drush-Cache geleert
Yassin Tahtah

1

Sie können versuchen, das gesamte Modul zu löschen. Navigieren Sie zu "admin / content / delete_content", und Sie erhalten ein Formular zum Löschen von Inhalten, die zu bestimmten Inhaltstypen gehören.

Grüße



0

Dieses Modul wird verwendet, um alle Inhalte und / oder Benutzer von einer Site zu löschen. Dies ist hauptsächlich ein Entwicklertool, das in mehreren Fällen nützlich sein kann

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

Ebenso löscht das Bulk Delete-Modul alle Knoten eines bestimmten Knotentyps mithilfe der Batch-API. Es wird empfohlen, das Modul "Views Batch Operations" (VBO) für eine kleine Anzahl von Knoten zu verwenden. Wenn Sie jedoch 10.000 Knoten löschen müssen, ist dieses Modul möglicherweise die bessere Option.

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


0

Löschen Sie alle Knoten des Inhaltstyps programmgesteuert. Dies ist eine Hilfsfunktion:


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

Am Ende habe ich db_delete verwendet , es sind keine Module erforderlich:

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

Bearbeiten / Warnung: Siehe Berdir's Kommentar unten. Diese Methode bereinigt nicht alle Daten, die sich auf die Knoten beziehen.


3
Das Problem bei diesem Ansatz ist, dass andere Module nicht in der Lage sind, zu reagieren und ihre Informationen zu löschen. Abhängig vom Inhaltstyp enthält die Tabelle content_type dieses Knotens knotenspezifische Informationen, Felder, Taxonomien (eigentlich auch ein Feld), Kommentare usw. So haben Sie möglicherweise eine Menge veralteter Informationen in Ihrer Datenbank.
Berdir

@Berdir - Interessant. Gibt es eine bessere integrierte Möglichkeit zum Löschen von Knoten?
Greg

3
Es gibt node_delete () und node_delete_multiple (), siehe die Antwort von tim.plunket, aber das ist nicht für Tausende von Knoten ausgelegt, siehe api.drupal.org/api/drupal/modules--node--node.module/function /… . Es lädt alle Knoten und durchläuft sie dann in einer einzigen Anforderung. Sie müssen also ein Contrib-Modul wie bulkdelete verwenden, um Hunderte oder Tausende von Knoten zu löschen.
Berdir

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.