Posso eliminare i nodi di un determinato tipo di contenuto con Drush?


13

Mi chiedo solo se Drush è in grado di eliminare nodi di un determinato tipo di contenuto.

Qualcosa di simile a: $ drush delete-node --type=MyContentType

Se non è possibile, posso creare un metodo del genere?

Risposte:


4

È possibile creare una funzione come la seguente:

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

Nota: è anche possibile utilizzare una SELECTquery semplice , ma visto che si lavora con entità sembra più ragionevole / pratica comune usare EntityFieldQuery .

Questo dovrebbe anche essere abbastanza facile da modificare o aggiungere argomenti. Puoi anche inserirlo in un comando Drush abbastanza facilmente: c'è un esempio di come farlo nel repository Drush (controlla la sezione Comandi nella parte inferiore).


Vedo che sembra che il link al repository mostri come aggiungere correttamente un metodo drush.
Chefnelone,

Sì! Il readme ha diversi modi in cui puoi implementarli!
Chapabu,

21

Installa il modulo di sviluppo e usa drush per eliminare tutti i nodi,

$  drush genc --kill 0 0 

Puoi anche dare un'opzione di tipo,

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

Intelligente, mi piace.
m4olivei,

3
Funziona con D8. Il devel_generatemodulo è incluso con devel, ma deve essere abilitato con drush en devel_generate genc è normalmente usato per creare nodi, quindi lo 0 0 alla fine gli dice di non creare nulla di nuovo, e il --kill per rimuovere ciò che è già lì.
William Turrell,

15

Immagino che sia possibile utilizzando il comando seguente

drush node_delete <nid>

EDIT: trovato un modulo che fa qualcosa / relativo alla domanda

http://drupal.org/project/delete_all

uso

Drush

drush delete-all

Esempio: drush delete-all article


Volevo eliminare tutti i nodi per tipo di contenuto.
Chefnelone,

Hai provato questo modulo drupal.org/project/delete_all Uso Drush drush delete-all Esempio: drush delete-all articolo
ninjascorner

dove posso trovare il comando drush node_delete <nid>?
Adrian Cid Almaguer,

Per risparmiare tempo, a partire da dicembre 2016, delete_all non è stato ancora eseguito il porting su Drupal 8 , ma la risposta genc funziona.
William Turrell,

5

Qualcosa del genere funzionerebbe (non testato):

$query = new EntityFieldQuery();

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

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

node_delete_multiple($nids);

Questo troverà tutti i nodi con il tipo di contenuto Annoucementsusando EntityFieldQuery(). Quindi ottiene tutto il $nidsrisultato e li elimina utilizzando node_delete_multiple().

Puoi prendere questo codice, inserirlo in un file PHP separato e quindi eseguirlo con drush scr.

L'uso dell'API assicurerà che tutti gli hook appropriati vengano attivati. Tra le altre cose, elimineranno anche le revisioni dei nodi e i dati dei campi (e le loro revisioni) in modo da non avere dati orfani nel database.


5

Ci sono alcune buone idee su questo thread. Se non vuoi davvero fare alcuna programmazione e vuoi usare Drush puoi guardare il modulo contribuito a Elimina tutto :

Drush
drush delete-all
Esempio: trascina elimina tutto

Drush on Drupal 7 version

Elimina tutti i nodi, i nodi di un tipo di contenuto specifico o gli utenti.

Esempi:
 drush delete-all article Elimina tutti i nodi dell'articolo.
 drush delete-all All Elimina i nodi di tutti i tipi.
 drush delete-all --reset Elimina i nodi di tutti i tipi e ripristina i contatori di nodi, revisioni e commenti.
 Drush Elimina tutti gli utenti Elimina utenti.

Opzioni:
 --reset Reimposta contatore per tabelle nodi, revisioni e commenti.
 - i ruoli scelgono i ruoli

Alias: da


4

VBO ha l'integrazione Drush. Crea una vista VBO di nodi, eseguila tramite Drush (usando drush vbo-execute), passa il tipo di nodo come argomento.


Penso che sia questo ciò di cui ho bisogno. Solo 2 domande: qual è il metodo drush per eseguire una vista? e questo metodo sarà più veloce dell'esecuzione della vista nel browser?
Chefnelone,

Modificata la risposta per specificare l'esatto comando di trascinamento. E sì, sarà più veloce perché in questo modo la vista non viene renderizzata.
Bojan Zivanovic,

1

Puoi anche creare uno script drush (diciamo che si chiama "bulk_delete.php" e si trova nella cartella principale di Drupal):

#!/usr/bin/env drush

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

echo "deleted:" . $res;

Questo è assolutamente il modo più veloce per farlo: una query diretta al db, usando la funzione di Drupal db_delete

Uso:

:~# 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

Attenzione: questo processo non cancella i dati dei loro campi. Ad ogni modo lo stesso processo può essere applicato a questi campi (guardando la colonna "bundle" di ciascun campo). Per esempio:

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

Dove "mycontenttype" è quello utilizzato nella prima query.


Perché la condizione 'nid' > 5000?
Елин Й.

è un esempio, come il tipo.
Mauro Mascia,

Ma il poster originale non menziona tale condizione, ecco perché penso che l'esempio sia irrilevante, quindi fuorviante.
Елин Й.

1

Drupal 7

Prova il seguente one-liner, rimuove tutti i nodi MyContentType da Drupal:

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

Oppure puoi rimuovere tutte le entità in base al nome del tipo di entità (ad esempio nodo):

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

Nota: nodeè il nome del tuo tipo di entità, puoi cambiarlo se necessario.


Se si verificano errori di memoria o di timeout, è possibile aggiungere i seguenti set appena prima di $res:

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

1

Per eliminare tutti i nodi di un determinato tipo di contenuto, è possibile provare a eseguire il comando seguente tramite drush:

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

Dove MyContentType è il nome del tipo di contenuto della macchina (ad es. Pagina).


1

Per singoli nodi:

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

drush php-eval
Valuta il codice php arbitrario dopo l'avvio di Drupal


Aggiungi qualche dettaglio in più per spiegare il tuo codice, senza che ciò possa essere considerato come una risposta di bassa qualità (e quindi potrebbe essere eliminato con moderazione).
Pierre.Vriens,

1

Aggiornamento della risposta fornita da @kenorb.

In 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,

Per aggiornare una risposta esistente, rilascia un commento per suggerire una modifica.
leymannx,

0

Puoi usare

drush node_delete NID per eliminare un nodo specifico, ma se si desidera eliminare tutti i nodi per tipo di contenuto, suppongo che sia possibile creare un plug-in di trascinamento usando l'API batch.


Non riesco a trovare il comando NID drush node_delete.
Adrian Cid Almaguer,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.