Answers:
分类管理器确实具有批量删除功能,只需选择词汇表中的所有术语并单击“删除”按钮即可:
如果要使用代码来完成此操作,则应使用以下内容:
$vocabulary = taxonomy_vocabulary_machine_name_load('my_custom_vocabulary');
foreach (taxonomy_get_tree($vocabulary->vid) as $term) {
taxonomy_term_delete($term->tid);
}
根据内容类型,分类词汇等批量删除内容的一种常用方法是使用http://drupal.org/project/devel模块。要删除词汇表中的所有术语:
Voila-空词汇表,否则未更改。
您可以使用以下命令:
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'"
也可以看看:
drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = (SELECT vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name')"
管理员视图仅提供预配置的VBO视图。VBO本身可以很好地处理术语(或任何其他实体类型),请自己安装VBO并创建所需的视图,然后使用VBO删除术语。
要在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);
}
}
更简单的是,如果安装了Drush和Devel模块,则可以使用以下命令从外壳舒适的角度批量删除分类法*中的所有术语:
$ drush生成项TAXONOMY_MACHINE_NAME 0 --kill
*这假设您已启用Devel Generate模块,可以在需要时完成:
$ drush en -y devel && drush en -y devel_generate
我建议将Admin Views与VBO一起使用,以获取一个视图来替换分类法术语的默认显示。
您需要执行以下操作:
我刚刚写了一篇博客文章,介绍如何在此处添加按钮以删除所有分类法术语。
实质上:
我为此使用了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);
}
只是为了完成答案,有一个模块正是在这样做。它是taxonomy_delete_all_terms模块。我已经使用过了,而且效果很好。
对于分类词汇量非常大的站点,由于术语删除请求超时,因此删除词汇表可能变得不可能。在删除事务完成之前发生这种情况时,该事务将回滚,根本不会删除任何条款。
就像@texas_bronius所说的,如果启用了devel generate,则可以使用它,但可以更进一步,如果还安装了drush,则可以使用以下命令:
催促生成项[vocabulary_machine_name] 0 --kill
只需将[vocabulary_machine_name]替换为词汇表的机器名即可。“ 0”表示要添加的术语数量,“-kill”表示删除其中的术语。