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?
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 simple requête SELECT
, 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 Drush référentiel (consultez la section Commandes près du bas).
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
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
Utilisation
Drush
drush delete-all
Exemple: drush delete-all article
drush entity:delete node --bundle=my_content_type
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 Annoucements
en utilisant EntityFieldQuery()
. Il récupère alors tous les $nids
Du résultat et les supprime en utilisant node_delete_multiple()
.
Vous pouvez prendre ce code, le placer dans un fichier PHP 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 de noeud 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.
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 contribué Delete All :
Drush Drush delete-all Exemple: drush delete-all article Drush on Drupal 7 version Supprimer tous les nœuds, les nœuds d'un type de contenu spécifique ou les utilisateurs. Exemples: drush delete-all article Supprimer tous les nœuds d'article . drush delete-all all Supprimer les nœuds de tous types. drush delete-all --reset Supprimer les nœuds de tous types et réinitialiser les compteurs de nœuds, de révision et de commentaires. drush Supprimer tous les utilisateurs Supprimer les utilisateurs. Options: --reset Réinitialiser le compteur pour les tables de nœuds, de révision et de commentaires. --les rôles sélectionnent les rôles Alias: da
VBO a l'intégration de Drush. Créez une vue VBO des nœuds, exécutez-la via Drush (en utilisant drush vbo-execute
), passez le type de nœud comme argument.
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: node
est le nom de votre type d'entité, vous pouvez le modifier si nécessaire.
Si vous obtenez des erreurs de mémoire ou de temporisation, vous pouvez ajouter les ensembles suivants juste avant le $res
:
ini_set('memory_limit', -1); ini_set('max_execution_time', 0);
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).
Vous pouvez également créer un script drush (disons qu'il s'appelle "bulk_delete.php" et est placé sous le dossier racine Drupal root):
#!/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 à 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.
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);'
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
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.
Vous pouvez également le faire avec le module de développement comme indiqué dans Puis-je supprimer des nœuds d'un type de contenu donné avec Drush?
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