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


31

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?

Réponses:


32

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:


Wow, j'ai complètement raté celui-ci. Bonne trouvaille
Greg

4
Une autre méthode, qui pourrait être utile si vous faites plus qu'un simple filtre de type de contenu, consiste à utiliser Views Bulk Operations: drupal.org/project/views_bulk_operations
geerlingguy

Le module de suppression en bloc est abandonné maintenant. Il est suggéré d'utiliser les opérations en bloc de vues.
Refino

26

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.


17

Dans Drupal 8, une façon consiste à utiliser 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

EDIT (Autre moyen, 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.


Ce n'est pas correct, delete () attend les entités chargées, pas les ID, ce que renvoie la requête d'entité. Au lieu d'un résultat $ non descriptif, utilisez $ ids ou $ nids puis $ storage-> delete ($ storage-> load ($ ids)).
Berdir

@Berdir merci, je vais tester à nouveau le code, peut-être que ce problème a été introduit en une seule modification
Adrian Cid Almaguer

@Berdir Je mets à jour la réponse et je teste le code et ça marche, le problème a été introduit en une seule modification.
Adrian Cid Almaguer

2
@AdrianCidAlmaguer, vous pouvez remplacer la requête par$entities = $storage_handler->loadByProperties(['type' => 'YOUR_CONTENT_TYPE_NAME']);
4k4

1
Récemment utilisé cela dans un crochet de mise à jour, il convient de noter que si vous utilisez, entityQuery vous devez définir la accessChecksur l'instruction. Sinon, si vous l'exécutez dans drush, par défaut accessCheck est défini sur true et tous les nœuds auxquels uid 0 n'a pas accès ne seront pas retournés.
awm

13

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.


10

Créez un fichier avec le code ci-dessous à la racine de l'installation 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);
  }
?>

1
db_fetch_object ne fait pas partie de l'API de base de données D7.
ya.teck

10

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

1
Cela s'exécutera très lentement, si vous devez supprimer des milliers de nœuds, il est préférable d'utiliser une méthode qui utilise l'API batch comme VBO.
abielefeldt

6

Pour ce faire, 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

5

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 beaucoup d'autres choses.

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


4

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_DELETEDest le type de contenu à supprimer.


3
Il convient de noter que cela ne fonctionne que pour Drupal 4.6, 5 et 6. La version Drupal 7 estdb_delete('node')
Greg

4

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


C'est le sous-module Devel devel_generatequi doit être activé. Et pour plusieurs types, c'estdrush genc 0 --kill --types="article, page"
leymannx

3

J'utilise Supprimer tout le module, cela fonctionne bien avec D8 et fournit des commandes drush très utiles. Par exemple, pour supprimer tout le contenu du articletype de contenu:

drush delete-all article  

Est-ce que cela fonctionne avec D8? J'ai activé le module mais j'obtiens La commande drush 'supprimer tout article' est introuvable. J'ai également vidé le cache de drush
Yassin Tahtah

1

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

Cordialement



0

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

tout comme le module Bulk Delete supprimera tous les nœuds d'un certain type de nœud à l'aide de l'API batch. 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

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


-1

J'ai fini par utiliser db_delete , aucun module requis:

<?php
  db_delete('node')
    ->condition('type', 'MY_CONTENT_TYPE')
    ->execute();
?>

Edit / Warning: Voir le commentaire de Berdir ci-dessous. Cette méthode ne nettoie pas toutes les données liées aux nœuds.


3
Le problème avec cette approche est que les autres modules ne sont pas en mesure de réagir et de supprimer également leurs informations. Selon le type de contenu, il y a des informations spécifiques au nœud dans la table content_type de ce nœud, des champs, des taxonomies (un champ aussi, en fait), des commentaires, etc. Donc, vous vous retrouvez éventuellement avec beaucoup d'informations périmées dans votre base de données.
Berdir

@Berdir - Intéressant. Existe-t-il un meilleur moyen intégré de supprimer des nœuds?
Greg

3
Il y a node_delete () et node_delete_multiple (), voir la réponse de tim.plunket, mais qui n'est pas conçu pour gérer des milliers de nœuds, voir api.drupal.org/api/drupal/modules--node--node.module/function /… . Il charge tous les nœuds, puis les itère en une seule demande. Il faut donc à peu près utiliser un module contrib comme bulkdelete si vous souhaitez supprimer des centaines ou des milliers de nœuds.
Berdir

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.