J'ai un vocabulaire important et les vues d'administrateur ne fonctionnent pas encore pour la taxonomie. Taxonomy Manager ne fait pas cela aussi bien. Existe-t-il des options de suppression groupée de termes?
J'ai un vocabulaire important et les vues d'administrateur ne fonctionnent pas encore pour la taxonomie. Taxonomy Manager ne fait pas cela aussi bien. Existe-t-il des options de suppression groupée de termes?
Réponses:
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":
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);
}
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:
Voila - vocabulaire vide, sinon intact.
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
votre nom de vocabulaire par la commande suivante:
drush sqlq "SELECT name, vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name'"
Voir également:
drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = (SELECT vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name')"
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.
Pour supprimer en bloc tous les termes de taxonomie dans un vocabulaire dans Drupal 7, utilisez la 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 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
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:
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);
}
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.
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);}}'
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.