У меня большой словарный запас, и административные представления пока не работают для таксономии. Менеджер по таксономии также не делает этого. Есть ли варианты массового удаления?
У меня большой словарный запас, и административные представления пока не работают для таксономии. Менеджер по таксономии также не делает этого. Есть ли варианты массового удаления?
Ответы:
Менеджер таксономии имеет функцию массового удаления, просто выберите все термины в вашем словаре и нажмите кнопку «Удалить»:
Если вы хотите сделать это с помощью кода, должно помочь что-то вроде следующего:
$vocabulary = taxonomy_vocabulary_machine_name_load('my_custom_vocabulary');
foreach (taxonomy_get_tree($vocabulary->vid) as $term) {
taxonomy_term_delete($term->tid);
}
Любимый метод массового удаления контента по типу контента, словарю таксономии и т. Д. Использует модуль http://drupal.org/project/devel . Для удаления всех терминов из словаря:
Вуаля - пустой словарный запас, в остальном нетронутый.
Вы можете использовать следующую команду:
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'"
Смотрите также:
drush sqlq "DELETE FROM taxonomy_term_data WHERE vid = (SELECT vid FROM taxonomy_vocabulary WHERE name = 'vocabulary_name')"
Представления администратора просто предоставляют предварительно настроенные представления VBO. Сам VBO прекрасно работает с терминами (или любым другим типом сущности). Установите VBO самостоятельно и создайте необходимое представление, а затем используйте VBO для удаления терминов.
Чтобы массово удалить все термины таксономии в словаре в 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
Я бы порекомендовал использовать административные представления с VBO, чтобы получить представление для замены отображения терминов таксономии по умолчанию.
Что вам нужно сделать, это следующее:
Я только что написал сообщение в блоге о том, как добавить кнопку для удаления всех терминов таксономии здесь .
По существу:
Для этого я использую плагин 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);
}
Просто для завершения ответов есть модуль, который делает именно это. Это модуль taxonomy_delete_all_terms . Я использовал это, и это работает.
Для сайтов с очень большими словарями таксономии удаление словарей может стать невозможным из-за истечения срока ожидания запроса на удаление. Когда это происходит до завершения транзакции удаления, транзакция откатывается, и никакие условия вообще не удаляются.
Мой ответ тангенциально связан с исходным вопросом. Основываясь на ответе Кенорба , если вы хотите очистить ВСЕ словари на своем сайте, вы можете выполнить следующее:
drush -v eval '$vocabularies = taxonomy_get_vocabularies(); foreach($vocabularies as $vocabulary) { foreach(taxonomy_get_tree($vocabulary->vid) as $term) { taxonomy_term_delete($term->tid);}}'
Как сказал @texas_bronius, если у вас включена функция генерации devel, вы можете использовать это, но сделав еще один шаг вперед, если у вас также установлен drush, я использую эту команду:
условия генерации drush [vocabulary_machine_name] 0 --kill
И просто замените [vocabulary_machine_name] на имя машины вашего словаря. «0» указывает, сколько терминов нужно добавить, а «--kill» удаляет те, которые в данный момент находятся там.