Come eliminare tutti i nodi di un determinato tipo di contenuto?


31

Ho diverse migliaia di nodi di un determinato tipo di contenuto. Utilizzando l'interfaccia web (esempio.com/admin/content), posso cancellarne solo 50 alla volta. Come posso eliminarli rapidamente?

Risposte:


32

C'è un modulo per quello (TM).

Vedi Eliminazione collettiva .

Questo utilizzerà l'API Batch per eliminare i nodi per evitare problemi di timeout o di memoria quando si eliminano migliaia di nodi con una singola chiamata a node_delete_multiple ().

Bulk Delete è un modulo abbandonato. Vedi per le alternative:


Wow, mi mancava completamente questo. Buona scoperta.
Greg

4
Un altro metodo, che potrebbe essere utile se stai facendo qualcosa di più di un semplice filtro del tipo di contenuto, è utilizzare Operations Bulk Operations: drupal.org/project/views_bulk_operations
geerlingguy

Il modulo di eliminazione collettiva è ora abbandonato. Si consiglia di utilizzare le operazioni in blocco di Views.
Refineo,

26

Osservando il modulo Devel Generate come fonte di ispirazione, ecco la sua funzione "uccisione dei contenuti" devel_generate_content_kill:

function devel_generate_content_kill($values) {
  $results = db_select('node', 'n')
              ->fields('n', array('nid'))
              ->condition('type', $values['node_types'], 'IN')
              ->execute();
  foreach ($results as $result) {
    $nids[] = $result->nid;
  }

  if (!empty($nids)) {
    node_delete_multiple($nids);
    drupal_set_message(t('Deleted %count nodes.', array('%count' => count($nids))));
  }
}

Quindi proverei a utilizzare Develop Generate per eliminare tutti i nodi ma non crearne di nuovi, oppure utilizzare example.com/devel/php per chiamare devel_generate_content_kill(array('node_types' => array('my_node_type')));direttamente.


17

In Drupal 8 un modo è utilizzare il metodo entityQuery () con il metodo EntityStorageInterface :: delete () :

$result = \Drupal::entityQuery("node")
    ->condition("type", "YOUR_CONTENT_TYPE_NAME")
    // If the update is being executed via drush entityQuery will only
    // return the content uid 0 have access to. To return all set
    // accessCheck to false since it defaults to TRUE. 
    ->accessCheck(FALSE)
    ->execute();

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadMultiple($result);
$storage_handler->delete($entities);

Se è necessario applicare altri filtri / condizioni, è possibile controllare la pagina dell'interfaccia QueryInterface

MODIFICA ( Altrimenti , grazie a @ 4k4 ):

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadByProperties(["type" => "YOUR_CONTENT_TYPE_NAME"]);
$storage_handler->delete($entities);

Se vuoi testare il codice puoi usare:

drush php-eval '$storage_handler = \Drupal::entityTypeManager()->getStorage("node"); $entities = $storage_handler->loadByProperties(["type" => "article"]); $storage_handler->delete($entities);'

Questo eliminerà tutti i tuoi articoli.


Questo non è corretto, delete () si aspetta entità caricate, non ID, che restituisce la query dell'entità. Invece di un risultato $ non descrittivo, usa $ ids o $ nids e quindi $ storage-> delete ($ storage-> load ($ ids)).
Berdir,

@Berdir grazie, proverò di nuovo il codice, forse questo problema è stato introdotto in una modifica
Adrian Cid Almaguer

@Berdir aggiorno la risposta e collaudo il codice e funziona, il problema è stato introdotto in una modifica.
Adrian Cid Almaguer,

2
@AdrianCidAlmaguer, è possibile sostituire la query con$entities = $storage_handler->loadByProperties(['type' => 'YOUR_CONTENT_TYPE_NAME']);
4k4

1
Recentemente usato questo in un hook di aggiornamento, vale la pena notare che se si utilizza entityQuery è necessario impostare accessCheckl'istruzione on. Altrimenti se lo si esegue in modalità Drush, per impostazione predefinita accessCheck è impostato su true e tutti i nodi a cui uid 0 non ha accesso non verranno restituiti.
awm

13

Se si desidera farlo esclusivamente tramite l'interfaccia utente, è possibile utilizzare il modulo devel_generate.

  1. Passare al menu "Genera contenuto" in "Configurazione" (admin / config / development / generate / content).
  2. Seleziona i tipi di contenuto che desideri eliminare.
  3. Assicurati che la casella di controllo accanto a "Elimina tutto il contenuto in questi tipi di contenuto prima di generare nuovo contenuto" sia selezionata.
  4. Imposta il numero di nodi che desideri generare su "0".

In questo modo, non verranno generati nodi e verranno eliminati tutti i nodi dei tipi selezionati.


10

Crea un file con il codice seguente nella radice dell'installazione di drupal ed esegui il file.

<?php
  require_once './includes/bootstrap.inc';
  drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

  $aquery= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'company'");
  while ($row = db_fetch_object($aquery)) {
    node_delete($row->nid);
  }
?>

1
db_fetch_object non fa parte dell'API database D7.
ya.teck

10

Puoi farlo in Drupal 7 usando la parte Execute PHP Code del modulo Devel inserendo:

$result= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'TYPE'");
foreach ($result as $record) {
  node_delete($record->nid);
}

1
Questo verrà eseguito molto lentamente, se è necessario eliminare migliaia di nodi è meglio utilizzare un metodo che utilizza l'API batch come VBO.
abielefeldt,

6

Fallo nel terminale, se usi Drush e il modulo elimina tutto :

 drush delete-all [content-type-machine-name]


Examples:
 drush delete-all article             Delect all article nodes.
 drush delete-all all                 Delete nodes of all types.
 drush delete-all --reset             Delete nodes of all types, and reset node, revision and comment counters.
 drush delete-all users               Delete users.

Options:
 --reset                              Reset counter for node, revision and comment tables.
 --roles                              pick roles

5

Views Operazioni collettive fornisce una schermata di amministrazione del nodo configurabile abilitata per BatchAPI che consente il filtraggio per tipo, la selezione di tutti i nodi corrispondenti ai criteri di ricerca, ecc.

Questa è la mia soluzione a mani basse in Drupal 6 - oltre all'eliminazione batch, puoi modificare in blocco i nodi e fare un sacco di altre cose.

Sembra che la versione di Drupal 7 non sia ancora pronta, ma guarderei quel modulo per una versione D7.


4

Un altro frammento è:

$query = db_query("SELECT n.nid FROM {node} n WHERE n.type = 'TO_BE_DELETED'"); 
while ($n = db_fetch_object($query)) 
{
     node_delete($n->nid); 
} 

dove si TO_BE_DELETEDtrova il tipo di contenuto da eliminare.


3
Va notato che funziona solo con Drupal 4.6, 5 e 6. La versione di Drupal 7 èdb_delete('node')
Greg


3

Uso Elimina tutto il modulo, funziona perfettamente con D8 e fornisce comandi drush molto utili. Ad esempio, per eliminare tutto il contenuto del articletipo di contenuto:

drush delete-all article  

Funziona con D8? Ho abilitato il modulo ma ottengo Impossibile trovare il comando drush 'elimina-tutto l'articolo'. Ho anche cancellato la cache della droga
Yassin Tahtah l'

1

Puoi provare Elimina tutto il modulo, vai a 'admin / content / delete_content' e ti verrà presentato un modulo per la cancellazione del contenuto appartenente a determinati tipi di contenuto.

Saluti



0

Questo modulo viene utilizzato per eliminare tutto il contenuto e / o gli utenti da un sito. Questo è principalmente uno strumento di sviluppo, che può tornare utile in diversi casi

https://www.drupal.org/project/delete_all

così come il modulo Bulk Delete eliminerà tutti i nodi di un certo tipo di nodo usando l'API batch. Si consiglia di utilizzare il modulo Views Batch Operations (VBO) per un numero limitato di nodi. Ma se devi eliminare 10.000 nodi questo modulo potrebbe essere un'opzione migliore.

https://www.drupal.org/project/bulkdelete


0

Elimina tutti i nodi del tipo di contenuto a livello di codice qui è una funzione di supporto:


function _delete_all_nodes_of_type($type = '') {
  // Return all nids of nodes of type.
  $nids = db_select('node', 'n')
    ->fields('n', array('nid'))
    ->condition('n.type', $type)
    ->execute()
    ->fetchCol(); // returns an indexed array
  if (!empty($nids)) {
    node_delete_multiple($nids);
    drupal_set_message(format_plural(count($nids), count($nids) . ' node Deleted.', count($nids) . ' nodes Deleted.'));
  }
}


-1

Ho finito con db_delete , nessun modulo richiesto:

<?php
  db_delete('node')
    ->condition('type', 'MY_CONTENT_TYPE')
    ->execute();
?>

Modifica / Avviso: vedi il commento di Berdir di seguito. Questo metodo non cancella tutti i dati relativi ai nodi.


3
Il problema con questo approccio è che altri moduli non sono in grado di reagire ed eliminare anche le loro informazioni. A seconda del tipo di contenuto, ci sono informazioni specifiche sul nodo nella tabella content_type di quel nodo, campi, tassonomie (anche un campo, in realtà), commenti e così via. Quindi potresti finire con molte informazioni obsolete nel tuo database.
Berdir,

@Berdir - Interessante. Esiste un modo integrato migliore per eliminare i nodi?
Greg

3
C'è node_delete () e node_delete_multiple (), vedi la risposta di tim.plunket, ma non è progettato per gestire migliaia di nodi, vedi api.drupal.org/api/drupal/modules--node--node.module/function /… . Carica tutti i nodi e quindi scorre su di essi in un'unica richiesta. Quindi è necessario utilizzare un modulo contrib come bulkdelete se si desidera eliminare centinaia o migliaia di nodi.
Berdir,

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.