Ho un ampio vocabolario e le visualizzazioni dell'amministratore non funzionano ancora per la tassonomia. Anche il Taxonomy Manager non lo fa. Ci sono opzioni per l'eliminazione in blocco?
Ho un ampio vocabolario e le visualizzazioni dell'amministratore non funzionano ancora per la tassonomia. Anche il Taxonomy Manager non lo fa. Ci sono opzioni per l'eliminazione in blocco?
Risposte:
Il Taxonomy Manager ha una funzionalità di eliminazione in blocco, basta selezionare tutti i termini nel tuo vocabolario e fare clic sul pulsante "Elimina":
Se vuoi farlo usando il codice, qualcosa di simile al seguente dovrebbe aiutare:
$vocabulary = taxonomy_vocabulary_machine_name_load('my_custom_vocabulary');
foreach (taxonomy_get_tree($vocabulary->vid) as $term) {
taxonomy_term_delete($term->tid);
}
Un metodo preferito di eliminazione collettiva di contenuti per tipo di contenuto, vocabolario tassonomico, ecc. Utilizza il modulo http://drupal.org/project/devel . Per eliminare tutti i termini in un vocabolario:
Voilà: vocabolario vuoto, altrimenti intatto.
Puoi usare il seguente comando:
drush -v eval 'foreach(taxonomy_get_tree(123) as $term) { taxonomy_term_delete($term->tid); }'
Se non funziona, assicurati di svuotare la cache (ad esempio memcached).
O un modo più veloce utilizzando la seguente query SQL sporca:
drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = 123"
Dove 123 è il tuo ID di vocabolario che dovresti cambiare.
Puoi ottenere vid
il nome del tuo vocabolario con il seguente comando:
drush sqlq "SELECT name, vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name'"
Guarda anche:
drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = (SELECT vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name')"
Le viste amministratore forniscono solo viste VBO preconfigurate. VBO stesso funziona bene con i termini (o qualsiasi altro tipo di entità) Installa VBO tu stesso e crea la vista che desideri, quindi usa VBO per eliminare i termini.
Per eliminare in blocco tutti i termini della tassonomia all'interno di un vocabolario in Drupal 7, usa la taxonomy_term_delete
funzione eseguendo il ciclo attraverso tutti i termini.
Considera il seguente esempio:
// 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);
}
}
Ancora più semplice, se hai installato Drush e il modulo Devel , puoi usare il seguente comando per cancellare tutti i termini in una tassonomia * comodamente dalla tua shell:
$ drush genera termini TAXONOMY_MACHINE_NAME 0 --kill
* Ciò presuppone che tu abbia abilitato il modulo Devel Generate, che può essere fatto se necessario:
$ drush en -y devel && drush en -y devel_generate
Consiglierei di utilizzare Admin Views con VBO per ottenere una vista in sostituzione della visualizzazione predefinita dei termini di tassonomia.
Quello che devi fare è il seguente:
Ho appena scritto un post sul blog su come aggiungere un pulsante per eliminare tutti i termini di tassonomia qui .
Essenzialmente:
Per questo sto usando il plugin jQuery Easy Confirm Dialog . Prima scarica la libreria da qui e inseriscila nella cartella js dei temi.
Possiamo quindi aggiungere un pulsante "Elimina tutti i termini" con un piccolo codice in un modulo personalizzato:
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;
}
}
Ora dobbiamo definire il percorso della nostra funzione per eliminare i termini:
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;
}
E infine aggiungi la funzionalità per eliminare effettivamente i termini:
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);
}
Solo per completare le risposte c'è un modulo che fa esattamente questo. È il modulo taxonomy_delete_all_terms . L'ho usato e funziona.
Per i siti con vocabolari di tassonomia molto grandi, l'eliminazione dei vocabolari potrebbe diventare impossibile a causa del termine del termine di richiesta di eliminazione. Quando ciò accade prima del completamento della transazione di eliminazione, la transazione viene ripristinata, senza che i termini vengano eliminati.
La mia risposta è tangenzialmente legata alla domanda originale. Sulla base di kenorb risposta, se si desidera pulire TUTTI vocabolari al vostro sito, è possibile eseguire il seguente:
drush -v eval '$vocabularies = taxonomy_get_vocabularies(); foreach($vocabularies as $vocabulary) { foreach(taxonomy_get_tree($vocabulary->vid) as $term) { taxonomy_term_delete($term->tid);}}'
Come è stato detto da @texas_bronius, se hai sviluppato generate abilitato, puoi usarlo ma facendo un ulteriore passo avanti, se hai anche drush installato, io uso questo comando:
drush generate-terms [vocabulary_machine_name] 0 --kill
E basta sostituire [vocabulary_machine_name] con il nome della macchina del tuo vocabolario. Lo "0" indica quanti termini aggiungere e "--kill" rimuove quelli attualmente presenti.