Pasar al contenido principal
Borrado masivo de un tipo de contenido en Drupal 8

Borrado masivo de un tipo de contenido en Drupal 8

Borrado masivo de un tipo de contenido en Drupal 8

2 minutos

En mi trabajo diario, una de las funciones más recurrentes que tengo es la de importación de datos a través de CSV, YML, JSON, APIs externas...

Existen ocasiones en las que necesito eliminar todo el contenido importado porque la importación no ha ido como yo esperaba. En estos casos suelo recurrir al módulo Devel PHP y ejecutar una serie de funciones que siempre tengo a mano.

Eliminar nodos de un tipo determinado

El primer truco es para eliminar un tipo de contenido determinado de forma masiva. Se trata de unas pocas líneas de código...

<?php

/* Establezco el tipo de contenido a eliminar */
$content_type = "nombre_maquina_tipo_contenido";

$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties([
    'type' => $content_type,
  ]);

$i = 0;
foreach ($nodes as $node) {
  $node->delete();
  $i++;
}

ksm('Nodos borrados: ' . $i);

Debemos tener en cuenta una cosa: si nuestro tipo de contenido hace uso del módulo Paragraphs, la eliminación del tipo de contenido puede dejar elementos huérfanos.

Veamos como podemos solucionar esto también

Eliminar elementos huérfanos de Paragraph

El snippet también es muy sencillo:

<?php

$deleted = [];
$paragraph_ids = \Drupal::entityQuery('paragraph')->execute();
$paragraphs = \Drupal::entityTypeManager()
  ->getStorage('paragraph')
  ->loadMultiple($paragraph_ids);

$i = 0;
foreach ($paragraphs as $target_id => $paragraph) {

  $parent = $paragraph->getParentEntity();
  $field_name = $paragraph->parent_field_name->value;

  $exists = FALSE;
  $values = is_null($parent) ? [] : $parent->get($field_name)->getValue();

  foreach($values as $value) {
    if ($value['target_id'] == $target_id) {
      $exists = TRUE;
    }
  }

  if (!$exists) {
    $paragraph->delete();
    $deleted[] = $target_id;
    $i++;
  }
}

/* Podemos añadir los elementos al mensaje haciendo:
 * implode(', ', $deleted);
 */
ksm('Se han eliminado ' . $i . ' elementos');

Eliminar usuarios según su rol

Si lo que queremos eliminar son usuarios que hemos creado dentro de un rol determinado:

<?php

use  \Drupal\user\Entity\User;

$role = 'rol_a_eliminar';

$ids = \Drupal::entityQuery('user')
  ->condition('status', 1)
  ->condition('roles', $role)
  ->execute();
$users = User::loadMultiple($ids);

$i = 0;
foreach($users as $user) {
  /* Podemos añadir excepciones según el ID del usuario */
  if ($user->id() != 10) {
    $user->delete();
    $i++;
  }
}

ksm('Borrados: ' . $i);

Eliminando términos de Taxonomía

La eliminación masiva de taxonomías en Drupal es muy similar a la eliminación de nodos:

<?php

/* Establezco el tipo de taxonomía a eliminar */
$taxonomy_type = 'product_categories';

$taxonomies= \Drupal::entityTypeManager()
  ->getStorage('taxonomy_term')
  ->loadByProperties([
    'vid' => $taxonomy_type ,
  ]);

$i = 0;
foreach ($taxonomies as $taxonomy) {
  $taxonomy->delete();
  $i++;
}

ksm('Taxonomías borradas: '. $i);

Eliminando otros contenidos...

Te dejo un enlace a otro artículo de esta web dónde explico cómo eliminar una vista a través de código

Artículos relacionados

Comentarios

Añadir nuevo comentario

Este campo no se mostrará públicamente.