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ę ?
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:
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 SELECT
zapytania, 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).
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
devel_generate
Moduł 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.
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
delete_all
Nie jest jeszcze przeniesiony na Drupal 8 , ale odpowiedź genc działa.
drush entity:delete node --bundle=my_content_type
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 Annoucements
używa EntityFieldQuery()
. Następnie pobiera wszystkie $nids
wyniki 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.
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
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.
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.
'nid' > 5000
?
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: node
to 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);
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).
Dla poszczególnych węzłów:
$ drush php-eval 'node_delete($node->nid);'
drush php-eval
Oceń dowolny kod php po uruchomieniu Drupala
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);'
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.
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