Como excluir todos os termos de um vocabulário (exclusão em massa)?

Respostas:

15

O gerenciador de taxonomia tem a funcionalidade de exclusão em massa, basta selecionar todos os termos do seu vocabulário e clicar no botão 'Excluir':

insira a descrição da imagem aqui

Se você quiser fazer isso usando código, algo como o seguinte deve ajudar:

$vocabulary = taxonomy_vocabulary_machine_name_load('my_custom_vocabulary');
foreach (taxonomy_get_tree($vocabulary->vid) as $term) {
  taxonomy_term_delete($term->tid);
}
Clive
fonte
Ok, obrigado, embora o Taxo Manager não tenha uma opção de seleção em massa e, se você tiver centenas de termos, deverá verificar cada um por um.
Giorgio79
Sim, isso é meio chato, na verdade, eu poderia fazer um pedido de recurso para isso
Clive
2
Obrigado por adicionar os métodos de interface do usuário e de código! Sempre muito útil +1
Matt Fletcher
5
@ giorgio79 os navegadores mais modernos suportam Shift + Clique nas caixas de seleção. Se você clicar em uma caixa de seleção, Shift + clique em outra caixa de seleção no mesmo grupo, todas as caixas de seleção entre esses 2 serão marcadas / desmarcadas.
Елин Й.
26

Um método favorito de excluir conteúdo em massa por tipo de conteúdo, vocabulário de taxonomia, etc. utiliza o módulo http://drupal.org/project/devel . Para excluir todos os termos de um vocabulário:

  1. Ativar os módulos Devel e Devel Generate
  2. Vá para Desenvolvimento> Gerar termos
  3. Selecione o vocabulário do qual deseja excluir os termos.
  4. Digite "0" para o número de termos a serem gerados
  5. Marque "Excluir termos existentes antes de gerar novos"
  6. Clique em Enviar

Voila-- vocabulário vazio, caso contrário intocado.

texas-bronius
fonte
O módulo é chamado: Devel Generate
kenorb 28/13
6

Você pode usar o seguinte comando:

drush -v eval 'foreach(taxonomy_get_tree(123) as $term) { taxonomy_term_delete($term->tid); }'

Se não funcionar, limpe o cache (por exemplo, memcached).

Ou de maneira mais rápida, usando a seguinte consulta SQL suja:

drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = 123"

Onde 123 é o seu ID de vocabulário que você deve alterar.

Você pode obter vido nome do seu vocabulário usando o seguinte comando:

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

Veja também:

kenorb
fonte
1
que funciona lindamente simplesmente :-)
Alejandro Moreno
1
Ótima resposta! Você merece mais votos!
Lautaro Rosales
1
Você pode até combinar os dois, se estiver se sentindo brincalhão: drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = (SELECT vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name')"
Kirkland
2

As visualizações de administrador fornecem apenas visualizações VBO pré-configuradas. O VBO em si funciona bem com os termos (ou qualquer outro tipo de entidade). Instale o VBO você mesmo e crie a exibição desejada, depois use o VBO para excluir os termos.

Bojan Zivanovic
fonte
2

Para excluir em massa todos os termos de taxonomia dentro de um vocabulário no Drupal 7, use a taxonomy_term_deletefunção fazendo um loop por todos os termos.

Considere o seguinte exemplo:

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

Ainda mais fácil, se você tiver o Drush e o módulo Devel instalado, poderá usar o seguinte comando para excluir em massa todos os termos em uma taxonomia * no conforto do seu shell:

$ drush gerar termos TAXONOMY_MACHINE_NAME 0 --kill

* Isso pressupõe que você tenha o módulo Devel Generate ativado, o que pode ser feito se necessário:

$ drush en -y devel && drush en -y devel_generate

rjb
fonte
obrigado pela Drush gerar-termos, porque foi explodir quando usado a partir da interface do usuário
GiorgosK
1

Eu recomendaria o uso de Admin Views com VBO para obter uma visualização para substituir a exibição padrão dos termos de taxonomia.

O que você precisa fazer é o seguinte:

  1. Ative esses módulos, é claro
  2. Ative a visualização chamada "Administração: termos de taxonomia"
  3. Adicione uma coluna à exibição chamada "Operações em massa: termo de taxonomia"
  4. FLUSH CACHES - vá para Admin> Estrutura> Taxonomia> Vocab específico

Exibições de operações em massa e exibições de administrador

Duncanmoo
fonte
1

Acabei de escrever uma postagem no blog sobre como adicionar um botão para excluir todos os termos de taxonomia aqui .

Essencialmente:

Estou usando o plugin jQuery Easy Confirm Dialog para isso. Primeiro baixe a biblioteca daqui e coloque-a na pasta js de temas.

Em seguida, podemos adicionar um botão "Excluir todos os termos" com um pequeno código em um 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;
    }
}

Agora precisamos definir o caminho para nossa função para excluir os termos:

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, finalmente, adicione a funcionalidade para excluir os termos:

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);
}
Felix Eve
fonte
0

Apenas para completar as respostas, há um módulo fazendo exatamente isso. É o módulo taxonomy_delete_all_terms . Eu usei e funciona.

Para sites com vocabulários de taxonomia muito grandes, a exclusão de vocabulários pode se tornar impossível devido ao tempo limite da solicitação de exclusão do termo. Quando isso acontece antes que a transação de exclusão seja concluída, a transação é revertida, fazendo com que nenhum termo seja excluído.

TheodorosPloumis
fonte
0

Minha resposta está relacionada tangencialmente à pergunta original. Com base na resposta do kenorb , se você deseja limpar TODOS os vocabulários do seu site, execute o seguinte:

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
fonte
0

Como foi dito por @texas_bronius, se você tiver o devel generate ativado, você pode usá-lo, mas dando um passo adiante, se você também tiver o drush instalado, eu uso este comando:

drush generate-terms [vocabulary_machine_name] 0 --kill

E basta substituir [vocabulary_machine_name] pelo nome da máquina do seu vocabulário. O "0" é para quantos termos adicionar e "--kill" é para remover os que estão atualmente lá.

ttamniwdoog
fonte