Kann ich mit Drush Knoten eines bestimmten Inhaltstyps löschen?

14

Ich frage mich nur, ob Drush in der Lage ist, Knoten eines bestimmten Inhaltstyps zu löschen.

Etwas wie: $ drush delete-node --type=MyContentType

Wenn nicht möglich, kann ich eine solche Methode erstellen ?

chefnelone
quelle

Antworten:

5

Sie können eine Funktion wie folgt erstellen:

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

Hinweis - Sie können auch eine einfache SELECTAbfrage verwenden. Da Sie jedoch mit Entitäten arbeiten, erscheint es sinnvoller, EntityFieldQuery zu verwenden .

Dies sollte auch recht einfach zu ändern oder Argumente hinzuzufügen sein. Sie können es auch ganz einfach in einen Drush-Befehl einfügen. Ein Beispiel dafür finden Sie im Drush- Repository (siehe Abschnitt Befehle unten).

Chapabu
quelle
Ich sehe, es klingt wie der Repository-Link zeigt, wie man eine Drush-Methode richtig hinzufügt.
Chefnelone
Jep! Die Readme-Datei bietet verschiedene Möglichkeiten, wie Sie sie auch implementieren können!
Chapabu
22

Installieren Sie das Entwicklungsmodul und löschen Sie mit drush alle Knoten.

$  drush genc --kill 0 0 

Sie können auch eine Typoption angeben,

$  drush genc --kill --types=article 0 0
ericj
quelle
Clever, ich mag es.
m4olivei
3
Dies funktioniert mit D8. Das devel_generateModul ist in devel enthalten, muss jedoch in drush en devel_generate genc aktiviert werden. Normalerweise wird es zum Erstellen von Knoten verwendet. Die 0 0 am Ende weist also darauf hin, dass nichts Neues erstellt werden soll, und der Befehl --kill, um das zu entfernen, was bereits vorhanden ist.
William Turrell
16

Ich vermute, Sie können mit dem folgenden Befehl

drush node_delete <nid>

BEARBEITEN: Ein Modul gefunden, das etwas mit der Frage zu tun hat

http://drupal.org/project/delete_all

Verwendung

Drush

drush delete-all

Beispiel: drush delete-all article

ninjascorner
quelle
Ich wollte alle Knoten nach Inhaltstyp löschen.
Chefnelone
Haben Sie dieses Modul versuchen drupal.org/project/delete_all Usage Drush drush löschen-all Beispiel: drush löschen-alle Artikel
ninjascorner
Wo finde ich den Befehl drush node_delete <nid>?
Adrian Cid Almaguer
Um Zeit zu sparen, delete_all ist die Genc-Antwort ab Dezember 2016 noch nicht auf Drupal 8 portiert .
William Turrell
6

So etwas würde funktionieren (ungetestet):

$query = new EntityFieldQuery();

$entities = $query->entityCondition('entity_type', 'node', '=')
  ->entityCondition('bundle', 'Announcements')
  ->execute();

$nids = array_keys($entities['node']);

node_delete_multiple($nids);

Dies findet alle Knoten mit dem Inhaltstyp Annoucementsusing EntityFieldQuery(). Es holt dann alles $nidsaus dem Ergebnis und löscht es mit node_delete_multiple().

Sie können diesen Code nehmen, in eine separate PHP-Datei schreiben und dann mit ausführen drush scr.

Durch die Verwendung der API wird sichergestellt, dass alle richtigen Hooks ausgelöst werden. Unter anderem löschen sie auch die Knotenrevisionen und Felddaten (und ihre Revisionen), damit Sie keine verwaisten Daten in der Datenbank haben.

mpdonadio
quelle
6

Zu diesem Thread gibt es einige gute Ideen. Wenn Sie nicht wirklich programmieren möchten und Drush verwenden möchten, sehen Sie sich das Modul Alle Beiträge löschen an:

Drush
alle löschen
Beispiel: Alle löschen Artikel drush

Drush auf Drupal 7-Version

Löschen Sie alle Knoten, Knoten eines bestimmten Inhaltstyps oder Benutzer.

Beispiele:
 drush delete-all article Löscht alle Artikelknoten.
 drush delete-all all Löscht Knoten aller Art.
 drush delete-all --reset Löscht alle Knotentypen und setzt die Zähler für Knoten, Überarbeitungen und Kommentare zurück.
 drush delete-all users Benutzer löschen.

Optionen:
 --reset Zähler für Knoten-, Revisions- und Kommentartabellen zurücksetzen.
 --Rollen wählen Rollen

Aliase: da
tenken
quelle
5

VBO hat Drush-Integration. Erstellen Sie eine VBO-Ansicht von Knoten, führen Sie sie über Drush aus (mit drush vbo-execute) und übergeben Sie den Knotentyp als Argument.

Bojan Zivanovic
quelle
Ich denke, das ist, was ich brauche. Nur 2 Fragen: Was ist die Drush-Methode, um eine Ansicht auszuführen? und Ist diese Methode schneller als die Ausführung der Ansicht im Browser?
Chefnelone
Die Antwort wurde bearbeitet, um den genauen Drush-Befehl anzugeben. Und ja, es wird schneller, weil auf diese Weise die Ansicht nicht gerendert wird.
Bojan Zivanovic
4

Drush 9

drush entity:delete node --bundle=my_content_type

Denis Viunyk
quelle
2
Beste Antwort heutzutage!
Jonathan
2

Sie können auch ein Drush-Skript erstellen (sagen wir, es heißt "bulk_delete.php" und befindet sich im Drupal-Stammverzeichnis):

#!/usr/bin/env drush

$res = db_delete('node')
  ->condition('type', 'mycontenttype', '=')
  ->execute();

echo "deleted:" . $res;

Dies ist der absolut schnellste Weg, dies zu tun: eine direkte Abfrage an die Datenbank unter Verwendung der Drupal-Funktion db_delete

Verwendung:

:~# cd /var/www/www.mysite.com
:~# drush --uri=www.mysite.com scr bulk_delete.php 

Doc: https://api.drupal.org/api/drupal/includes!database!database.inc/function/db_delete/7

Warnung: Durch diesen Vorgang werden die Daten ihrer Felder nicht gelöscht. Der gleiche Vorgang kann auf diese Felder angewendet werden (siehe Spalte "Bündel" jedes Felds). Beispielsweise:

#!/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";
}

Wobei "mycontenttype" derjenige ist, der in der ersten Abfrage verwendet wird.

Mauro Mascia
quelle
Warum die Bedingung 'nid' > 5000?
Елин Й.
Es ist ein Beispiel, wie der Typ.
Mauro Mascia
Aber das Originalplakat erwähnt einen solchen Zustand nicht, deshalb halte ich das Beispiel für irrelevant und irreführend.
Елин Й.
2

Drupal 7

Versuchen Sie es mit dem folgenden Einzeiler, der alle MyContentType-Knoten aus Drupal entfernt:

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

Oder Sie können alle Entitäten basierend auf dem Entitätstypnamen (z. B. Knoten) entfernen:

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

Hinweis: nodeIst der Name Ihres Entitätstyps, können Sie ihn bei Bedarf ändern.


Wenn Sie Speicher- oder Zeitüberschreitungsfehler erhalten, können Sie die folgenden Sätze direkt vor dem hinzufügen $res:

ini_set('memory_limit', -1); ini_set('max_execution_time', 0);
Kenorb
quelle
2

Um alle Knoten eines bestimmten Inhaltstyps zu löschen, können Sie versuchen, den folgenden Befehl über drush auszuführen:

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

Wobei MyContentType der Name Ihres Computer-Inhaltstyps ist (z. B. Seite).

Kenorb
quelle
2

Für einzelne Knoten:

$ drush php-eval 'node_delete($node->nid);'

drush php-eval
Bewerten Sie beliebigen PHP-Code nach dem Bootstrapping von Drupal

Edmitry
quelle
Bitte fügen Sie weitere Details hinzu, um Ihren Code zu erläutern, ohne dass dies als Antwort von geringer Qualität angesehen werden kann (und daher möglicherweise durch Moderation gelöscht wird).
Pierre.Vriens
1

Sie können verwenden

drush node_delete NID um einen bestimmten Knoten zu löschen, aber wenn Sie alle Knoten nach Inhaltstyp löschen möchten, können Sie ein Drush-Plugin mit der Batch-API erstellen.

user8012
quelle
Ich kann den Befehl drush node_delete NID nicht finden.
Adrian Cid Almaguer
1

Aktualisierung der Antwort von @kenorb.

In Drupal 8

drush eval '$nids = \Drupal::entityQuery('node')->execute(); $storage = Drupal::entityTypeManager()->getStorage('node'); $e = $storage->loadMultiple($nids); $storage->delete($e);'
Jason Yarrington
quelle
drush ev '$ type =' \ '' node '\' '; entity_delete_multiple ($ type, \ Drupal :: entityQuery ($ type) -> execute ()); '
Geek-Merlin
Wenn Sie eine vorhandene Antwort aktualisieren möchten, fügen Sie einen Kommentar hinzu, um eine Änderung vorzuschlagen.
Leymannx