¿Cómo eliminar todos los términos de un vocabulario (eliminación masiva)?

Respuestas:

15

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':

ingrese la descripción de la imagen aquí

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);
}
Clive
fuente
Ok, gracias, aunque Taxo Manager no tiene una opción de selección masiva, y si tiene cientos de términos, debería verificarlos uno por uno.
giorgio79
Sí, eso es un poco molesto en realidad, podría presentar una solicitud de función para eso
Clive
2
¡Gracias por agregar la UI y los métodos de código! Siempre muy útil +1
Matt Fletcher
55
@ giorgio79 los navegadores más modernos admiten Shift + Click en casillas de verificación. Si hace clic en una casilla de verificación, luego Shift + Haga clic en otra casilla de verificación en el mismo grupo, todas las casillas de verificación entre esos 2 serán seleccionadas / no seleccionadas.
Елин Й.
26

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:

  1. Habilite los módulos Devel y Devel Generate
  2. Vaya a Desarrollo> Generar términos
  3. Seleccione el vocabulario del que desea eliminar los términos
  4. Ingrese "0" para la cantidad de Términos a generar
  5. Marque "Eliminar términos existentes antes de generar nuevos"
  6. Haga clic en Enviar

Voila: vocabulario vacío, por lo demás intacto.

texas-bronius
fuente
El módulo se llama: Devel Generate
kenorb
6

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 vidsu nombre de vocabulario con el siguiente comando:

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

Ver también:

kenorb
fuente
1
eso funciona maravillosamente simplemente :-)
Alejandro Moreno
1
¡Gran respuesta! ¡Te mereces más votos a favor!
Lautaro Rosales
1
Incluso podría combinar los dos, si se siente juguetón: drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = (SELECT vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name')"
Kirkland
2

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.

Bojan Zivanovic
fuente
2

Para eliminar todos los términos de taxonomía dentro de un vocabulario en Drupal 7, use la taxonomy_term_deletefunció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

rjb
fuente
gracias por los términos de generación drush porque explotaba cuando se usaba desde la interfaz de usuario
GiorgosK
1

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:

  1. Habilitar esos módulos, por supuesto.
  2. Habilite la vista llamada "Administración: términos de taxonomía"
  3. Agregue una columna en la vista llamada "Operaciones masivas: término de taxonomía"
  4. ENJUAGUE LOS CACHES - luego vaya a Admin> Estructura> Taxonomía> Vocab específico

Vistas Operaciones masivas y vistas de administrador

Duncanmoo
fuente
1

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);
}
Víspera de felix
fuente
0

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.

TheodorosPloumis
fuente
0

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);}}'
Screenack
fuente
0

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í.

ttamniwdoog
fuente