web-dev-qa-db-fra.com

Drupal 8: supprime tous les nœuds du même type

J'ai besoin de supprimer tous les nœuds du même type dans Drupal 8 (il y a plus de 7k de nœuds).

Ce ne serait pas un problème pour Drupal 7 (la requête DB + node_delete ou node_delete_multiple aurait résolu mon problème). Cependant, D8 est légèrement différent :)

S'il vous plaît, un conseil, comment puis-je le faire. Merci d'avance!

10
megastruktur

On devrait utiliser des requêtes d'entité au lieu d'agir directement sur la base de données:

  $result = \Drupal::entityQuery('node')
      ->condition('type', 'my_content_type_name')
      ->execute();
  entity_delete_multiple('node', $result);

Configurer des plages comme dans l'autre réponse ne devrait pas être trop difficile.

Voir EntityFieldQuery a été réécrit pour plus d'informations.

14
colan

Eh bien, la réponse se trouve à la surface:

$types = array('my_content_type_name');

$nids_query = db_select('node', 'n')
->fields('n', array('nid'))
->condition('n.type', $types, 'IN')
->range(0, 500)
->execute();

$nids = $nids_query->fetchCol();

entity_delete_multiple('node', $nids);

Je vous conseille d'utiliser "range" et une sorte de "batch" (ou simplement de réexécuter le code plusieurs fois), car il s'agit d'une opération très lourde (500 nœuds par opération suffisent pour 256 Mo).

Pour exécuter ce code, vous pouvez écrire un module personnalisé OR en utilisant le devel module: https://www.drupal.org/project/devel

Après l'installation, allez à yoursite_address/devel/php et exécutez le code php à cet emplacement.

7
megastruktur

Drupal 8 a la fonctionnalité pour obtenir des nœuds par type de contenu, donc je voudrais utiliser

$nodes = \Drupal::entityTypeManager()
    ->getStorage('node')
    ->loadByProperties(array('type' => 'your_content_type'));

foreach ($nodes as $node) {
    $node->delete();
}
5
karelVanGeerdeghom

vous pouvez utiliser le module Devel
1- aller à Admin-> configuration-> développement-> générer du contenu 
(admin/config/development/generate/content)
2- sélectionnez le type de contenu que vous souhaitez supprimer de ses nœuds.
3- cocher "supprimer tout le contenu de ces types de contenu .." (important) 
4- mettez "0" dans "combien de nœuds souhaitez-vous générer" (important) 
voir l'image ci-jointe pour les instructions.

image jointe

4
Nysso

Entity_delete_multiple est obsolète à partir de Drupal 8.0.x et sera supprimé avant Drupal 9.0.0. Utilisez la méthode delete () du stockage de l'entité pour supprimer plusieurs entités:

// query all entities you want for example taxonomy term from tags vocabulary
$query = \Drupal::entityQuery('taxonomy_term');
$query->condition('vid', 'tags');
$tids = $query->execute();

$storage_handler = \Drupal::entityTypeManager()->getStorage($entity_type);
$entities = $storage_handler->loadMultiple($tids);
$storage_handler->delete($entities);
4
mouhammed

Le moyen très simple consiste à installer Bulk Delete module. Il est disponible pour D7 & D8.

Après avoir installé le module, vous verrez l’option Bulk Delete node tab lorsque vous cliquez sur le menu contenu. 

Cela m'a sauvé la journée :)

Pour votre facilité, j'ai joint une capture d'écran.

 enter image description here

1
npcoder

Pour supprimer toutes les entités de certains types d’entités, j’utilise cet extrait adapté du dernier commentaire:

$entity_types = ['taxonomy_term','node','menu_link_content',];
foreach ($entity_types as $entity_type) {
  $query = \Drupal::entityQuery($entity_type);
  $ids = $query->execute();

  $storage_handler = \Drupal::entityTypeManager()->getStorage($entity_type);
  $entities = $storage_handler->loadMultiple($ids);
  $storage_handler->delete($entities);
}
0
izus

J'utilise la console Drupal pour ce https://docs.drupalconsole.com/ko/commands/entity-delete.html

drupal entity:delete [arguments]

0
Kevin howbrook