У мене є великий словниковий запас, а адміністраторські погляди ще не працюють для систематики. Менеджер з таксономії також не робить цього. Чи є опції для масового видалення терміна?
У мене є великий словниковий запас, а адміністраторські погляди ще не працюють для систематики. Менеджер з таксономії також не робить цього. Чи є опції для масового видалення терміна?
Відповіді:
Менеджер таксономії має функціональне групове видалення, просто виберіть усі терміни у своєму словнику та натисніть кнопку "Видалити":
Якщо ви хочете зробити це за допомогою коду, це має допомогти:
$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); }'
Якщо це не працює, переконайтеся, що очистите кеш (наприклад, запам'ятоване).
Або більш швидкий спосіб, використовуючи наступний брудний 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 теми.
Потім ми можемо додати кнопку "Видалити всі умови" з невеликим кодом у спеціальному модулі:
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);
}
Просто для завершення відповідей є модуль, що робить саме це. Це модуль таксономії_delete_all_terms . Я використовував це, і він працює.
Для сайтів з дуже великими лексиками таксономії видалення словникових запасів може стати неможливим через час закінчення запиту на видалення. Коли це відбувається до завершення транзакції видалення, транзакція відкочується назад, не спричиняючи жодного терміну видалення.
Моя відповідь дотично пов'язана з оригінальним запитанням. Спираючись на відповідь 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);}}'
Як було сказано @texas_bronius, якщо у вас активована генерація devel, ви можете використовувати це, але зробивши це ще на крок далі, якщо у вас також встановлено друку, я використовую цю команду:
drush generator-terms [vocabulary_machine_name] 0 - вбити
І просто замініть [vocabulary_machine_name] на машинну назву вашого словника. "0" - це кількість доданих термінів, а "--kill" - видалення тих, які зараз є там.