Ich habe einen großen Wortschatz und die Administratoransichten funktionieren noch nicht für die Taxonomie. Taxonomy Manager macht das auch nicht. Gibt es Optionen zum Löschen von Massenbegriffen?
Ich habe einen großen Wortschatz und die Administratoransichten funktionieren noch nicht für die Taxonomie. Taxonomy Manager macht das auch nicht. Gibt es Optionen zum Löschen von Massenbegriffen?
Antworten:
Der Taxonomie-Manager verfügt über eine Massenlöschfunktion. Wählen Sie einfach alle Begriffe in Ihrem Wortschatz aus und klicken Sie auf die Schaltfläche "Löschen":
Wenn Sie dies mit Code tun möchten, sollte Folgendes helfen:
$vocabulary = taxonomy_vocabulary_machine_name_load('my_custom_vocabulary');
foreach (taxonomy_get_tree($vocabulary->vid) as $term) {
taxonomy_term_delete($term->tid);
}
Eine bevorzugte Methode zum Massenlöschen von Inhalten nach Inhaltstyp, Taxonomievokabular usw. verwendet das Modul http://drupal.org/project/devel . Zum Löschen aller Begriffe in einem Vokabular:
Voila - leerer Wortschatz, sonst unberührt.
Sie können den folgenden Befehl verwenden:
drush -v eval 'foreach(taxonomy_get_tree(123) as $term) { taxonomy_term_delete($term->tid); }'
Wenn es nicht funktioniert, stellen Sie sicher, dass Sie Ihren Cache leeren (z. B. zwischengespeichert).
Oder schneller mit der folgenden Dirty-SQL-Abfrage:
drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = 123"
Wobei 123 Ihre Vokabular-ID ist, die Sie ändern sollten.
Sie können vid
Ihren Wortschatznamen mit dem folgenden Befehl abrufen:
drush sqlq "SELECT name, vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name'"
Siehe auch:
drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = (SELECT vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name')"
Admin-Ansichten bieten nur vorkonfigurierte VBO-Ansichten. VBO selbst funktioniert gut mit Begriffen (oder einem anderen Entitätstyp). Installieren Sie VBO selbst und erstellen Sie die gewünschte Ansicht. Löschen Sie die Begriffe dann mit VBO.
Verwenden Sie die taxonomy_term_delete
Funktion, indem Sie alle Begriffe durchlaufen, um alle Taxonomiebegriffe in einem Vokabular in Drupal 7 zu löschen .
Betrachten Sie das folgende Beispiel:
// 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);
}
}
Noch einfacher, wenn Sie Drush und das Devel- Modul installiert haben, können Sie den folgenden Befehl verwenden, um alle Begriffe in einer Taxonomie * bequem von Ihrer Shell aus zu löschen:
$ drush generate-Terms TAXONOMY_MACHINE_NAME 0 --kill
* Dies setzt voraus, dass Sie das Modul "Entwickeln generieren" aktiviert haben. Dies kann bei Bedarf durchgeführt werden:
$ drush en -y devel && drush en -y devel_generate
Ich würde empfehlen, Admin-Ansichten mit VBO zu verwenden, um eine Ansicht zu erhalten, die die Standardanzeige von Taxonomie-Begriffen ersetzt.
Was Sie tun müssen, ist Folgendes:
Ich habe gerade einen Blog-Beitrag darüber geschrieben, wie man hier eine Schaltfläche zum Löschen aller Taxonomiebegriffe hinzufügt .
Im Wesentlichen:
Ich verwende dafür das jQuery Easy Confirm Dialog-Plugin . Zuerst laden Sie die Bibliothek von hier und setzen diese in Ordner Ihre Themen js.
Wir können dann eine Schaltfläche "Alle Begriffe löschen" mit einem kleinen Code in einem benutzerdefinierten Modul hinzufügen:
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="/drupal//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;
}
}
Jetzt müssen wir den Pfad zu unserer Funktion definieren, um die Begriffe zu löschen:
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;
}
Und schließlich fügen Sie die Funktionalität hinzu, um die Begriffe tatsächlich zu löschen:
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);
}
Um die Antworten zu vervollständigen, gibt es ein Modul, das genau dies tut. Es ist das Modul taxonomy_delete_all_terms . Ich habe es benutzt und es funktioniert.
Bei Websites mit sehr großen Taxonomie-Vokabularen kann das Löschen von Vokabularen aufgrund des Zeitlimits für die Löschanforderung unmöglich werden. Wenn dies geschieht, bevor die Löschtransaktion abgeschlossen ist, wird die Transaktion zurückgesetzt, sodass überhaupt keine Bedingungen gelöscht werden.
Meine Antwort bezieht sich tangential auf die ursprüngliche Frage. Aufbauend auf der Antwort von Kenorb können Sie Folgendes ausführen , wenn Sie ALLE Vokabeln an Ihrem Standort bereinigen möchten:
drush -v eval '$vocabularies = taxonomy_get_vocabularies(); foreach($vocabularies as $vocabulary) { foreach(taxonomy_get_tree($vocabulary->vid) as $term) { taxonomy_term_delete($term->tid);}}'
Wie von @texas_bronius gesagt, wenn Sie die Entwicklungsgenerierung aktiviert haben, können Sie dies verwenden, aber wenn Sie auch drush installiert haben, verwende ich diesen Befehl, wenn Sie noch einen Schritt weiter gehen:
drush generate-term [vocabulary_machine_name] 0 --kill
Und ersetzen Sie einfach [vocabulary_machine_name] durch den Maschinennamen Ihres Vokabulars. Die "0" gibt an, wie viele Begriffe hinzugefügt werden sollen, und "--kill" dient zum Entfernen der aktuell darin enthaltenen Begriffe.