В процессе работы с WordPress часто накапливаются термины таксономий (категории, метки и пользовательские таксономии), которые уже не используются и занимают лишнее место в базе данных. Это может негативно влиять на производительность сайта и усложнять администрирование. В этой статье мы разберём, как найти и удалить такие устаревшие термины с помощью кода и плагинов, а также автоматизировать этот процесс.
Почему важно удалять неиспользуемые термины таксономий
При создании и редактировании публикаций в WordPress вы можете добавлять категории, теги и пользовательские таксономии. Со временем часть из них перестаёт использоваться, но остаётся в базе данных. Это приводит к следующим проблемам:
- Увеличение размера базы данных и её замедление;
- Загромождение административной панели и затруднение навигации по таксономиям;
- Потенциальные конфликты с плагинами и темами при обработке таксономий;
- Визуальный беспорядок в списках категорий и тегов на сайте.
Удаление неиспользуемых терминов позволяет поддерживать чистоту данных, ускорить работу сайта и улучшить UX для администраторов.
Как найти неиспользуемые термины таксономий
Термин считается неиспользуемым, если он не присвоен ни к одному посту или другому объекту. В WordPress у каждого термина есть поле count, которое отражает количество привязанных к нему записей.
Можно проверить список терминов с нулевым count и удалить их вручную через админку, но это неудобно при большом количестве.
Поэтому проще использовать SQL-запрос или код на PHP для поиска таких терминов.
Пример SQL-запроса для поиска неиспользуемых терминов категории:
SELECT * FROM wp_terms AS t
JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id
WHERE tt.taxonomy = 'category' AND tt.count = 0;
Аналогично можно менять taxonomy на нужную таксономию.
Удаление неиспользуемых терминов через код
Для автоматизации процесса удаления терминов с count = 0 можно написать функцию и запустить её, например, через файл темы или плагин.
Пример функции wpupdate_delete_unused_terms()
function wpupdate_delete_unused_terms( $taxonomy = 'category' ) {
$terms = get_terms(
array(
'taxonomy' => $taxonomy,
'hide_empty' => true,
'fields' => 'ids'
)
);
$all_terms = get_terms(
array(
'taxonomy' => $taxonomy,
'hide_empty' => false,
'fields' => 'ids'
)
);
$unused_terms = array_diff( $all_terms, $terms );
foreach ( $unused_terms as $term_id ) {
wp_delete_term( $term_id, $taxonomy );
}
return count($unused_terms);
}
// Пример вызова:
$deleted = wpupdate_delete_unused_terms('post_tag');
echo "Удалено неиспользуемых тегов: " . $deleted;
Данная функция:
- Получает список всех терминов таксономии;
- Получает список терминов, у которых есть записи (hide_empty = true);
- Определяет разницу — неиспользуемые термины;
- Удаляет их функцией
wp_delete_term().
Автоматизация удаления неиспользуемых терминов с помощью плагинов
Если не хочется работать с кодом, можно использовать плагины для очистки базы данных и таксономий, например:
- Clearfy Pro — содержит функции для оптимизации базы и удаления мусора, в том числе неиспользуемых терминов;
- Term Management Tools — помогает управлять и удалять термины;
- WP-Optimize — комплексная очистка базы данных, включая таксономии.
Применение плагинов удобно для регулярного обслуживания сайта без вмешательства в код.
Особенности и предосторожности при удалении терминов
Перед удалением терминов обязательно создайте резервную копию базы данных. Иногда термины могут быть использованы в метаполях, кастомных запросах или сторонних плагинах, поэтому их удаление может привести к ошибкам.
Если термин используется в пользовательских типах записей или таксономиях, проверьте, что у этих объектов нет связанных записей.
Не удаляйте термины системных таксономий без понимания последствий, например, стандартных категорий или тегов, если они используются по умолчанию.
Расширение: как вывести список неиспользуемых терминов на странице админки
Для удобства можно добавить страницу в админ-панель, где будут перечислены все термины с count=0 и кнопка для их удаления.
Пример кода для добавления страницы и вывода терминов:
add_action('admin_menu', function() {
add_submenu_page(
'tools.php',
'Удаление неиспользуемых терминов',
'Удаление терминов',
'manage_options',
'wpupdate-delete-unused-terms',
'wpupdate_render_unused_terms_page'
);
});
function wpupdate_render_unused_terms_page() {
if ( isset($_POST['wpupdate_delete_terms']) ) {
check_admin_referer('wpupdate_delete_terms_action');
$deleted = wpupdate_delete_unused_terms('category');
echo '<div class="updated notice"><p>Удалено ' . $deleted . ' неиспользуемых терминов категории.</p></div>';
}
$unused_terms = get_terms(array(
'taxonomy' => 'category',
'hide_empty' => false,
'fields' => 'all'
));
$unused_terms = array_filter($unused_terms, fn($term) => $term->count === 0);
echo '<h1>Неиспользуемые термины категории</h1>';
if (empty($unused_terms)) {
echo '<p>Не найдено неиспользуемых терминов.</p>';
return;
}
echo '<form method="post">';
wp_nonce_field('wpupdate_delete_terms_action');
echo '<table class="wp-list-table widefat fixed striped">';
echo '<thead><tr><th>ID</th><th>Название</th><th>Slug</th></tr></thead><tbody>';
foreach ($unused_terms as $term) {
echo '<tr><td>' . esc_html($term->term_id) . '</td><td>' . esc_html($term->name) . '</td><td>' . esc_html($term->slug) . '</td></tr>';
}
echo '</tbody></table>';
echo '<p><input type="submit" name="wpupdate_delete_terms" class="button button-primary" value="Удалить все неиспользуемые термины"></p>';
echo '</form>';
}
Эта страница выводит список неиспользуемых терминов категории и позволяет одним кликом очистить их.