Tengo un vocabulario extenso y las vistas administrativas aún no funcionan para la taxonomía. El Administrador de Taxonomía no hace esto también. ¿Hay alguna opción para la eliminación masiva de términos?
Tengo un vocabulario extenso y las vistas administrativas aún no funcionan para la taxonomía. El Administrador de Taxonomía no hace esto también. ¿Hay alguna opción para la eliminación masiva de términos?
Respuestas:
El administrador de taxonomía tiene una funcionalidad de eliminación masiva, solo seleccione todos los términos en su vocabulario y haga clic en el botón 'Eliminar':
Si desea hacerlo usando código, algo como lo siguiente debería ayudar:
$vocabulary = taxonomy_vocabulary_machine_name_load('my_custom_vocabulary');
foreach (taxonomy_get_tree($vocabulary->vid) as $term) {
taxonomy_term_delete($term->tid);
}
Un método favorito de eliminación masiva de contenido por tipo de contenido, vocabulario de taxonomía, etc. utiliza el módulo http://drupal.org/project/devel . Para eliminar todos los términos en un vocabulario:
Voila: vocabulario vacío, por lo demás intacto.
Puede usar el siguiente comando:
drush -v eval 'foreach(taxonomy_get_tree(123) as $term) { taxonomy_term_delete($term->tid); }'
Si no funciona, asegúrese de borrar su caché (por ejemplo, memcached).
O de manera más rápida utilizando la siguiente consulta SQL sucia:
drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = 123"
Donde 123 es su identificación de vocabulario que debe cambiar.
Puede obtener vid
su nombre de vocabulario con el siguiente comando:
drush sqlq "SELECT name, vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name'"
Ver también:
drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = (SELECT vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name')"
Las vistas de administrador solo proporcionan vistas de VBO preconfiguradas. VBO funciona bien con los términos (o cualquier otro tipo de entidad) Instale VBO usted mismo y cree la vista que desee, luego use VBO para eliminar los términos.
Para eliminar todos los términos de taxonomía dentro de un vocabulario en Drupal 7, use la taxonomy_term_delete
función recorriendo todos los términos.
Considere el siguiente ejemplo:
// 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);
}
}
Aún más fácil, si tiene Drush y el módulo Devel instalados, puede usar el siguiente comando para eliminar en masa todos los términos de una taxonomía * desde la comodidad de su shell:
$ drush generate-terms TAXONOMY_MACHINE_NAME 0 --kill
* Esto supone que tiene habilitado el módulo Devel Generate, que se puede hacer si es necesario:
$ drush en -y devel && drush en -y devel_generate
Recomendaría usar Vistas de administrador con VBO para obtener una vista que reemplace la visualización predeterminada de los términos de Taxonomía.
Lo que tienes que hacer es lo siguiente:
Acabo de escribir una publicación de blog sobre cómo agregar un botón para eliminar todos los términos de taxonomía aquí .
Esencialmente:
Estoy usando el complemento jQuery Easy Confirm Dialog para esto. Primero descargue la biblioteca desde aquí y colóquela en la carpeta js de sus temas.
Luego podemos agregar un botón "Eliminar todos los términos" con un pequeño código en un módulo personalizado:
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;
}
}
Ahora necesitamos definir la ruta a nuestra función para eliminar los términos:
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;
}
Y finalmente agregue la funcionalidad para eliminar realmente los términos:
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 para completar las respuestas hay un módulo que hace exactamente esto. Es el módulo taxonomy_delete_all_terms . Lo he usado y funciona.
Para sitios con vocabularios de taxonomía muy grandes, la eliminación de vocabularios puede ser imposible debido a que el plazo de solicitud de eliminación expira. Cuando eso sucede antes de que se complete la transacción de eliminación, la transacción se revierte, sin que se elimine ningún término.
Mi respuesta está relacionada tangencialmente con la pregunta original. Sobre la base de la respuesta de Kenorb , si desea limpiar TODOS los vocabularios en su sitio, puede ejecutar lo siguiente:
drush -v eval '$vocabularies = taxonomy_get_vocabularies(); foreach($vocabularies as $vocabulary) { foreach(taxonomy_get_tree($vocabulary->vid) as $term) { taxonomy_term_delete($term->tid);}}'
Como dijo @texas_bronius, si tiene habilitado el desarrollo de desarrollo, puede usarlo, pero yendo un paso más allá, si también tiene instalado drush, utilizo este comando:
drush generate-terms [vocabulary_machine_name] 0 --kill
Y simplemente reemplace [vocabulary_machine_name] con el nombre de la máquina de su vocabulario. El "0" es para cuántos términos agregar y "--kill" es para eliminar los que están actualmente allí.