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


31

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?

Respuestas:


32

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:


Wow, me perdí por completo este. Buen descubrimiento.
Greg

44
Otro método, que podría ser útil si está haciendo algo más que un simple filtro de tipo de contenido, es utilizar Views Bulk Operations: drupal.org/project/views_bulk_operations
geerlingguy

El módulo de eliminación masiva está abandonado ahora. Se sugiere utilizar las operaciones en masa de vistas.
Refineo

26

Mirando el módulo Devel Generate en busca de inspiración, aquí está su función "matar 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 devel_generate_content_kill(array('node_types' => array('my_node_type')));directamente.


17

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 desea probar el código, puede 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.


Esto no es correcto, delete () espera entidades cargadas, no identificaciones, que es lo que devuelve la consulta de entidad. En lugar de un resultado $ no descriptivo, use $ ids o $ nids y luego $ storage-> delete ($ storage-> load ($ ids)).
Berdir

@ Berdir gracias, volveré a probar el código, tal vez este problema se introdujo en una edición
Adrian Cid Almaguer

@ Berdir Actualizo la respuesta y pruebo el código y funciona, el problema se introdujo en una edición.
Adrian Cid Almaguer

2
@AdrianCidAlmaguer, puede reemplazar la consulta con$entities = $storage_handler->loadByProperties(['type' => 'YOUR_CONTENT_TYPE_NAME']);
4k4

1
Recientemente usé esto en un enlace de actualización, vale la pena señalar que si lo usa entityQuery , debe configurarlo accessChecken la declaración. De lo contrario, si lo ejecuta en drush, de forma predeterminada, accessCheck se establece en verdadero y no se devolverá ningún nodo al que uid 0 no tenga acceso.
awm

13

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.


10

Cree un archivo con el código siguiente en la raíz de la instalación de 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);
  }
?>

1
db_fetch_object no es parte de la api de la base de datos D7.
ya.teck

10

Puede hacer esto en Drupal 7 usando la parte Ejecutar código PHP 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);
}

1
Esto se ejecutará muy lentamente, si necesita eliminar miles de nodos, es mejor usar un método que use la API por lotes, como VBO.
abielefeldt

6

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

 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 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 en masa los nodos 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.


4

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

donde TO_BE_DELETEDes el tipo de contenido que se eliminará.


3
Cabe señalar que solo funciona para Drupal 4.6, 5 y 6. La versión de Drupal 7 esdb_delete('node')
Greg


3

Uso Delete all module, funciona bien con D8 y proporciona comandos drush muy útiles. Por ejemplo, para eliminar todo el articlecontenido del tipo de contenido:

drush delete-all article  

¿Funciona esto con D8? He activado el módulo pero aparece el comando drush 'borrar todo el artículo' no se pudo encontrar. También borré el caché drush
Yassin Tahtah

1

Puede intentar Eliminar todo el 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



0

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

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


-1

Terminé usando db_delete , no se requieren módulos:

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

Editar / Advertencia: Vea el comentario de Berdir a continuación. Este método no limpia todos los datos relacionados con los nodos.


3
El problema con este enfoque es que otros módulos tampoco pueden reaccionar y eliminar su información. Dependiendo del tipo de contenido, hay información específica del nodo en la tabla content_type de ese nodo, campos, taxonomías (un campo también, en realidad), comentarios, etc. Así que posiblemente termines con mucha información obsoleta en tu base de datos.
Berdir

@Berdir - Interesante. ¿Hay una mejor forma integrada de eliminar nodos?
Greg

3
Hay node_delete () y node_delete_multiple (), vea la respuesta de tim.plunket, pero eso no está diseñado para manejar miles de nodos, vea api.drupal.org/api/drupal/modules--node--node.module/function / ... . Carga todos los nodos y luego los itera en una sola solicitud. Por lo tanto, tiene que usar un módulo contrib como bulkdelete si desea eliminar cientos o miles de nodos.
Berdir

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.