В WordPress с версии 4.4 появилась возможность добавлять метаданные к терминам таксономий — termmeta. Это удобный инструмент для хранения дополнительной информации, однако при активном использовании плагинов и тем с кастомными таксономиями метаданные могут накапливаться, оставаться неиспользуемыми и засорять базу данных. В этой статье разберем, как выявить и удалить неиспользуемые taxonomy termmeta корректно и эффективно, чтобы не навредить сайту и улучшить производительность.
Что такое taxonomy termmeta и зачем его оптимизировать
Taxonomy termmeta — это таблица wp_termmeta, в которой хранятся произвольные поля для терминов таксономий, таких как категории, теги, а также кастомные таксономии. Плагины и темы используют эту таблицу для хранения настроек, дополнительных данных, например, иконок категорий, описаний, SEO-параметров и прочего.
Со временем, если плагины удалены или перестали использоваться, данные в termmeta остаются и не очищаются автоматически. Это приводит к:
- Увеличению размера базы данных;
- Повышенной нагрузке при запросах к терминологии;
- Сложностям при резервном копировании и восстановлении;
- Общему замедлению сайта.
Оптимизация — это удаление таких «мертвых» метаданных, которые не связаны с существующими терминами или не используются в функционале.
Как проверить наличие неиспользуемых termmeta в базе данных
Первым шагом необходимо выявить, какие метаданные не привязаны к существующим терминам. Для этого можно использовать SQL-запросы напрямую к базе данных через phpMyAdmin или консоль MySQL.
Пример запроса для поиска termmeta с несуществующими term_id:
SELECT meta_id, term_id, meta_key
FROM wp_termmeta
WHERE term_id NOT IN (SELECT term_id FROM wp_terms);
Этот запрос вернёт все записи в wp_termmeta, у которых нет соответствующего термина в таблице wp_terms. Такие данные можно смело удалять, так как они неактивны.
Для более комплексного анализа можно проверить метаданные, не используемые в коде сайта, но это требует детального аудита плагинов и тем.
Удаление неиспользуемых termmeta через SQL и WP CLI
Оптимальный способ — удалять данные пакетно, используя SQL-запросы. Например, очистка всех orphan termmeta:
DELETE FROM wp_termmeta
WHERE term_id NOT IN (SELECT term_id FROM wp_terms);
Перед выполнением обязательно сделайте резервную копию базы данных!
Альтернативно можно использовать WP CLI для удаления метаданных по одному термину или по критериям, если хотите вручную контролировать процесс.
Пример функции в теме или плагине для удаления неактивных termmeta:
function wpclean_delete_orphan_termmeta() {
global $wpdb;
$deleted = $wpdb->query(
"DELETE FROM {$wpdb->termmeta}
WHERE term_id NOT IN (SELECT term_id FROM {$wpdb->terms})"
);
return $deleted;
}
Вы можете выполнить эту функцию через админ-панель с помощью кастомного плагина или через WP CLI команду.
Использование плагинов для очистки базы данных от неиспользуемых taxonomy termmeta
Если предпочитаете не работать с кодом, есть плагины, которые позволяют оптимизировать таблицы базы данных, включая wp_termmeta:
- Clearfy Pro — этот плагин имеет инструменты для оптимизации базы, включая удаление orphan meta, настройку автоматической очистки и мониторинг;
- WPRemark — плагин для работы с метаданными, позволяет управлять и массово удалять ненужные данные;
- WP Optimize, Advanced Database Cleaner — универсальные плагины для очистки и оптимизации базы с возможностью удалять неиспользуемые termmeta.
При использовании плагинов внимательно изучайте настройки, чтобы случайно не удалить важные данные.
Как избежать накопления неиспользуемых termmeta в будущем
Чтобы база данных оставалась чистой, рекомендую придерживаться нескольких правил:
- Перед удалением плагинов проверяйте, очищают ли они свои данные. Если нет — удаляйте вручную;
- Регулярно проводите аудит базы данных и удаляйте orphan meta через WP CLI или плагины;
- Используйте плагины с хорошей репутацией, которые корректно работают с метаданными;
- Включите автоматическую оптимизацию базы в Clearfy Pro или аналогичных инструментах;
- При разработке тем и плагинов реализуйте функции удаления метаданных при удалении таксономий и терминов.
Вот пример хука для удаления termmeta при удалении термина в вашей теме или плагине:
add_action('deleted_term', 'wpclean_delete_termmeta_on_term_delete', 10, 4);
function wpclean_delete_termmeta_on_term_delete($term_id, $term, $tt_id, $deleted_term_taxonomy) {
global $wpdb;
$wpdb->delete($wpdb->termmeta, ['term_id' => $term_id]);
}
Этот код гарантирует, что при удалении термина все его метаданные будут удалены автоматически.