Wie lösche ich Vokabeln programmgesteuert?

9

Ich möchte alle Begriffe aus einem Vokabular entfernen, aber das Vokabular selbst nicht löschen.

Ich kann es in der Datenbank tun, aber ich benutze lieber die API, wenn sie in D8 verfügbar ist.

$existingTerms = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree('mycustomvocab');
foreach ($existingTerms as $existingTerm) {
  // Delete vocabulary term *** This function is not available in D8 ***
  taxonomy_term_delete($existingTerm->tid);

  // Delete vocabulary - *** Not what is required ***
  /*
  $vocab = Vocabulary::load($existingTerm->vid);
  if (!is_null($vocab)) {
    $vocab->delete();
  }
  */
}

So mache ich es im Moment, bis ich eine bessere Lösung finde

db_query("DELETE FROM {taxonomy_term_hierarchy} WHERE `tid` IN (SELECT tid FROM {taxonomy_term_data} WHERE `vid` = :ctype)", array(':ctype' => 'mycustomvocab'));  
db_query("DELETE FROM {taxonomy_term_field_data} WHERE `vid` = :ctype", array(':ctype' => 'mycustomvocab'));
db_query("DELETE FROM {taxonomy_term_data} WHERE `vid` = :ctype", array(':ctype' => 'mycustomvocab'));
Jason Pascoe
quelle

Antworten:

18
  $tids = \Drupal::entityQuery('taxonomy_term')
    ->condition('vid', 'mycustomvocab')
    ->execute();

  $controller = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
  $entities = $controller->loadMultiple($tids);
  $controller->delete($entities);
Jason Pascoe
quelle
1

* Wenn Sie Zugriff auf Drupal Shell haben, führen Sie die folgenden Befehle aus: drupal shell

* Kopieren Sie anschließend die folgenden Elemente und fügen Sie sie ein

function truncate_vocab($vid){
    $tids = \Drupal::entityQuery("taxonomy_term")->condition("vid",$vid)->execute();
    $controller = \Drupal::entityManager()->getStorage('taxonomy_term');
    $entites = $controller->loadMultiple($tids);
    $controller->delete($entites);
}
$vocabs = taxonomy_vocabulary_get_names();
foreach($vocabs as $vid){
   truncate_vocab($vid);
}

Ich werde versuchen, es in Zukunft zu einem Drupal Shell-Befehl zu machen.

amjad1233
quelle
1

Nur ein anderer Ansatz zum individuellen Löschen des Taxonomiebegriffs, der in einigen Fällen nützlich ist:

// Example to load and delete a taxonomy term
$tid = 12;
if ($term = \Drupal\taxonomy\Entity\Term::load($tid)) {
  // Delete the term itself
  $term->delete();
}
David Thomas
quelle