web-dev-qa-db-fra.com

Comment supprimer tous les nœuds d'un type de contenu donné?

J'ai plusieurs milliers de nœuds d'un type de contenu particulier. En utilisant l'interface Web (example.com/admin/content), je ne peux en supprimer qu'une cinquantaine à la fois. Comment puis-je les supprimer rapidement?

33
Greg

Il existe un module pour cela (TM).

Voir Suppression en masse .

Cela utilisera l'API Batch pour supprimer les nœuds afin d'éviter les problèmes de dépassement de délai ou de mémoire lors de la suppression de milliers de nœuds avec un seul appel à node_delete_multiple ().

La suppression en bloc est un module abandonné. Voir pour les alternatives:

33
Berdir

En regardant le module Devel Generate pour l'inspiration, voici sa fonction "content kill" 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))));
  }
}

J'essaierais donc d'utiliser Devel Generate pour supprimer tous les nœuds mais n'en créer aucun, ou utiliser example.com/devel/php pour appeler devel_generate_content_kill(array('node_types' => array('my_node_type'))); directement.

27
tim.plunkett

Dans Drupal 8 dans un sens, utilisez la méthode entityQuery () avec la méthode 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 vous devez appliquer d'autres filtres/conditions, vous pouvez consulter la page d'interface QueryInterface

[~ # ~] modifier [~ # ~] (Autre manière, grâce à @ 4k4 ):

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$entities = $storage_handler->loadByProperties(["type" => "YOUR_CONTENT_TYPE_NAME"]);
$storage_handler->delete($entities);

Si vous souhaitez tester le code, vous pouvez utiliser:

drush php-eval '$storage_handler = \Drupal::entityTypeManager()->getStorage("node"); $entities = $storage_handler->loadByProperties(["type" => "article"]); $storage_handler->delete($entities);'

Cela supprimera tous vos articles.

19
Adrian Cid Almaguer

Si vous souhaitez le faire uniquement via l'interface utilisateur, vous pouvez utiliser le module devel_generate.

  1. Accédez au menu "Générer du contenu" dans "Configuration" (admin/config/development/generate/content).
  2. Sélectionnez les types de contenu que vous souhaitez supprimer.
  3. Assurez-vous que la case à côté de "Supprimer tout le contenu de ces types de contenu avant de générer un nouveau contenu" est cochée.
  4. Définissez le nombre de nœuds que vous souhaitez générer sur "0".

De cette façon, aucun nœud ne sera généré et tous les nœuds des types sélectionnés seront supprimés.

13
areynolds

Vous pouvez le faire dans Drupal 7 en utilisant la partie Execute PHP Code du module Devel en entrant:

$result= db_query("SELECT nid FROM {node} AS n WHERE n.type = 'TYPE'");
foreach ($result as $record) {
  node_delete($record->nid);
}
10
Colin Shipton

Créez un fichier avec le code ci-dessous à la racine de drupal et exécutez le fichier.

<?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);
  }
?>
10
Satya

Faites-le dans le terminal, si vous utilisez Drush et le module supprimer tout :

 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
8
shrish

Views Bulk operations fournit un écran d'administration de nœud configurable et activé par BatchAPI qui permet de filtrer par type, de sélectionner tous les nœuds correspondant à vos critères de recherche, etc.

C'est ma solution manuelle dans Drupal 6 - en plus de la suppression par lots, vous pouvez modifier en masse les nœuds et faire un tas d'autres choses.

Il semble que la version Drupal 7 n'est pas encore prête - mais je regarderais ce module pour une version D7.

5
Darren Petersen

Avec le module Devel, en utilisant drush:

drush genc 0 --types=article --kill

Ou dans l'interface utilisateur comme expliqué ici: http://befused.com/drupal/delete-nodes-devel

4
sunzu

Un autre extrait est:

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

TO_BE_DELETED est le type de contenu à supprimer.

4
Tangurena

J'utilise le module Delete all , il fonctionne très bien avec D8 et fournit des commandes drush très utiles. Par exemple, pour supprimer tout le contenu du type de contenu article:

drush delete-all article  
3
gerzenstl

Vous pouvez essayer le module Supprimer tout , accédez à 'admin/content/delete_content' et un formulaire de suppression de contenu appartenant à certains types de contenu vous sera présenté.

Cordialement

1
Oleg Videnov

Ce module est utilisé pour supprimer tout le contenu et/ou les utilisateurs d'un site. Il s'agit principalement d'un outil de développement, qui peut être utile dans plusieurs cas

https://www.drupal.org/project/delete_all

comme le module Bulk Delete supprimera tous les nœuds d'un certain type de nœud à l'aide de l'API par lots. Il est conseillé d'utiliser le module Views Batch Operations (VBO) pour un petit nombre de nœuds. Mais si vous devez supprimer 10 000 nœuds, ce module pourrait être une meilleure option.

https://www.drupal.org/project/bulkdelete

0
onlink

Si le module Migrate est activé, vous pouvez utiliser:

$ drush migrate-wipe <content-type>

Voir Commandes de migration typiques utilisant Drush .

0
jiv-e

Supprimez tous les nœuds de type de contenu par programme voici une fonction d'aide:


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