Puis-je supprimer des nœuds d'un type de contenu donné avec Drush?

13

Je me demande simplement si Drush est capable de supprimer des nœuds d'un type de contenu donné.

Quelque chose comme: $ drush delete-node --type=MyContentType

Si ce n'est pas possible, puis-je créer une méthode comme ça?

chefnelone
la source

Réponses:

4

Vous pouvez créer une fonction comme suit:

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

Remarque - Vous pouvez également utiliser une SELECTrequête simple , mais vu que vous travaillez avec des entités, il semble plus judicieux / pratique courante d'utiliser EntityFieldQuery .

Cela devrait également être assez facile à modifier ou à ajouter des arguments. Vous pouvez également le mettre dans une commande Drush assez facilement - il y a un exemple pour le faire dans le référentiel Drush (consultez la section Commandes près du bas).

Chapabu
la source
Je vois, il semble que le lien du référentiel montre comment ajouter correctement une méthode drush.
chefnelone
Ouaip! Le fichier Lisezmoi propose également différentes manières de les implémenter!
Chapabu
21

Installez le module devel et utilisez drush pour supprimer tous les nœuds,

$  drush genc --kill 0 0 

Vous pouvez également donner une option de type,

$  drush genc --kill --types=article 0 0
ericj
la source
Intelligent, j'aime ça.
m4olivei
3
Cela fonctionne avec D8. Le devel_generatemodule est inclus avec devel, mais doit être activé avec drush en devel_generate genc est normalement utilisé pour créer des nœuds, donc le 0 0 à la fin lui dit de ne rien créer de nouveau, et le --kill pour supprimer ce qui est déjà là.
William Turrell
15

Je suppose que vous pouvez en utilisant la commande ci-dessous

drush node_delete <nid>

EDIT: Trouvé un module qui fait quelque chose / lié à la question

http://drupal.org/project/delete_all

Usage

Drush

drush delete-all

Exemple: drush delete-all article

ninjascorner
la source
Je voulais supprimer tous les nœuds par type de contenu.
chefnelone
Avez-vous essayé ce module drupal.org/project/delete_all Utilisation Drush drush delete-all Exemple: article drush delete-all
ninjascorner
où puis-je trouver la commande drush node_delete <nid>?
Adrian Cid Almaguer
Pour gagner du temps, en décembre 2016, il delete_all n'était pas encore porté sur Drupal 8 , mais la réponse genc fonctionne.
William Turrell
5

Quelque chose comme ça fonctionnerait (non testé):

$query = new EntityFieldQuery();

$entities = $query->entityCondition('entity_type', 'node', '=')
  ->entityCondition('bundle', 'Announcements')
  ->execute();

$nids = array_keys($entities['node']);

node_delete_multiple($nids);

Cela trouvera tous les nœuds avec le type de contenu Annoucementsutilisant EntityFieldQuery(). Il récupère ensuite tout le $nidsrésultat et les supprime à l'aide node_delete_multiple().

Vous pouvez prendre ce code, le placer dans un fichier PHP séparé, puis l'exécuter avec drush scr.

L'utilisation de l'API garantit que tous les crochets appropriés se déclenchent. Entre autres, ils supprimeront également les révisions des nœuds et les données de champ (et leurs révisions) afin que vous n'ayez pas de données orphelines dans la base de données.

mpdonadio
la source
5

Il y a quelques bonnes idées sur ce fil. Si vous ne voulez pas vraiment faire de programmation et que vous voulez utiliser Drush, vous pouvez regarder le module de contribution Supprimer tout :

Drush
drush supprimer tout
Exemple: article drush delete-all

Drush sur la version Drupal 7

Supprimez tous les nœuds, les nœuds d'un type de contenu spécifique ou les utilisateurs.

Exemples:
 drush delete-all article Supprime tous les nœuds d'article.
 drush delete-all all Supprimer les nœuds de tous types.
 drush delete-all --reset Supprime les nœuds de tous types et réinitialise les compteurs de nœuds, de révision et de commentaires.
 drush delete-all users Supprimer les utilisateurs.

Options:
 --reset Réinitialiser le compteur pour les tables de nœuds, de révision et de commentaires.
 --les rôles choisissent les rôles

Alias: da
tenken
la source
5

Drush 9

drush entity:delete node --bundle=my_content_type

Denis Viunyk
la source
2
La meilleure réponse de nos jours!
Jonathan
4

VBO a l'intégration de Drush. Créez une vue VBO des nœuds, exécutez-la via Drush (à l'aide de drush vbo-execute), passez le type de nœud comme argument.

Bojan Zivanovic
la source
Je pense que c'est ce dont j'ai besoin. Juste 2 questions: Quelle est la méthode drush pour exécuter une vue? et cette méthode sera-t-elle plus rapide que l'exécution de la vue dans le navigateur?
chefnelone
Modifié la réponse pour spécifier la commande drush exacte. Et oui, ce sera plus rapide car de cette façon, la vue n'est pas rendue.
Bojan Zivanovic
1

Vous pouvez également créer un script drush (disons qu'il s'appelle "bulk_delete.php" et est placé sous le dossier racine Drupal):

#!/usr/bin/env drush

$res = db_delete('node')
  ->condition('type', 'mycontenttype', '=')
  ->execute();

echo "deleted:" . $res;

C'est absolument le moyen le plus rapide de le faire: une requête directe vers la base de données, en utilisant la fonction de Drupal db_delete

Usage:

:~# 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

Attention: ce processus ne supprime pas les données de leurs champs. Quoi qu'il en soit, le même processus peut être appliqué à ces champs (en regardant la colonne "bundle" de chaque champ). Par exemple:

#!/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";
}

Où "mycontenttype" est celui utilisé dans la première requête.

Mauro Mascia
la source
Pourquoi la condition 'nid' > 5000?
Елин Й.
c'est un exemple, comme le type.
Mauro Mascia du
Mais l'affiche originale ne mentionne pas une telle condition, c'est pourquoi je pense que l'exemple n'est pas pertinent, donc trompeur.
Елин Й.
1

Drupal 7

Essayez le one-liner suivant, il supprime tous les nœuds MyContentType de Drupal:

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

Ou vous pouvez supprimer toutes les entités en fonction du nom du type d'entité (par exemple, nœud):

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

Remarque: nodeest le nom de votre type d'entité, vous pouvez le changer si nécessaire.


Si vous obtenez des erreurs de mémoire ou de temporisation, vous pouvez ajouter les ensembles suivants juste avant $res:

ini_set('memory_limit', -1); ini_set('max_execution_time', 0);
Kenorb
la source
1

Pour supprimer tous les nœuds d'un type de contenu particulier, vous pouvez essayer d'exécuter la commande suivante via drush:

drush eval '$res = (new EntityFieldQuery)->entityCondition("entity_type", "node")->entityCondition('bundle', 'MyContentType')->execute(); entity_delete_multiple("node", array_keys(reset($res)));'

Où MyContentType est le nom du type de contenu de votre machine (par exemple, Page).

Kenorb
la source
1

Pour les nœuds individuels:

$ drush php-eval 'node_delete($node->nid);'

drush php-eval
Évaluer le code php arbitraire après le démarrage de Drupal

edmitry
la source
Veuillez ajouter quelques détails supplémentaires pour expliquer votre code, sans que cela puisse être considéré comme une réponse de faible qualité (et donc il pourrait être supprimé via la modération).
Pierre.Vriens
1

Mise à jour de la réponse fournie par @kenorb.

Dans Drupal 8

drush eval '$nids = \Drupal::entityQuery('node')->execute(); $storage = Drupal::entityTypeManager()->getStorage('node'); $e = $storage->loadMultiple($nids); $storage->delete($e);'
Jason Yarrington
la source
drush ev '$ type =' \ '' node '\' '; entity_delete_multiple ($ type, \ Drupal :: entityQuery ($ type) -> execute ()); '
geek-merlin
Pour mettre à jour une réponse existante, veuillez déposer un commentaire pour suggérer une modification.
leymannx
0

Vous pouvez utiliser

drush node_delete NID pour supprimer un nœud spécifique, mais si vous souhaitez supprimer tous les nœuds par type de contenu, je suppose que vous pouvez créer un plugin drush à l'aide d'une API par lots.

user8012
la source
Je ne trouve pas la commande drush node_delete NID.
Adrian Cid Almaguer