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?
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:
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 SELECT
consulta 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).
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
devel_generate
mó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í.
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
delete_all
aún no se ha transferido a Drupal 8 , pero la respuesta genc funciona.
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 Annoucements
usando EntityFieldQuery()
. Luego obtiene todo el $nids
resultado 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.
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
drush entity:delete node --bundle=my_content_type
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.
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.
'nid' > 5000
?
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: node
es 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);
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).
Para nodos individuales:
$ drush php-eval 'node_delete($node->nid);'
drush php-eval
Evaluar código php arbitrario después de bootstrapping Drupal
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);'
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.
También puede hacer esto con el módulo de desarrollo como se respondió en ¿Puedo eliminar nodos de un tipo de contenido determinado con Drush?
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 = artículo 0 0