¿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);
}

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.


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:


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.


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


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


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);
}

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.


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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.