web-dev-qa-db-ja.com

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

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

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

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

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

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

7
user5950

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

_<?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_を使用してデータベースをバックアップしてください。

6
mpdonadio

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

drush generate-terms you_vocabulary_name 0 --kill

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

5

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

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
kenorb

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

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

2
Jeetendra Kumar

@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);
   }
}
1
alamp

今日では、Drupalコンソールを使用してこれを行うことも簡単です。例:「タグ」ボキャブラリーのすべての用語を削除します

drupal分類:term:タグの削除

0
C.A. Vuyk

vocabulary-cleanという名前のDrushコマンドを作成できます。 drush_taxonomyという名前のモジュールを作成し、drush_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
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
Clemens Tolboom