В процессе работы с WordPress часто накапливаются термины таксономий (категории, метки, пользовательские таксономии), которые уже не используются ни в одной записи. Такие «мертвые» термины не влияют на функциональность сайта напрямую, но засоряют базу данных и усложняют администрирование. В этой статье мы подробно разберём, как программно найти и удалить неиспользуемые термины таксономий в WordPress, а также какие плагины могут помочь в этом.
Почему важно удалять неиспользуемые термины таксономий
Со временем количество терминов в таксономиях может значительно увеличиться. Некоторые из них перестают использоваться в записях, но остаются в базе данных. Это может привести к следующим проблемам:
- Увеличение размера базы данных и, как следствие, замедление запросов.
- Путаница при выборе категорий или меток в админке — список становится громоздким.
- Ошибки при построении навигации или фильтров, если код сайта не учитывает пустые термины.
Регулярная чистка таксономий помогает поддерживать сайт в порядке и улучшает производительность.
Поиск неиспользуемых терминов: теория и практика
Неиспользуемыми считаются термины, у которых count — количество связанных с ними записей — равно нулю. Однако иногда поле count может не обновляться корректно из-за ошибок в работе сайта или плагинов. Поэтому правильнее проверять не только это поле, но и фактически связанные записи.
Пример функции для проверки и удаления пустых терминов
Ниже приведён пример функции, которая удаляет все термины без связанных записей в указанной таксономии. Мы назовём её wpcource_delete_unused_terms:
function wpcource_delete_unused_terms($taxonomy = 'category') {
if (!taxonomy_exists($taxonomy)) {
return 'Таксономия не найдена';
}
// Получаем все термины таксономии
$terms = get_terms(array(
'taxonomy' => $taxonomy,
'hide_empty' => false,
));
$deleted_terms = 0;
foreach ($terms as $term) {
// Проверяем количество связанных записей
$term_count = intval($term->count);
// Дополнительная проверка через WP_Query на случай некорректного count
if ($term_count === 0) {
$query = new WP_Query(array(
'post_type' => 'any',
'tax_query' => array(
array(
'taxonomy' => $taxonomy,
'field' => 'term_id',
'terms' => $term->term_id,
'include_children' => false,
),
),
'posts_per_page' => 1,
'fields' => 'ids'
));
if (!$query->have_posts()) {
// Удаляем термин
wp_delete_term($term->term_id, $taxonomy);
$deleted_terms++;
}
}
}
return "Удалено терминов: {$deleted_terms}";
}
Эту функцию можно вызвать, например, через админский хук или wp-cli. Она удалит все пустые термины из указанной таксономии.
Удаление пустых терминов из нескольких таксономий
Если на сайте используются несколько пользовательских таксономий, имеет смысл автоматизировать очистку для всех сразу. Вот пример расширенной функции:
function wpcource_delete_unused_terms_all_taxonomies(array $taxonomies = array()) {
if (empty($taxonomies)) {
// По умолчанию очистка всех зарегистрированных таксономий кроме системных
$taxonomies = get_taxonomies(array(), 'names');
// Исключаем системные таксономии, например post_format
$exclude = array('post_format');
$taxonomies = array_diff($taxonomies, $exclude);
}
$total_deleted = 0;
foreach ($taxonomies as $taxonomy) {
$result = wpcource_delete_unused_terms($taxonomy);
if (preg_match('/Удалено терминов: (\d+)/', $result, $matches)) {
$total_deleted += (int)$matches[1];
}
}
return "Всего удалено терминов: {$total_deleted}";
}
Такой подход позволит поддерживать базу данных в чистоте на автомате.
Использование плагинов для удаления неиспользуемых терминов
Если вы не хотите вникать в код, можно воспользоваться проверенными плагинами:
- Term Management Tools — добавляет удобные инструменты для работы с терминами, включая удаление пустых.
- WP Sweep — комплексное решение для очистки базы данных, в том числе удаляет неиспользуемые таксономии и термины.
- Clearfy Pro (https://wpshop.ru/clearfy-pro/?utm_source=wpcource.ru&utm_medium=article&utm_campaign=udalit-neispolzuemye-taxonomy-term-wordpress) — профессиональный плагин для оптимизации и очистки WordPress, который включает функции удаления мусора, в том числе пустых терминов.
Советы по работе с удалением терминов
Перед массовым удалением терминов рекомендуется сделать резервную копию базы данных. Это позволит восстановить данные в случае ошибки.
Также стоит учитывать, что удаление терминов не удаляет связанные с ними записи, а лишь убирает связь. Проверьте, что термин действительно не нужен.
Если сайт использует кэширование, после удаления терминов очистите кэш, чтобы изменения отобразились корректно.
Автоматизация удаления пустых терминов через WP-Cron
Чтобы регулярно автоматически удалять неиспользуемые термины, можно настроить задачу WP-Cron. Вот пример кода для функций.php вашей темы или кастомного плагина:
function wpcource_schedule_delete_unused_terms() {
if (!wp_next_scheduled('wpcource_cron_delete_unused_terms')) {
wp_schedule_event(time(), 'daily', 'wpcource_cron_delete_unused_terms');
}
}
add_action('wp', 'wpcource_schedule_delete_unused_terms');
function wpcource_cron_delete_unused_terms_callback() {
wpcource_delete_unused_terms_all_taxonomies();
}
add_action('wpcource_cron_delete_unused_terms', 'wpcource_cron_delete_unused_terms_callback');
Этот код настроит ежедневное выполнение очистки пустых терминов, что поможет держать базу данных в порядке без ручного вмешательства.