Wie lösche ich alle Begriffe in einem Vokabular mit drush?

7

Wie hier berichtet, habe ich große Probleme mit großen Vokabeln in Drupal 7. Jetzt möchte ich die großen Vokabulare leeren, aber ich kann das nicht über die Admin-Oberfläche tun, da der Speicher knapp wird und es daher nicht geladen werden kann Mehr.

Wie kann ich mit drushMySQL alle Begriffe eines Vokabulars aus der Befehlszeile löschen ?

Ich weiß, ich könnte so etwas tun:

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

Aber was müsste ich sonst noch löschen?

user5950
quelle
Sie möchten einen Wortschatz alleine entfernen? oder ein Wortschatz und seine Gegenstände?
Aboodred1
@ Aboodred1 nur seine Elemente, aber zusammen mit allem, was zu diesen Elementen gehört, als Verwendung in Feldern usw.
user5950
Führen Sie diese Abfrage nicht aus. Es werden schlimme Dinge passieren.
mpdonadio
@MPD Ok als, aber wie kann ich diese Begriffe löschen? Dies muss irgendwie möglich sein.
user5950

Antworten:

6

Ungetestet; Verwendung für Inspiration und Test:

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

Fügen Sie dies in eine eigene Datei ein und führen Sie es als aus

drush -u 1 scr nuke_vid_18.php

Führen Sie es weiter aus, bis nichts mehr als gelöscht angezeigt wird. Das array_sliceist da, um die Dinge einzuschränken, damit Ihnen nicht der Speicher ausgeht. Sie können möglicherweise Speicherplatz sparen, indem Sie direkt abfragen. Dies ist jedoch taxonomy_get_tree()nicht besonders ineffizient, solange Sie keine vollständigen Ladevorgänge ausführen.

Sichern Sie Ihre Datenbank drush sql-dumpvorsichtshalber, bevor Sie so etwas tun.

mpdonadio
quelle
5

Ich habe diese Module: Drush und Devel Verwenden Sie den Befehl generate-Terms, um alle Begriffe der Taxonomie auszuschließen:

Drush Generate-Terms you_vocabulary_name 0 --kill

Ändern Sie Ihren Wortschatznamen in den Namen des Wortschatzes, für den Sie Begriffe löschen möchten

Adonai Diófanes
quelle
ganz einfache Lösung. Vielen Dank. warum der --kill?
xaa
2

Sie können den folgenden Befehl verwenden:

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

Wobei 123 Ihre Vokabular-ID ist, die Sie ändern sollten.

Wenn es nicht funktioniert, stellen Sie sicher, dass Sie Ihren Cache leeren (z. B. zwischengespeichert).

Sie können vidIhren Wortschatznamen mit dem folgenden Befehl abrufen:

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

Siehe auch:

Kenorb
quelle
2

Sie können auch das Modul https://www.drupal.org/project/taxonomy_multidelete_terms verwenden , um Taxonomiebegriffe zu löschen.

Mit diesem Modul können mehrere Begriffe gleichzeitig gelöscht werden. Sie müssen Begriffe auswählen und auf die Schaltfläche Löschen klicken. Alle ausgewählten Begriffe werden gelöscht. Sie können auch alle Begriffe gleichzeitig löschen.

Jeetendra Kumar
quelle
Hallo und willkommen bei Drupal Answers :) Wenn Sie sich auf ein Modul beziehen, können Sie bitte eine Zusammenfassung oder Beschreibung von der Modulseite hinzufügen? Dies gibt dem OP und anderen Personen einen besseren Hinweis darauf, wohin Sie verlinken. Vielen Dank!
Neograph734
1

Neben @mpdonadio Code, habe ich nur noch das Snippet zu Last vid durch den Namen des Wortschatzes. Ich hoffe, es könnte jemandem helfen, Zeit zu sparen.

$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);
   }
}
eine Lampe
quelle
0

Sie können einen Drush-Befehl mit dem Namen erstellen vocabulary-clean. Erstellen Sie ein Modul mit dem Namen drush_taxonomy, geben Sie in die drush_taxonomy.drush.incDatei diesen Code ein:

<?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."));
  }
}

Installieren Sie das Modul, führen Sie es aus drush cc drush, um den Drush-Cache zu löschen, und verwenden Sie den folgenden Befehl:

drush vc tags

oder

drush vocabulary-clean tags

Wenn Sie dem Befehl einen weiteren Alias ​​hinzufügen möchten, fügen Sie dem Aliase-Array folgende Elemente hinzu:

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

Und Sie können diese Befehle verwenden:

drush vc tags
drush voc-clean tags
drush clean tags

Die Ausgabe wird immer sein:

Vocabularies cleaned:
tags
Adrian Cid Almaguer
quelle
@ user5950 hast du meine antwort ausprobiert?
Adrian Cid Almaguer
0

Angenommen, die Entity-API ist installiert, können wir entity_delete_multiple verwenden, was schneller sein sollte, als jedes Mal eine zu löschen.

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);
}
Clemens Tolboom
quelle
0

Heute ist dies auch mit der Drupal-Konsole einfach. Beispiel: Löschen Sie alle Begriffe des Vokabulars "Tags"

Drupal-Taxonomie: Begriff: Tags löschen

CA Vuyk
quelle