如何从词汇表中删除所有术语(批量删除)?


Answers:


15

分类管理器确实具有批量删除功能,只需选择词汇表中的所有术语并单击“删除”按钮即可:

在此处输入图片说明

如果要使用代码来完成此操作,则应使用以下内容:

$vocabulary = taxonomy_vocabulary_machine_name_load('my_custom_vocabulary');
foreach (taxonomy_get_tree($vocabulary->vid) as $term) {
  taxonomy_term_delete($term->tid);
}

好的,谢谢,尽管Taxo Manager没有批量选择选项,并且如果您有数百个术语,则必须逐一检查。
giorgio79'7

是的,实际上这很烦人,我可能会为此提出功能要求
Clive

2
感谢您同时添加UI和代码方法!总是非常有用+1
Matt Fletcher 2013年

5
@ giorgio79大多数现代浏览器都支持Shift +单击复选框。如果您单击一个复选框,然后按住Shift键并单击同一组中的另一个复选框,则这2个之间的所有复选框都将被选中/取消选中。
ЕлинЙ.

26

根据内容类型,分类词汇等批量删除内容的一种常用方法是使用http://drupal.org/project/devel模块。要删除词汇表中的所有术语:

  1. 启用Devel和Devel生成模块
  2. 转到开发>生成条款
  3. 选择要从中删除术语的词汇
  4. 输入“ 0”作为要生成的术语数
  5. 选中“在生成新条款之前删除现有条款”
  6. 点击提交

Voila-空词汇表,否则未更改。


模块名为:Devel Generate
kenorb

6

您可以使用以下命令:

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

如果它不起作用,请确保清除缓存(例如memcached)。

或使用以下脏SQL查询的更快方法:

drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = 123"

其中123是您应更改的词汇表ID。

您可以vid通过以下命令获取词汇名称:

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

也可以看看:


1
的效果很简单:-)
Alejandro Moreno

1
好答案!您应得到更多的支持!
Lautaro Rosales

1
如果您感到生气,您甚至可以将两者结合起来:drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = (SELECT vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name')"
Kirkland


2

要在Drupal 7中批量删除词汇表中的所有分类法术语,请使用该taxonomy_term_delete函数通过遍历所有术语。

考虑以下示例:

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

更简单的是,如果安装了DrushDevel模块,则可以使用以下命令从外壳舒适的角度批量删除分类法*中的所有术语:

$ drush生成项TAXONOMY_MACHINE_NAME 0 --kill

*这假设您已启用Devel Generate模块,可以在需要时完成:

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


感谢您的催促生成术语,因为它在用户界面中使用时会炸毁
GiorgosK,2017年

1

我建议将Admin ViewsVBO一起使用,以获取一个视图来替换分类法术语的默认显示。

您需要执行以下操作:

  1. 当然启用这些模块
  2. 启用名为“管理:分类术语”的视图
  3. 在名为“批量操作:分类术语”的视图中添加一列
  4. 刷新缓存-然后转到“管理”>“结构”>“分类法”>“特定词汇表”

视图批量操作和管理员视图


1

我刚刚写了一篇博客文章,介绍如何在此处添加按钮以删除所有分类法术语

实质上:

我为此使用了jQuery Easy Confirm Dialog插件。首先从这里下载该库,并将其放在您的主题js文件夹中。

然后,我们可以在自定义模块中添加带有一些代码的“删除所有条款”按钮:

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="https://drupal.stackexchange.com/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;
    }
}

现在我们需要定义函数的路径以删除这些术语:

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

最后添加功能以实际删除条款:

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

只是为了完成答案,有一个模块正是在这样做。它是taxonomy_delete_all_terms模块。我已经使用过了,而且效果很好。

对于分类词汇量非常大的站点,由于术语删除请求超时,因此删除词汇表可能变得不可能。在删除事务完成之前发生这种情况时,该事务将回滚,根本不会删除任何条款。


0

我的回答与原始问题有切线相关。基于kenorb的答案,如果您希望清除站点中的所有词汇,则可以运行以下命令:

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

就像@texas_bronius所说的,如果启用了devel generate,则可以使用它,但可以更进一步,如果还安装了drush,则可以使用以下命令:

催促生成项[vocabulary_machine_name] 0 --kill

只需将[vocabulary_machine_name]替换为词汇表的机器名即可。“ 0”表示要添加的术语数量,“-kill”表示删除其中的术语。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.