web-dev-qa-db-fra.com

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

J'ai un grand vocabulaire, et vues admin ne fonctionne pas encore pour la taxonomie. Taxonomy Manager ne fait pas aussi bien cela. Existe-t-il des options de suppression groupée de termes?

10
giorgio79

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

enter image description here

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

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.

26
texas-bronius

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 vid de votre nom de vocabulaire par la commande suivante:

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

Voir également:

6
kenorb

Pour supprimer en bloc tous les termes de taxonomie d'un vocabulaire dans Drupal 7, utilisez le taxonomy_term_delete fonction 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 vous avez Drush et le module Devel 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 est activé, ce qui peut être fait si nécessaire:

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

2
rjb

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.

2
Bojan Zivanovic

Je recommanderais d'utiliser Vues Admin 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

Views Bulk Operations and Admin Views

1
Duncanmoo

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. Tout d'abord téléchargez 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="/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);
}
1
Felix Eve

Ma réponse est tangentiellement liée à la question d'origine. En s'appuyant sur kenorb's réponse, 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);}}'
0
Screenack

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.

0
ttamniwdoog

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.

0
TheodorosPloumis