Czy mogę usunąć węzły danego typu zawartości za pomocą Drush?


13

Zastanawiam się tylko, czy Drush jest w stanie usunąć węzły danego typu treści.

Coś jak: $ drush delete-node --type=MyContentType

Jeśli nie jest to możliwe, czy mogę stworzyć taką metodę ?

Odpowiedzi:


4

Możesz utworzyć następującą funkcję:

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

Uwaga - można również użyć prostego SELECTzapytania, ale biorąc pod uwagę, że pracując z jednostkami, wydaje się bardziej rozsądne / powszechna praktyka używać EntityFieldQuery .

Powinno to być również dość łatwe do zmiany lub dodania argumentów. Możesz również dość łatwo umieścić go w komendzie Drush - w repozytorium Drush znajduje się przykład, jak to zrobić (sprawdź sekcję Polecenia u dołu).


Rozumiem, wygląda na to, że link do repozytorium pokazuje, jak poprawnie dodać metodę drush.
chefnelone

Tak! Plik Readme ma również kilka różnych sposobów na ich wdrożenie!
Chapabu

21

Zainstaluj moduł devel i użyj drush, aby usunąć wszystkie węzły,

$  drush genc --kill 0 0 

Możesz także podać opcję typu,

$  drush genc --kill --types=article 0 0

Sprytne, podoba mi się.
m4olivei

3
Działa to z D8. devel_generateModuł jest dołączony devel, ale musi być włączony z drush en devel_generate Genc jest zwykle używany do tworzenia węzłów, więc 0 0 na końcu mówi jej, aby nie tworzyć coś nowego, a --kill usunąć, co już istnieje.
William Turrell,

15

Chyba możesz to zrobić za pomocą poniższego polecenia

drush node_delete <nid>

EDYCJA: Znaleziono moduł, który robi coś / związany z pytaniem

http://drupal.org/project/delete_all

Stosowanie

Drush

drush delete-all

Przykład: drush delete-all article


Chciałem usunąć wszystkie węzły według typu zawartości.
chefnelone

Wypróbowałeś ten moduł drupal.org/project/delete_all Sposób użycia Drush drush delete-all Przykład: drush delete-all article
ninjascorner

gdzie mogę znaleźć komendę drush node_delete <nid>?
Adrian Cid Almaguer

Aby zaoszczędzić czas ludzi, od grudnia 2016 r. delete_all Nie jest jeszcze przeniesiony na Drupal 8 , ale odpowiedź genc działa.
William Turrell,


5

Coś takiego działałoby (nieprzetestowane):

$query = new EntityFieldQuery();

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

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

node_delete_multiple($nids);

Znajduje to wszystkie węzły, których typ zawartości Annoucementsużywa EntityFieldQuery(). Następnie pobiera wszystkie $nidswyniki i usuwa je za pomocą node_delete_multiple().

Możesz wziąć ten kod, umieścić go w osobnym pliku PHP, a następnie wykonać za pomocą drush scr.

Korzystanie z interfejsu API zapewni, że wszystkie właściwe haki zostaną uruchomione. Będą również usuwać wersje węzłów i dane pól (i ich wersje), aby nie mieć osieroconych danych w bazie danych.


5

W tym wątku jest kilka dobrych pomysłów. Jeśli nie chcesz naprawdę programować i chcesz użyć Drusha, możesz zajrzeć do modułu Usuń wszystko :

Drush
drush delete-all
Przykład: drush delete-all article

Drush w wersji Drupal 7

Usuń wszystkie węzły, węzły określonego typu treści lub użytkowników.

Przykłady:
 drush usuń-wszystkie artykuły Usuń wszystkie węzły artykułów.
 drush delete-all Usuń wszystkie węzły wszystkich typów.
 drush delete-all --reset Usuń węzły wszystkich typów i zresetuj liczniki węzłów, rewizji i komentarzy.
 drush usuń-wszyscy użytkownicy Usuń użytkowników.

Opcje:
 --reset Zresetuj licznik tabel węzłów, wersji i komentarzy.
 --roles wybiera role

Aliasy: da

4

VBO ma integrację z Drush. Utwórz widok VBO węzłów, uruchom go za pomocą Drusha (używając drush vbo-execute), podaj typ węzła jako argument.


Myślę, że tego właśnie potrzebuję. 2 pytania: Jaka jest metoda drush do wykonania widoku? i Czy ta metoda będzie szybsza niż wykonywanie widoku w przeglądarce?
chefnelone

Edytowałem odpowiedź, aby określić dokładne polecenie drush. I tak, będzie szybciej, ponieważ w ten sposób widok nie jest renderowany.
Bojan Zivanovic

1

Możesz także utworzyć skrypt drusha (powiedzmy, że nazywa się „bulk_delete.php” i znajduje się w folderze głównym Drupal):

#!/usr/bin/env drush

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

echo "deleted:" . $res;

Jest to absolutnie najszybszy sposób na zrobienie tego: bezpośrednie zapytanie do bazy danych za pomocą funkcji Drupala db_delete

Stosowanie:

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

Dokument: https://api.drupal.org/api/drupal/include!database!database.inc/function/db_delete/7

Ostrzeżenie: ten proces nie usuwa danych z ich pól. W każdym razie ten sam proces można zastosować do tych pól (patrząc na kolumnę „pakiet” każdego pola). Na przykład:

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

Gdzie „typ mikrokontraktowy” to ten użyty w pierwszym zapytaniu.


Dlaczego warunek 'nid' > 5000?
Елин Й.

to przykład, taki jak typ.
Mauro Mascia

Ale oryginalny plakat nie wspomina o takim stanie, dlatego uważam, że przykład jest nieistotny, a zatem mylący.
Елин Й.

1

Drupal 7

Wypróbuj następujący jednowierszowy program, usuwa wszystkie węzły MyContentType z Drupal:

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

Lub możesz usunąć wszystkie jednostki na podstawie nazwy typu jednostki (np. Węzeł):

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

Uwaga: nodeto nazwa typu twojej jednostki, możesz ją zmienić w razie potrzeby.


Jeśli wystąpią błędy pamięci lub przekroczenia limitu czasu, możesz dodać następujące zestawy tuż przed $res:

ini_set('memory_limit', -1); ini_set('max_execution_time', 0);

1

Aby usunąć wszystkie węzły określonego typu treści, możesz spróbować uruchomić następujące polecenie za pomocą drush:

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

Gdzie MyContentType to nazwa typu zawartości Twojego komputera (np. Strona).


1

Dla poszczególnych węzłów:

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

drush php-eval
Oceń dowolny kod php po uruchomieniu Drupala


Dodaj więcej szczegółów, aby wyjaśnić swój kod, bez tego może to być uważane za odpowiedź niskiej jakości (a zatem może zostać usunięte przez moderację).
Pierre.Vriens

1

Aktualizacja odpowiedzi udzielonej przez @kenorb.

W Drupal 8

drush eval '$nids = \Drupal::entityQuery('node')->execute(); $storage = Drupal::entityTypeManager()->getStorage('node'); $e = $storage->loadMultiple($nids); $storage->delete($e);'

drush ev '$ type =' \ '' node '\' '; entity_delete_multiple ($ type, \ Drupal :: entityQuery ($ type) -> execute ()); '
geek-merlin

Aby zaktualizować istniejącą odpowiedź, upuść komentarz, aby zasugerować edycję.
leymannx,

0

Możesz użyć

drush node_delete NID aby usunąć konkretny węzeł, ale jeśli chcesz usunąć wszystkie węzły według typu zawartości, myślę, że możesz utworzyć wtyczkę drush za pomocą interfejsu wsadowego.


Nie mogę znaleźć komendy drush node_delete NID.
Adrian Cid Almaguer

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.