При развитии WordPress-сайта часто накапливаются устаревшие категории и теги, которые больше не используются в записях. Это не только засоряет базу данных, но и усложняет управление контентом. В этой статье мы рассмотрим, как автоматизировать удаление таких неактивных терминов программно, а также разберём полезные плагины для упрощения задачи.
Почему важно удалять неиспользуемые категории и теги в WordPress
Каждая категория и тег — это объект таксономии, хранящийся в базе данных. Когда они не используются, они остаются в таблицах, создавая лишний шум и потенциально замедляя запросы к базе. Кроме того, лишние термины могут путать редакторов и авторов при выборе меток для новых записей.
Удаление неиспользуемых терминов помогает:
- Сократить размер базы данных;
- Упростить структуру таксономий;
- Повысить удобство управления контентом;
- Избежать ошибок и конфликтов при работе с плагинами и темами.
Как определить старые и неиспользуемые категории и теги
Под «старостью» можно понимать термины, которые не применялись в публикациях более определённого времени (например, 6 месяцев или год). Также стоит учитывать количество записей, связанных с категорией или тегом — если оно равно нулю, термин можно удалять без сомнений.
Для поиска неиспользуемых терминов можно использовать SQL-запросы, но удобнее делать это программно, используя функции WordPress:
get_terms()с параметром'hide_empty' => trueвернёт только использованные термины;- сравнение с полным списком терминов позволит определить пустые;
- для старых терминов нужно проверить дату последнего использования, что требует дополнительного хранения или анализа публикаций.
Пример функции для удаления пустых категорий и тегов в WordPress
Ниже пример кастомной функции, которая автоматически удаляет все категории и теги, не привязанные ни к одной записи.
function wp5_delete_empty_terms() {
// Получаем пустые категории
$empty_categories = get_terms(array(
'taxonomy' => 'category',
'hide_empty' => true
));
$all_categories = get_terms(array(
'taxonomy' => 'category',
'hide_empty' => false
));
// Определяем пустые категории
foreach($all_categories as $category) {
if(!in_array($category, $empty_categories)) {
// Удаляем пустую категорию
wp_delete_term($category->term_id, 'category');
}
}
// Аналогично для тегов
$empty_tags = get_terms(array(
'taxonomy' => 'post_tag',
'hide_empty' => true
));
$all_tags = get_terms(array(
'taxonomy' => 'post_tag',
'hide_empty' => false
));
foreach($all_tags as $tag) {
if(!in_array($tag, $empty_tags)) {
wp_delete_term($tag->term_id, 'post_tag');
}
}
}
// Запуск функции можно повесить на крон или хук admin_init
add_action('admin_init', 'wp5_delete_empty_terms');Обратите внимание, что функция удаляет пустые категории и теги, вызывая wp_delete_term(), что безопасно и корректно очищает все связи.
Автоматизация удаления старых терминов по времени использования
WordPress не хранит дату последнего использования категории или тега. Для реализации автоматического удаления по дате последнего применения нужно анализировать дату публикации записей, связанных с термином.
Вот упрощённый пример логики:
- Получить все термины таксономии;
- Для каждого термина найти дату последней публикации с этим термином;
- Если дата старше определённого порога, удалить термин.
Пример кода:
function wp5_delete_old_terms($taxonomy = 'category', $days = 180) {
$terms = get_terms(array(
'taxonomy' => $taxonomy,
'hide_empty' => false
));
$threshold = strtotime('-' . intval($days) . ' days');
foreach($terms as $term) {
$args = array(
'post_type' => 'post',
'posts_per_page' => 1,
'tax_query' => array(
array(
'taxonomy' => $taxonomy,
'field' => 'term_id',
'terms' => $term->term_id
)
),
'orderby' => 'date',
'order' => 'DESC',
'fields' => 'ids'
);
$posts = get_posts($args);
if(empty($posts)) {
// Нет публикаций с этим термином, можно удалить
wp_delete_term($term->term_id, $taxonomy);
} else {
$post_date = get_post($posts[0])->post_date_gmt;
if(strtotime($post_date) < $threshold) {
wp_delete_term($term->term_id, $taxonomy);
}
}
}
}
// Пример вызова для категорий и тегов
add_action('admin_init', function() {
wp5_delete_old_terms('category', 180); // 180 дней
wp5_delete_old_terms('post_tag', 180);
});Рекомендации по плагинам для управления таксономиями
Если вы предпочитаете не писать код самостоятельно, можно использовать плагины для очистки и управления таксономиями:
- Term Management Tools — удобный инструмент для слияния, удаления и управления терминами;
- Clearfy Pro — включает в себя модули для оптимизации базы данных и очистки неиспользуемых терминов;
- WP-Optimize — плагин для очистки базы данных с возможностью удалять неиспользуемые данные, включая термины.
Использование таких плагинов позволяет снизить риск ошибок и упростить задачу регулярного обслуживания сайта.
Как безопасно внедрять автоматическое удаление терминов на реальном сайте
Перед автоматическим удалением терминов важно:
- Создавать резервные копии базы данных;
- Тестировать функции на копии сайта;
- Добавлять подтверждения или логи для отслеживания удалённых терминов;
- Планировать запуск автоматизации через WP-Cron с интервалом, например, раз в неделю или месяц.
Пример использования WP-Cron для периодического запуска нашей функции:
if (! wp_next_scheduled( 'wp5_cron_delete_old_terms' )) {
wp_schedule_event(time(), 'weekly', 'wp5_cron_delete_old_terms');
}
add_action('wp5_cron_delete_old_terms', function() {
wp5_delete_old_terms('category', 180);
wp5_delete_old_terms('post_tag', 180);
});Такой подход обеспечивает регулярную очистку без участия администратора.
Заключение
Автоматическое удаление старых и неиспользуемых категорий и тегов — важная задача для поддержания чистоты и скорости работы WordPress-сайта. Используя приведённые примеры кода и рекомендации по плагинам, вы сможете легко внедрить надежное решение, которое уменьшит нагрузку на базу данных и улучшит навигацию по контенту.