it-swarm-es.com

¿Cómo eliminar todos los nodos de un tipo de contenido dado?

Tengo varios miles de nodos de un tipo de contenido en particular. Usando la interfaz web (example.com/admin/content), solo puedo eliminar unos 50 a la vez. ¿Cómo puedo eliminarlos rápidamente?

33
Greg

Hay un módulo para eso (TM).

Ver eliminación masiva .

Eso usará la API de Batch para eliminar los nodos para evitar problemas de tiempo de espera o memoria al eliminar miles de nodos con una sola llamada a node_delete_multiple ().

Bulk Delete es un módulo abandonado. Ver alternativas:

33
Berdir

Mirando el módulo Devel Generate en busca de inspiración, aquí está su función "kill de contenido" 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))));
  }
}

Por lo tanto, intentaría usar Devel Generate para eliminar todos los nodos pero no crear ninguno nuevo, o usar example.com/devel/php para llamar a devel_generate_content_kill(array('node_types' => array('my_node_type'))); directamente.

27
tim.plunkett

En Drupal 8 una forma es usar el método entityQuery () con el método 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);

Si necesita aplicar otros filtros/condiciones, puede consultar la página de interfaz QueryInterface

[~ # ~] editar [~ # ~] (De otra manera, gracias a @ 4k4 ):

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

Si quieres probar el código puedes usar:

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

Esto eliminará todos tus artículos.

19

Si desea hacerlo únicamente a través de la interfaz de usuario, puede usar el módulo devel_generate.

  1. Navegue al menú "Generar contenido" en "Configuración" (admin/config/development/generate/content).
  2. Seleccione los tipos de contenido que desea eliminar.
  3. Asegúrese de que la casilla de verificación junto a "Eliminar todo el contenido en estos tipos de contenido antes de generar contenido nuevo" esté marcada.
  4. Establezca el número de nodos que desea generar en "0".

De esta manera, no se generarán nodos y se eliminarán todos los nodos de los tipos seleccionados.

13
areynolds

Puede hacer esto en Drupal 7 usando Execute PHP Parte del código del módulo Devel ingresando:

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

Cree un archivo con el código siguiente en la raíz de la instalación drupal) y ejecute el archivo.

<?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);
  }
?>
10
Satya

Haga esto en la terminal, si usa Drush y el módulo eliminar todo :

 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
8
shrish

Views Bulk Operations proporciona una pantalla de administración de nodos configurable y habilitada para BatchAPI que permite filtrar por tipo, seleccionar todos los nodos que coincidan con sus criterios de búsqueda, etc.

Esa es mi solución práctica en Drupal 6 - además de la eliminación por lotes, puede editar nodos en masa y hacer muchas otras cosas.

Parece que la versión Drupal 7 aún no está lista, pero estaría viendo ese módulo para una versión D7.

5
Darren Petersen

Con el módulo Devel, usando drush:

drush genc 0 --types=article --kill

O en la interfaz de usuario como se explica aquí: http://befused.com/drupal/delete-nodes-devel

4
sunzu

Otro fragmento es:

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

dónde TO_BE_DELETED es el tipo de contenido que se eliminará.

4
Tangurena

Uso el módulo Eliminar todo , funciona bien con D8 y proporciona comandos drush muy útiles. Por ejemplo, para eliminar todo el contenido del tipo de contenido article:

drush delete-all article  
3
gerzenstl

Puede probar Eliminar todo módulo, vaya a 'admin/content/delete_content' y se le presentará un formulario para eliminar el contenido que pertenece a ciertos tipos de contenido.

Saludos

1
Oleg Videnov

Este módulo se utiliza para eliminar todo el contenido y/o usuarios de un sitio. Esta es principalmente una herramienta de desarrollo, que puede ser útil en varios casos

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

así como el módulo Bulk Delete eliminará todos los nodos de un determinado tipo de nodo utilizando la API por lotes. Se recomienda utilizar el módulo de Operaciones por lotes de vistas (VBO) para una pequeña cantidad de nodos. Pero si tiene que eliminar 10.000 nodos, este módulo podría ser una mejor opción.

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

0
onlink

Si tiene habilitado el módulo Migrate, puede usar:

$ drush migrate-wipe <content-type>

Ver Comandos de migración típicos usando Drush .

0
jiv-e

Eliminar todos los nodos del tipo de contenido mediante programación aquí hay una función auxiliar:


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.'));
  }
}
0
berramou