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ę ?

chefnelone
źródło

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).

Chapabu
źródło
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
ericj
źródło
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

ninjascorner
źródło
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,
6

Drush 9

drush entity:delete node --bundle=my_content_type

Denis Viunyk
źródło
2
Najlepsza odpowiedź w dzisiejszych czasach!
Jonathan
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.

mpdonadio
źródło
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
tenken
źródło
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.

Bojan Zivanovic
źródło
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.

Mauro Mascia
źródło
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);
kenorb
źródło
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).

kenorb
źródło
1

Dla poszczególnych węzłów:

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

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

edmitry
źródło
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);'
Jason Yarrington
źródło
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.

użytkownik8012
źródło
Nie mogę znaleźć komendy drush node_delete NID.
Adrian Cid Almaguer
0

Możesz to również zrobić za pomocą modułu devel, na który odpowiedziano w Czy mogę usunąć węzły danego typu zawartości za pomocą Drush?

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

$ drush genc - zabij 0 0

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

$ drush genc --kill --types = artykuł 0 0

wranvaud
źródło