В процессе работы с WordPress накапливаются множество терминов таксономий, которые уже не используются ни в одной записи. Такие «мертвые» термины засоряют базу данных и могут замедлять работу сайта, особенно если таксономии кастомные и используются в сложных запросах. В этой статье расскажу, как найти и удалить неиспользуемые термины таксономий вручную, без использования плагинов, с примерами кода. Этот способ поможет вам оптимизировать сайт и держать базу в порядке.
Что такое неиспользуемые термины таксономий и почему важно их удалять
Термином таксономии (taxonomy term) называют категорию, тег или любой кастомный термин, который присваивается записям в WordPress. Например, категория «Новости» или тег «SEO». Иногда после удаления или изменения контента некоторые термины перестают быть связаны с записями, то есть их count становится равен нулю.
Когда термины не удаляются, база данных содержит лишние записи, что:
- Увеличивает размер таблиц wp_terms и wp_term_taxonomy;
- Замедляет запросы, особенно при большом количестве терминов;
- Создаёт путаницу в админке и при работе с API.
Удаление таких терминов – хорошая практика для оптимизации и чистоты данных.
Как вручную найти неиспользуемые термины таксономий
Самый простой способ — проверить поле count в таблице wp_term_taxonomy. Это число показывает, сколько записей связано с данным термином. Если count равен нулю, термин не используется.
Для выборки всех неиспользуемых терминов можно использовать SQL-запрос:
SELECT term_id, taxonomy FROM wp_term_taxonomy WHERE count = 0;Но лучше делать это в коде на PHP, чтобы безопасно удалить термины с помощью функций WordPress, которые корректно очищают все связи.
Пример функции для удаления всех неиспользуемых терминов таксономий
Ниже пример функции wpexpert_delete_unused_terms(), которую можно добавить в файл темы functions.php или в кастомный плагин. Она перебирает все таксономии, ищет термины с count = 0 и удаляет их.
function wpexpert_delete_unused_terms() {
// Получаем все зарегистрированные таксономии
$taxonomies = get_taxonomies( [], 'names' );
foreach ( $taxonomies as $taxonomy ) {
// Получаем термины с count = 0
$terms = get_terms([
'taxonomy' => $taxonomy,
'hide_empty' => false,
'count' => 0,
'fields' => 'ids'
]);
if ( !empty( $terms ) && !is_wp_error( $terms ) ) {
foreach ( $terms as $term_id ) {
// Удаляем термин
wp_delete_term( $term_id, $taxonomy );
}
}
}
}Вызовите wpexpert_delete_unused_terms() один раз, например, через админ-панель, или временно добавьте вызов в functions.php для очистки.
Особенности и предупреждения
- Функция удалит все термины с нулевым count во всех таксономиях, включая кастомные. Если есть нужда сохранить какие-то термин, нужно добавить исключения.
- Удаление терминов нельзя отменить, лучше сделать резервную копию базы перед запуском.
- Если используется плагин Clearfy Pro, там есть удобные инструменты для очистки базы, в том числе управления терминами, но рассмотренный способ не требует сторонних плагинов.
Удаление неиспользуемых терминов для конкретной таксономии
Иногда нужно почистить только одну таксономию, например, category или кастомную product_cat. Для этого функция упрощается:
function wpexpert_delete_unused_terms_for_taxonomy( $taxonomy ) {
$terms = get_terms([
'taxonomy' => $taxonomy,
'hide_empty' => false,
'count' => 0,
'fields' => 'ids'
]);
if ( !empty( $terms ) && !is_wp_error( $terms ) ) {
foreach ( $terms as $term_id ) {
wp_delete_term( $term_id, $taxonomy );
}
}
}Пример вызова для удаления неиспользуемых категорий:
wpexpert_delete_unused_terms_for_taxonomy('category');Такой подход удобен для выборочной очистки и подходит, если вы знаете, что в других таксономиях термины трогать не нужно.
Автоматизация очистки через WP-CLI
Если у вас есть доступ к WP-CLI, можно автоматизировать удаление через консоль. WP-CLI позволяет выполнять PHP-код или писать собственные команды для работы с базой.
Пример простой команды WP-CLI для удаления неиспользуемых терминов:
wp eval '
$taxonomies = get_taxonomies([], "names");
foreach ($taxonomies as $taxonomy) {
$terms = get_terms([
"taxonomy" => $taxonomy,
"hide_empty" => false,
"count" => 0,
"fields" => "ids"
]);
foreach ($terms as $term_id) {
wp_delete_term($term_id, $taxonomy);
}
}
'Это удобно для регулярного обслуживания больших сайтов без необходимости заходить в админку.
Заключение: почему лучше не удалять термины через прямой SQL
Хотя можно удалять термины напрямую через SQL-запросы, например, через DELETE FROM wp_terms WHERE term_id=..., делать этого не рекомендуется. WordPress хранит связи в нескольких таблицах и вызывает хуки при удалении, чтобы очистить кэш и другие данные.
Используйте wp_delete_term() для безопасного и корректного удаления терминов. Это гарантирует, что база останется целой и работа сайта не нарушится.
Если хотите дополнительно ускорить работу и упростить администрирование, обратите внимание на плагины для оптимизации базы, например, Clearfy Pro, в которых есть инструменты для работы с таксономиями и очистки базы.