Comment supprimer tous les termes d'un vocabulaire (suppression groupée)?

Réponses:

15

Le gestionnaire de taxonomie possède une fonctionnalité de suppression en masse, sélectionnez simplement tous les termes dans votre vocabulaire et cliquez sur le bouton "Supprimer":

entrez la description de l'image ici

Si vous voulez le faire en utilisant du code, quelque chose comme ceci devrait vous aider:

$vocabulary = taxonomy_vocabulary_machine_name_load('my_custom_vocabulary');
foreach (taxonomy_get_tree($vocabulary->vid) as $term) {
  taxonomy_term_delete($term->tid);
}
Clive
la source
D'accord, bien que Taxo Manager ne dispose pas d'une option de sélection en bloc, et si vous avez des centaines de termes, vous devrez les vérifier chacun un par un.
giorgio79
Ouais c'est un peu ennuyeux en fait, je pourrais faire une demande de fonctionnalité pour ça
Clive
2
Merci d'avoir ajouté à la fois l'interface utilisateur et les méthodes de code! Toujours très utile +1
Matt Fletcher
5
@ giorgio79 les navigateurs les plus modernes supportent Shift + Click sur les cases à cocher. Si vous cochez une case, puis Maj + Clic sur une autre case du même groupe, toutes les cases entre ces 2 seront sélectionnées / désélectionnées.
Елин Й.
26

Une méthode préférée de suppression en masse de contenu par type de contenu, vocabulaire taxonomique, etc. utilise le module http://drupal.org/project/devel . Pour supprimer tous les termes d'un vocabulaire:

  1. Activer les modules Devel et Devel Generate
  2. Allez dans Développement> Générer des termes
  3. Sélectionnez le vocabulaire dont vous souhaitez supprimer les termes
  4. Entrez "0" pour le nombre de termes à générer
  5. Cochez "Supprimer les termes existants avant d'en générer de nouveaux"
  6. Cliquez sur Soumettre

Voila - vocabulaire vide, sinon intact.

texas-bronius
la source
Le module s'appelle: Devel Generate
kenorb
6

Vous pouvez utiliser la commande suivante:

drush -v eval 'foreach(taxonomy_get_tree(123) as $term) { taxonomy_term_delete($term->tid); }'

Si cela ne fonctionne pas, assurez-vous de vider votre cache (par exemple memcached).

Ou un moyen plus rapide en utilisant la requête SQL sale suivante:

drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = 123"

Où 123 est votre identifiant de vocabulaire que vous devez modifier.

Vous pouvez obtenir vidvotre nom de vocabulaire par la commande suivante:

drush sqlq "SELECT name, vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name'"

Voir également:

Kenorb
la source
1
qui fonctionne magnifiquement simplement :-)
Alejandro Moreno
1
Très bonne réponse! Vous méritez plus de votes positifs!
Lautaro Rosales du
1
Vous pouvez même combiner les deux, si vous vous sentez fringant: drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = (SELECT vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name')"
Kirkland
2

Les vues d'administration fournissent uniquement des vues VBO préconfigurées. VBO lui-même fonctionne bien avec les termes (ou tout autre type d'entité) Installez VBO vous-même et créez la vue que vous souhaitez, puis utilisez VBO pour supprimer les termes.

Bojan Zivanovic
la source
2

Pour supprimer en bloc tous les termes de taxonomie dans un vocabulaire dans Drupal 7, utilisez la taxonomy_term_deletefonction en bouclant à travers tous les termes.

Prenons l'exemple suivant:

// Get metadata about the vocabulary from its machine name
$vocab = taxonomy_vocabulary_machine_name_load('TAXONOMY_MACHINE_NAME');

// Get a hierarchical representation of all terms
$terms = taxonomy_get_tree($vocab->vid);

// Loop thru all terms in the taxonomy, deleting each one
if (!empty($terms)) {
  foreach ($terms as $term) {
    taxonomy_term_delete($term->tid);
  }
}

Encore plus facile, si Drush et le module Devel sont installés, vous pouvez utiliser la commande suivante pour supprimer en bloc tous les termes d'une taxonomie * dans le confort de votre shell:

$ drush génération-termes TAXONOMY_MACHINE_NAME 0 --kill

* Cela suppose que le module Devel Generate soit activé, ce qui peut être fait si nécessaire:

$ drush en -y devel && drush en -y devel_generate

rjb
la source
merci pour les termes de génération drush car il explosait lorsqu'il était utilisé depuis l'interface utilisateur
GiorgosK
1

Je recommanderais d'utiliser les vues d'administration avec VBO pour obtenir une vue pour remplacer l'affichage par défaut des termes de taxonomie.

Ce que vous devez faire est le suivant:

  1. Activez ces modules bien sûr
  2. Activez la vue intitulée "Administration: Termes de taxonomie"
  3. Ajoutez une colonne dans la vue intitulée "Opérations en bloc: terme de taxonomie"
  4. FLUSH CACHES - puis allez dans Admin> Structure> Taxonomy> Specific Vocab

Vues Opérations en bloc et Vues d'administration

Duncanmoo
la source
1

Je viens d'écrire un article de blog sur la façon d'ajouter un bouton pour supprimer tous les termes de taxonomie ici .

Essentiellement:

J'utilise le plugin jQuery Easy Confirm Dialog pour cela. Téléchargez d' abord la bibliothèque d'ici et mettez-la dans votre dossier js de thèmes.

Nous pouvons ensuite ajouter un bouton «Supprimer tous les termes» avec un petit code dans un module personnalisé:

function hook_form_alter(&$form, &$form_state, $form_id) {
    switch($form_id) {
        case 'taxonomy_overview_terms':

            if($form['#total_entries']) {
                drupal_add_library('system', 'ui.dialog');
                drupal_add_js(drupal_get_path('theme', 'YOUR_THEME_NAME').'/js/jquery.easy-confirm-dialog.js');         
                $js = 'jQuery(document).ready(function($){$(".confirm").easyconfirm({locale: { title: \'Delete all '.$form['#vocabulary']->name.' terms\', button: [\'No\',\'Yes\']}});});';
                drupal_add_js($js, array('type'=>'inline'));
                $form['actions']['delete_all'] = array(
                    '#markup' => '<a href="https://drupal.stackexchange.com/admin/structure/taxonomy/'.$form['#vocabulary']->vid.'/delete-all" class="button confirm" title="Are you sure you want to delete all terms from the '.$form['#vocabulary']->name.' vocabulary?">Delete All Terms</a>',
                    '#weight' => 10,
                    '#attributes' => array('class' => array('button'))
                );
            }

            break;
    }
}

Maintenant, nous devons définir le chemin d'accès à notre fonction pour supprimer les termes:

function hook_menu() {
    $items = array();
    $items['admin/structure/taxonomy/%/delete-all'] = array(
        'title' => 'Delete all taxonomy terms',
        'type' => MENU_CALLBACK,
        'page callback' => 'delete_all_taxonomy_terms',
        'page arguments'    =>  array(3),
        'access arguments'  =>  array('administer taxonomy'),
    );
    return $items;
}

Et enfin, ajoutez la fonctionnalité pour supprimer réellement les termes:

function delete_all_taxonomy_terms($vid) {
    $vocabulary = taxonomy_vocabulary_load($vid);
    $query = new EntityFieldQuery();
    $result = $query
        ->entityCondition('entity_type', 'taxonomy_term')
        ->propertyCondition('vid', $vid)
        ->execute();
    foreach($result['taxonomy_term'] as $term) {
        taxonomy_term_delete($term->tid);
    }
    drupal_set_message('All terms have been deleted from the '.$vocabulary->name.' vocabulary');
    drupal_goto('admin/structure/taxonomy/'.$vocabulary->machine_name);
}
Felix Eve
la source
0

Juste pour compléter les réponses, un module fait exactement cela. Il s'agit du module taxonomy_delete_all_terms . Je l'ai utilisé et ça marche.

Pour les sites avec de très grands vocabulaires taxonomiques, la suppression de vocabulaires peut devenir impossible en raison de l'expiration du délai de demande de suppression. Lorsque cela se produit avant la fin de la transaction de suppression, la transaction est annulée, ce qui ne supprime aucune condition.

TheodorosPloumis
la source
0

Ma réponse est tangentiellement liée à la question d'origine. En s'appuyant sur la réponse de kenorb , si vous souhaitez nettoyer TOUS les vocabulaires de votre site, vous pouvez exécuter ce qui suit:

drush -v eval '$vocabularies = taxonomy_get_vocabularies(); foreach($vocabularies as $vocabulary) { foreach(taxonomy_get_tree($vocabulary->vid) as $term) { taxonomy_term_delete($term->tid);}}'
Screenack
la source
0

Comme l'a dit @texas_bronius, si vous avez activé le développement, vous pouvez l'utiliser, mais en allant plus loin, si vous avez également installé drush, j'utilise cette commande:

drush generate-terms [vocabulary_machine_name] 0 --kill

Et remplacez simplement [vocabulary_machine_name] par le nom de la machine de votre vocabulaire. Le "0" indique le nombre de termes à ajouter et le "--kill" consiste à supprimer ceux qui s'y trouvent actuellement.

ttamniwdoog
la source