Как удалить все термины из словаря (массовое удаление)?

Ответы:

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 + Click на другой флажок в той же группе, все флажки между этими двумя будут выбраны / не выбраны.
Елин Й.
26

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

  1. Включить модули Devel и Devel Generate
  2. Перейти к разработке> Создать условия
  3. Выберите словарь, из которого вы хотите удалить термины
  4. Введите «0» для количества условий для создания
  5. Установите флажок «Удалить существующие термины перед созданием новых»
  6. Нажмите Отправить

Вуаля - пустой словарный запас, в остальном нетронутый.

техасский-Bronius
источник
Модуль называется:
Devel
6

Вы можете использовать следующую команду:

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

Если это не работает, убедитесь, что вы очистили свой кеш (например, memcached).

Или быстрее, используя следующий грязный 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'"

Смотрите также:

kenorb
источник
1
это прекрасно работает просто :-)
Алехандро Морено
1
Отличный ответ! Вы заслуживаете больше голосов!
Лаутаро Росалес,
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

rjb
источник
спасибо за генеративные термины drush, потому что они взрывались при использовании из пользовательского интерфейса
GiorgosK
1

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

Что вам нужно сделать, это следующее:

  1. Включить эти модули, конечно,
  2. Включить представление под названием «Администрирование: условия таксономии»
  3. Добавьте столбец в представление «Массовые операции: термин таксономии».
  4. FLUSH CACHES - затем перейдите в Admin> Структура> Таксономия> Определенный Vocab

Представления Массовые операции и Представления администратора

Duncanmoo
источник
1

Я только что написал сообщение в блоге о том, как добавить кнопку для удаления всех терминов таксономии здесь .

По существу:

Для этого я использую плагин jQuery Easy Confirm Dialog . Сначала загрузите библиотеку отсюда и поместите ее в папку «js themes».

Затем мы можем добавить кнопку «Удалить все условия» с небольшим кодом в пользовательском модуле:

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

Просто для завершения ответов есть модуль, который делает именно это. Это модуль taxonomy_delete_all_terms . Я использовал это, и это работает.

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

TheodorosPloumis
источник
0

Мой ответ тангенциально связан с исходным вопросом. Основываясь на ответе Кенорба , если вы хотите очистить ВСЕ словари на своем сайте, вы можете выполнить следующее:

drush -v eval '$vocabularies = taxonomy_get_vocabularies(); foreach($vocabularies as $vocabulary) { foreach(taxonomy_get_tree($vocabulary->vid) as $term) { taxonomy_term_delete($term->tid);}}'
Screenack
источник
0

Как сказал @texas_bronius, если у вас включена функция генерации devel, вы можете использовать это, но сделав еще один шаг вперед, если у вас также установлен drush, я использую эту команду:

условия генерации drush [vocabulary_machine_name] 0 --kill

И просто замените [vocabulary_machine_name] на имя машины вашего словаря. «0» указывает, сколько терминов нужно добавить, а «--kill» удаляет те, которые в данный момент находятся там.

ttamniwdoog
источник