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?
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:
È 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 SELECT
query 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).
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
devel_generate
modulo è 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ì.
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
delete_all
non è stato ancora eseguito il porting su Drupal 8 , ma la risposta genc funziona.
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 Annoucements
usando EntityFieldQuery()
. Quindi ottiene tutto il $nids
risultato 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.
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
drush entity:delete node --bundle=my_content_type
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.
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.
'nid' > 5000
?
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);
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).
Per singoli nodi:
$ drush php-eval 'node_delete($node->nid);'
drush php-eval
Valuta il codice php arbitrario dopo l'avvio di Drupal
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);'
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.
Puoi anche farlo con il modulo di sviluppo come indicato in Posso eliminare i nodi di un determinato tipo di contenuto con Drush?
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 = articolo 0 0