¿Puedo eliminar nodos de un tipo de contenido determinado con Drush?


13

Me pregunto si Drush es capaz de eliminar nodos de un tipo de contenido dado.

Algo como: $ drush delete-node --type=MyContentType

Si no es posible, ¿puedo crear un método como ese?

Respuestas:


4

Puede crear una función como la siguiente:

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: También podría usar una SELECTconsulta simple , pero dado que está trabajando con entidades, parece más sensato / una práctica común usar EntityFieldQuery .

Esto también debería ser bastante fácil de cambiar o agregar argumentos. También puede ponerlo en un comando Drush con bastante facilidad: hay un ejemplo de cómo hacerlo en el repositorio Drush (consulte la sección Comandos en la parte inferior).


Ya veo, parece que el enlace del repositorio muestra cómo agregar correctamente un método drush.
chefnelone

¡Sip! ¡El archivo Léame también tiene diferentes formas de implementarlo!
Chapabu

21

Instale el módulo de desarrollo y use drush para eliminar todos los nodos,

$  drush genc --kill 0 0 

También puedes dar una opción de tipo,

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

Inteligente, me gusta.
m4olivei

3
Esto funciona con D8. El devel_generatemódulo se incluye con devel, pero debe habilitarse con drush en devel_generate genc normalmente se usa para crear nodos, por lo que el 0 0 al final le dice que no cree nada nuevo y --kill para eliminar lo que ya está allí.
William Turrell

15

Supongo que puedes usar el siguiente comando

drush node_delete <nid>

EDITAR: encontró un módulo que hace algo / relacionado con la pregunta

http://drupal.org/project/delete_all

Uso

Drush

drush delete-all

Ejemplo: drush delete-all article


Quise eliminar todos los nodos por tipo de contenido.
chefnelone

¿Usted intentó este módulo drupal.org/project/delete_all Uso Drush Drush borrar todo Ejemplo: drush de borrar todo el artículo
ninjascorner

donde puedo encontrar el comando drush node_delete <nid>?
Adrian Cid Almaguer

Para ahorrar tiempo a las personas, a partir de diciembre de 2016, delete_all aún no se ha transferido a Drupal 8 , pero la respuesta genc funciona.
William Turrell

5

Algo como esto funcionaría (no probado):

$query = new EntityFieldQuery();

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

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

node_delete_multiple($nids);

Esto encontrará todos los nodos con el tipo de contenido Annoucementsusando EntityFieldQuery(). Luego obtiene todo el $nidsresultado y los elimina usando node_delete_multiple().

Puede tomar este código, ponerlo en un archivo PHP separado y luego ejecutarlo con drush scr.

El uso de la API garantizará que se activen todos los ganchos adecuados. Entre otras cosas, también eliminarán las revisiones de nodos y los datos de campo (y sus revisiones) para que no tenga datos huérfanos en la base de datos.


5

Hay algunas buenas ideas en este hilo. Si realmente no desea realizar ninguna programación y desea utilizar Drush, puede consultar el módulo Eliminar todo contribuido:

Drush
borrado borrar todo
Ejemplo: artículo drush delete-all

Drush en la versión Drupal 7

Elimine todos los nodos, nodos de un tipo de contenido específico o usuarios.

Ejemplos:
 drush delete-all article Desvía todos los nodos del artículo.
 drush delete-all all Eliminar nodos de todos los tipos.
 drush delete-all --reset Eliminar nodos de todos los tipos y restablecer contadores de nodo, revisión y comentarios.
 drush eliminar-todos los usuarios Eliminar usuarios.

Opciones:
 --restablecer Restablecer contador para nodo, revisión y tablas de comentarios.
 --roles elegir roles

Alias: da


4

VBO tiene integración Drush. Cree una vista VBO de nodos, ejecútelo a través de Drush (usando drush vbo-execute), pase el tipo de nodo como argumento.


Creo que esto es lo que necesito. Solo 2 preguntas: ¿Cuál es el método drush para ejecutar una vista? ¿Será este método más rápido que ejecutar la vista en el navegador?
chefnelone

Editó la respuesta para especificar el comando exacto drush. Y sí, será más rápido porque de esta manera la vista no se representa.
Bojan Zivanovic

1

También puede crear un script drush (digamos que se llama "bulk_delete.php" y se coloca debajo de la carpeta raíz de Drupal):

#!/usr/bin/env drush

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

echo "deleted:" . $res;

Esta es absolutamente la forma más rápida de hacerlo: una consulta directa a la base de datos, utilizando la función db_delete de Drupal

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

Advertencia: este proceso no elimina los datos de sus campos. De todos modos, se puede aplicar el mismo proceso a estos campos (mirando la columna "paquete" de cada campo). Por ejemplo:

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

Donde "mycontenttype" es el utilizado en la primera consulta.


¿Por qué la condición 'nid' > 5000?
Елин Й.

Es un ejemplo, como el tipo.
Mauro Mascia

Pero el póster original no menciona tal condición, por eso creo que el ejemplo es irrelevante, por lo tanto, engañoso.
Елин Й.

1

Drupal 7

Pruebe el siguiente one-liner, elimina todos los nodos MyContentType de Drupal:

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

O puede eliminar todas las entidades en función del nombre del tipo de entidad (por ejemplo, nodo):

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

Nota: nodees el nombre de su tipo de entidad, puede cambiarlo si es necesario.


Si obtiene errores de memoria o de tiempo de espera, puede agregar los siguientes conjuntos justo antes de $res:

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

1

Para eliminar todos los nodos de un tipo de contenido en particular, puede intentar ejecutar el siguiente comando mediante drush:

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

Donde MyContentType es el nombre del Tipo de contenido de su máquina (por ejemplo, Página).


1

Para nodos individuales:

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

drush php-eval
Evaluar código php arbitrario después de bootstrapping Drupal


Agregue algunos detalles más para explicar su código, sin que esto pueda considerarse como una respuesta de baja calidad (y, por lo tanto, podría eliminarse mediante moderación).
Pierre.Vriens

1

Actualizando la respuesta proporcionada por @kenorb.

En Drupal 8

drush eval '$nids = \Drupal::entityQuery('node')->execute(); $storage = Drupal::entityTypeManager()->getStorage('node'); $e = $storage->loadMultiple($nids); $storage->delete($e);'

drush ev '$ type =' \ '' nodo '\' '; entity_delete_multiple ($ type, \ Drupal :: entityQuery ($ type) -> execute ()); '
geek-merlin

Para actualizar una respuesta existente, deje un comentario para sugerir una edición.
leymannx

0

Puedes usar

drush node_delete NID para eliminar un nodo específico, pero si desea eliminar todos los nodos por tipo de contenido, creo que puede crear un plugin drush usando la API por lotes.


No puedo encontrar el comando drush node_delete NID.
Adrian Cid Almaguer

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.