Eu tenho um vocabulário amplo e as visualizações de administrador ainda não funcionam para taxonomia. O Taxonomy Manager também não faz isso. Existem opções para exclusão de termos em massa?
Eu tenho um vocabulário amplo e as visualizações de administrador ainda não funcionam para taxonomia. O Taxonomy Manager também não faz isso. Existem opções para exclusão de termos em massa?
Respostas:
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':
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);
}
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:
Voila-- vocabulário vazio, caso contrário intocado.
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 vid
o nome do seu vocabulário usando o seguinte comando:
drush sqlq "SELECT name, vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name'"
Veja também:
drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = (SELECT vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name')"
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.
Para excluir em massa todos os termos de taxonomia dentro de um vocabulário no Drupal 7, use a taxonomy_term_delete
funçã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
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:
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);
}
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.
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);}}'
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á.