回答:
分類法マネージャーには一括削除機能があります。ボキャブラリーのすべての用語を選択して、[削除]ボタンをクリックするだけです。
あなたがそれをしたいなら、以下のようなコードを使用してそれを助けたいでしょう:
$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モジュールを利用します。語彙のすべての用語を削除する場合:
出来上がり-空の語彙、それ以外は手つかず。
次のコマンドを使用できます。
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 generate-terms TAXONOMY_MACHINE_NAME 0 --kill
*これは、必要に応じて実行できるDevel Generateモジュールが有効になっていることを前提としています。
$ drush en -y devel && drush en -y devel_generate
ここにすべての分類用語を削除するボタンを追加する方法に関するブログ投稿を書いたところです。
基本的に:
これには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="/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;
}
}
次に、用語を削除するための関数へのパスを定義する必要があります。
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もインストールされている場合は、次のコマンドを使用します。
drush generate-terms [vocabulary_machine_name] 0 --kill
そして[vocabulary_machine_name]をあなたの語彙のマシン名に置き換えてください。「0」は追加する用語の数を示し、「-kill」は現在そこにある用語を削除します。