Як видалити всі терміни з лексики (групове видалення)?


Відповіді:


15

Менеджер таксономії має функціональне групове видалення, просто виберіть усі терміни у своєму словнику та натисніть кнопку "Видалити":

введіть тут опис зображення

Якщо ви хочете зробити це за допомогою коду, це має допомогти:

$vocabulary = taxonomy_vocabulary_machine_name_load('my_custom_vocabulary');
foreach (taxonomy_get_tree($vocabulary->vid) as $term) {
  taxonomy_term_delete($term->tid);
}

Добре дякую, хоча у Taxo Manager немає опції масового вибору, і якщо у вас є сотні термінів, вам доведеться перевіряти кожен по одному.
giorgio79

Так, насправді це дратує, я можу поставити для цього запит на особливості
Клайв

2
Дякуємо, що додали і інтерфейс користувача, і методи коду! Завжди дуже корисно +1
Метт Флетчер

5
@ giorgio79 більшість сучасних браузерів підтримують Shift + Клацніть на прапорці. Якщо ви натиснете прапорець, то Shift + Клацніть інший прапорець у тій самій групі, усі прапорці між цими 2 будуть вибрані / зняті без позначення.
Елін Й.

26

Улюблений метод масового видалення вмісту за типом вмісту, лексикою таксономії тощо використовує модуль http://drupal.org/project/devel . Для видалення всіх термінів з лексики:

  1. Увімкніть модулі Devel і Devel Generate
  2. Перейдіть до розділу Розробка> Створення термінів
  3. Виберіть словник, з якого потрібно видалити терміни
  4. Введіть "0", щоб створити кількість термінів
  5. Поставте прапорець "Видалити існуючі терміни, перш ніж створювати нові"
  6. Клацніть Надіслати

Вуала-- порожній словник, інакше недоторканий.


Модуль називається: Devel Generate
kenorb

6

Можна використовувати таку команду:

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

Якщо це не працює, переконайтеся, що очистите кеш (наприклад, запам'ятоване).

Або більш швидкий спосіб, використовуючи наступний брудний SQL-запит:

drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = 123"

Де 123 - ваш ідентичний словник, який слід змінити.

Отримати vidназву свого словника можна за допомогою наступної команди:

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

Дивись також:


1
це прекрасно працює просто :-)
Алехандро Морено

1
Чудова відповідь! Ви заслуговуєте на більше грошей!
Lautaro Rosales

1
Ви навіть можете поєднати ці два, якщо ви відчуваєте жартівливість: drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = (SELECT vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name')"
Кіркленд

2

Перегляди адміністраторів просто надають попередньо налаштовані представлення VBO. Сам VBO прекрасно працює з термінами (або будь-яким іншим типом сутності). Встановіть VBO самостійно та створіть потрібний вигляд, а потім використовуйте VBO для видалення термінів.


2

Для масового видалення всіх термінів таксономії в лексиці в 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 згенерувати умови TAXONOMY_MACHINE_NAME 0 - вбити

* Це передбачає, що у вас включений модуль Devel Generate, який можна зробити за потреби:

$ drush en -y devel && drush en -y devel_generate


спасибі за умови генерації барабану, оскільки він підірвався при використанні з інтерфейсу користувача
GiorgosK

1

Я рекомендую використати представлення адміністраторів з VBO, щоб отримати представлення для заміни відображення за замовчуванням термінів таксономії.

Що вам потрібно зробити, це:

  1. Увімкніть ці модулі, звичайно
  2. Увімкніть представлення під назвою "Адміністрація: терміни таксономії"
  3. Додайте стовпчик у подання під назвою "Масові операції: термін таксономії"
  4. ФЛЕШУЙТЕ КАШИ - потім перейдіть до Адміністратора> Структура> Таксономія> Специфічний Vocab

Перегляди масових операцій та переглядів адміністратора


1

Я щойно написав повідомлення в блозі про те, як додати кнопку, щоб видалити всі умови таксономії тут .

По суті:

Я використовую для цього плагін 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="https://drupal.stackexchange.com/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);
}

0

Просто для завершення відповідей є модуль, що робить саме це. Це модуль таксономії_delete_all_terms . Я використовував це, і він працює.

Для сайтів з дуже великими лексиками таксономії видалення словникових запасів може стати неможливим через час закінчення запиту на видалення. Коли це відбувається до завершення транзакції видалення, транзакція відкочується назад, не спричиняючи жодного терміну видалення.


0

Моя відповідь дотично пов'язана з оригінальним запитанням. Спираючись на відповідь kenorb , якщо ви хочете очистити ВСІ словники на своєму сайті, можете виконати наступне:

drush -v eval '$vocabularies = taxonomy_get_vocabularies(); foreach($vocabularies as $vocabulary) { foreach(taxonomy_get_tree($vocabulary->vid) as $term) { taxonomy_term_delete($term->tid);}}'

0

Як було сказано @texas_bronius, якщо у вас активована генерація devel, ви можете використовувати це, але зробивши це ще на крок далі, якщо у вас також встановлено друку, я використовую цю команду:

drush generator-terms [vocabulary_machine_name] 0 - вбити

І просто замініть [vocabulary_machine_name] на машинну назву вашого словника. "0" - це кількість доданих термінів, а "--kill" - видалення тих, які зараз є там.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.