Drushを使用して語彙のすべての用語を削除する方法は?


7

ここで報告されているように、Drupal 7の膨大な語彙に大きな問題があります。今、大きな語彙を空にしたいのですが、メモリが不足しているため、ロードできないため、管理インターフェイスを介してそれを実行できません。もっと。

drushMySQL を使用してコマンドラインから語彙のすべての用語を削除するにはどうすればよいですか?

私は知っています、私はそのようなことをすることができました:

DELETE FROM `database`.`taxonomy_term_data` WHERE  `taxonomy_term_data`.`vid` = 17

しかし、他に何を削除する必要がありますか?


一人で語彙を削除したいですか?または語彙とそのアイテム?
Aboodred1 2013年

@ Aboodred1はそのアイテムのみですが、フィールドでの使用など、そのアイテムに属するすべてのものと一緒に
user5950

そのクエリを実行しないでください。悪いことが起こります。
mpdonadio

@MPDわかりましたが、これらの用語を削除するにはどうすればよいですか?なんとかできるはずです。
user5950 2013年

回答:


6

未テスト。インスピレーションとテストに使用:

<?php

$vid = 17;

$tree = taxonomy_get_tree($vid);

if (count($tree) == 0) {
  print "Nothing to delete.\n";
}
else {
  $tree = array_slice($tree, 0, 1000);

  foreach ($tree as $term) {
    print 'Deleting tid ' . $term->tid . "\n";
    taxonomy_term_delete($term->tid);
  }
}

これを独自のファイルに入れ、次のように実行します

drush -u 1 scr nuke_vid_18.php

削除されたものが何も表示されなくなるまで実行し続けます。array_sliceあなたはメモリが不足しないよう制限事にあります。直接クエリを実行することでメモリを節約できる可能性がtaxonomy_get_tree()ありますが、全期間のロードを実行しない限り、それほど効率的ではありません。

drush sql-dumpこのようなことをする前に、念のためデータベースをバックアップしてください。


5

私はこれらのモジュールを持っています:DrushとDevel 分類のすべての用語を除外するには、generate-termsコマンドを使用します。

drush generate-terms you_vocabulary_name 0 --kill

your_vocabulary_nameを、用語を削除する必要がある語彙の名前に変更します


非常に簡単な解決策。ありがとう。なぜ--killですか?
xaa

2

次のコマンドを使用できます。

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

ここで、123は変更する必要がある語彙IDです。

動作しない場合は、キャッシュ(memcachedなど)を必ずクリアしてください。

vid次のコマンドで語彙名を取得できます。

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

以下も参照してください。


2

また、https://www.drupal.org/project/taxonomy_multidelete_termsモジュールを使用して、分類用語を削除することもできます

このモジュールを使用すると、一度に複数の用語を削除できます。用語を選択し、削除ボタンをクリックする必要があります。選択したすべての用語が削除されます。すべての用語を一度に削除することもできます。


こんにちは、Drupal Answersへようこそ:)モジュールを参照する場合、モジュールのページから概要または説明を含めていただけますか?これにより、OPや他の人々が、どこにリンクしているかがわかりやすくなります。ありがとう!
Neograph734 2017年

1

@mpdonadioコードに加えて、語彙の名前でvidをロードするスニペットを追加しました。誰かが時間を節約するのに役立つことを願っています。

$voca = "forums";
$vobj=taxonomy_vocabulary_machine_name_load("forums");
$vid = $vobj->vid;

$tree = taxonomy_get_tree($vid);

if (count($tree) == 0) {
    print "Nothing to delete.\n";
}
else {
   $tree = array_slice($tree, 0, 1000);

   foreach ($tree as $term) {
    print 'Deleting tid ' . $term->tid . "\n";
    taxonomy_term_delete($term->tid);
   }
}

0

という名前のDrushコマンドを作成できますvocabulary-clean。という名前のモジュールを作成しdrush_taxonomydrush_taxonomy.drush.incファイル内に次のコードを入力します。

<?php
/**
 * @file
 * Drush commands related to taxonomy.
 */

/**
* Implements hook_drush_command().
*/
function drush_taxonomy_drush_command() {
  $items['vocabulary-clean'] = array(
    'description' => dt("Delete all terms in a vocabulary."),
    'aliases' => array('vc'),
    'arguments' => array(
      'name' => dt('The vocabulary names to clean.'),
    ),
    'examples' => array(
      'drush vocabulary-clean tags' => dt('Delete all the terms in tags vocabulary'),
      'drush vocabulary-clean tags test' => dt('Delete all the terms in tags and test vocabularies'),

    ),
  );
  return $items;
}

/**
 * Callback for the vocabulary clean command.
 */
function drush_drush_taxonomy_vocabulary_clean() {
  $names = func_get_args();

  if (!empty($names)) {
    // Check for duplicate ids.
    $test_names = array_unique($names);
    if (count($test_names) != count($names)) {
      drush_set_error('DRUSH_VOCABULARY_CLEAN_ERROR', dt('You have duplicate vocabulary names.'));
      return;
    }
    //Searching the vocabularies in the site
    $vocabulary_in_db = array_column(taxonomy_get_vocabularies(), 'machine_name');
    $vocabulary_non_existent = array_diff($names, $vocabulary_in_db);
    $vocabulary_existent = array_diff($names, $vocabulary_non_existent);

    if(count($vocabulary_existent) == 0) {
      drush_set_error('DRUSH_VOCABULARY_CLEAN_ERROR', dt("The desired vocabularies to clean doesn't exists."));
      return;
    }

    if(count($vocabulary_non_existent)) {
      drush_print(dt("Non-existent vocabularies:"));
      drush_print(implode(' ', $vocabulary_non_existent));
    }

    foreach ($vocabulary_existent as $name) {
      $vid = taxonomy_vocabulary_machine_name_load($name)->vid;
      foreach(taxonomy_get_tree($vid) as $term) {
        taxonomy_term_delete($term->tid);
      }
    }

    drush_print(dt("Vocabularies cleaned:"));
    drush_print(implode(' ', $vocabulary_existent));
  }
  else {
    drush_set_error('DRUSH_VOCABULARY_CLEAN_ERROR', dt("You must enter at least one vocabulary name."));
  }
}

モジュールをインストールし、実行drush cc drushしてDrushキャッシュをクリアし、次のようなコマンドを使用します。

drush vc tags

または

drush vocabulary-clean tags

コマンドに別のエイリアスを追加する場合は、次のように要素をaliases配列に追加します。

'aliases' => array('vc', 'voc-clean', 'clean'),

そして、あなたはこのコマンドを使うことができます:

drush vc tags
drush voc-clean tags
drush clean tags

常に出力は次のようになります。

Vocabularies cleaned:
tags

@ user5950私の答えを試しましたか?
エイドリアンCid Almaguer

0

Entity APIがインストールされていると想定すると、entity_delete_multipleを使用できます。これは、毎回1つを削除するよりも高速です。

define("MY_VOCAB", "tags");

function _custom_zap_vocab() {
  $vocab = taxonomy_vocabulary_machine_name_load(MY_VOCAB);

  $tree = taxonomy_get_tree($vocab->vid);

  $tids = array_map(function($term){
    return $term->tid;
  }, $tree);

  entity_delete_multiple('taxonomy_term', $tids);
}

0

今日では、Drupalコンソールでこれを行うのも簡単です。例:「タグ」語彙のすべての用語を削除する

drupal分類:term:タグの削除

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.