В процессе работы с WordPress накапливается большое количество терминов (категорий, меток и других таксономий), которые уже не используются. Такие «мертвые» термины могут загромождать базу данных, усложнять навигацию и негативно сказываться на производительности сайта. В этой статье мы подробно рассмотрим, как настроить автоматическое удаление неиспользуемых терминов, чтобы поддерживать чистоту и порядок в вашем WordPress.
Почему важно удалять неиспользуемые термины в WordPress
Со временем многие категории и метки перестают быть актуальными: статьи удаляются, таксономии меняются, а старые термины остаются в базе. Это приводит к нескольким проблемам:
- Увеличение размера базы данных — ненужные записи занимают место и замедляют запросы.
- Сложности в администрировании — трудно ориентироваться в большом списке терминов.
- Потенциальные ошибки — старые термины могут конфликтовать с новыми или влиять на отображение контента.
Регулярное удаление неиспользуемых терминов улучшит производительность сайта и упростит управление таксономиями.
Как определить неиспользуемые термины
В WordPress термин считается неиспользуемым, если у него count равен нулю — то есть ни один пост не связан с этим термином. Можно проверить это через админку, но автоматизация процесса значительно удобнее.
Для выборки таких терминов используется функция get_terms() с параметром hide_empty:
$unused_terms = get_terms(array('taxonomy' => 'category', 'hide_empty' => true)); // вернёт только используемые термины
$empty_terms = get_terms(array('taxonomy' => 'category', 'hide_empty' => false)); // вернёт все термины
// Чтобы получить неиспользуемые, нужно отфильтровать по count = 0
$unused_terms = array_filter($empty_terms, function($term) {
return $term->count == 0;
});После определения списка неиспользуемых терминов можно переходить к их удалению.
Автоматическое удаление неиспользуемых терминов с помощью WP-Cron
Для регулярного удаления терминов оптимально использовать систему планировщика задач WP-Cron. Это позволяет запускать очистку базы автоматически через заданные интервалы.
Создадим функцию wpgenerate_delete_unused_terms(), которая будет удалять все неиспользуемые термины в заданных таксономиях:
function wpgenerate_delete_unused_terms() {
$taxonomies = array('category', 'post_tag'); // можно добавить свои таксономии
foreach ($taxonomies as $taxonomy) {
$terms = get_terms(array(
'taxonomy' => $taxonomy,
'hide_empty' => false,
));
if (is_wp_error($terms)) {
continue;
}
foreach ($terms as $term) {
if ($term->count == 0) {
wp_delete_term($term->term_id, $taxonomy);
}
}
}
}
// Регистрация события в wp_cron
if (!wp_next_scheduled('wpgenerate_daily_delete_unused_terms')) {
wp_schedule_event(time(), 'daily', 'wpgenerate_daily_delete_unused_terms');
}
add_action('wpgenerate_daily_delete_unused_terms', 'wpgenerate_delete_unused_terms');Этот код добавляет ежедневное задание, которое удаляет все неиспользуемые категории и метки. Вы можете расширить список таксономий, добавив свои.
Как отключить или изменить периодичность
Если нужно изменить интервал, можно заменить 'daily' на 'hourly', 'twicedaily' или создать свой интервал через фильтр cron_schedules. Чтобы отключить задачу, выполните в консоли или через плагин WP-CLI:
wp cron event delete wpgenerate_daily_delete_unused_terms<Плагины для управления таксономиями и очистки терминов
Если вы предпочитаете готовые решения, обратите внимание на плагины:
- Term Management Tools — расширяет стандартные возможности работы с таксономиями, включая слияние и удаление терминов.
- WP Bulk Delete — позволяет массово удалять записи, пользователей, а также термины по различным условиям, включая неиспользуемые.
- Clearfy Pro — оптимизирует работу WordPress и содержит инструменты для очистки базы данных, включая удаление «мёртвых» терминов. Подробнее на wpshop.ru.
Использование плагинов упрощает задачу, но автоматизация через WP-Cron даёт больше гибкости и контроля.
Советы по безопасному удалению терминов
Перед автоматическим удалением терминов обязательно сделайте резервную копию базы данных. В случае ошибки вы сможете восстановить данные.
Рекомендуется сначала запускать функцию удаления на тестовом сайте или в режиме отладки, чтобы убедиться, что она не затронет нужные термины.
Кроме того, можно добавить дополнительную логику, например, сохранять список удалённых терминов в отдельную таблицу или отправлять уведомления администратору.
Расширение функции удаления: пример с логированием
Для контроля процесса добавим логирование в файл wp-content/wpgenerate_delete_terms.log:
function wpgenerate_delete_unused_terms() {
$taxonomies = array('category', 'post_tag');
$log_file = WP_CONTENT_DIR . '/wpgenerate_delete_terms.log';
foreach ($taxonomies as $taxonomy) {
$terms = get_terms(array(
'taxonomy' => $taxonomy,
'hide_empty' => false,
));
if (is_wp_error($terms)) {
error_log("[wpgenerate] Ошибка запроса терминов для таксономии $taxonomy", 3, $log_file);
continue;
}
foreach ($terms as $term) {
if ($term->count == 0) {
$result = wp_delete_term($term->term_id, $taxonomy);
if (is_wp_error($result)) {
error_log("[wpgenerate] Не удалось удалить термин {$term->name} ({$term->term_id}) из $taxonomy: " . $result->get_error_message() . "\n", 3, $log_file);
} else {
error_log("[wpgenerate] Удалён термин {$term->name} ({$term->term_id}) из $taxonomy\n", 3, $log_file);
}
}
}
}
}Так вы сможете отслеживать, какие термины и когда были удалены, и своевременно реагировать на возможные проблемы.
Итог
Автоматическое удаление неиспользуемых терминов — важная часть оптимизации WordPress. Используя приведённые примеры с WP-Cron и фильтрацией терминов, вы сможете поддерживать базу данных в порядке и улучшить производительность сайта. При необходимости используйте готовые плагины, например, Clearfy Pro, для дополнительного удобства.