В работе с WordPress часто возникает ситуация, когда в базе данных остаются пустые термины таксономий — категории, метки или кастомные таксономии, которые не привязаны ни к одному посту или другому объекту. Это приводит к захламлению базы данных и может негативно сказаться на производительности сайта и удобстве управления контентом. В этой статье мы разберёмся, как эффективно находить и удалять такие пустые термины как вручную, так и автоматически, используя PHP-код и плагины.
Что такое пустые термины таксономий и почему их нужно удалять
Пустые термины — это объекты таксономий, у которых нет связанных записей. Например, категория, в которую не отнесён ни один пост. Такие термины не отображаются на сайте, но хранятся в базе, увеличивая её размер и усложняя работу с админкой.
Причины появления пустых терминов:
- Удаление постов без очистки связанных терминов;
- Импорт и экспорт контента с ошибками;
- Ошибки плагинов и тем, которые создавали таксономии;
- Тестирование и экспериментальный контент.
Удаление пустых терминов помогает:
- Сократить размер базы данных;
- Упростить навигацию по таксономиям в админке;
- Избежать ошибок и конфликтов, связанных с устаревшими связями;
- Повысить скорость загрузки страниц с таксономиями.
Как найти пустые термины таксономий с помощью SQL-запроса
Если у вас есть доступ к базе данных через phpMyAdmin или другой инструмент, можно быстро найти пустые термины таксономий с помощью следующего запроса:
SELECT t.term_id, t.name, tt.taxonomy
FROM wp_terms AS t
INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id
WHERE tt.count = 0;
Таблица wp_term_taxonomy содержит поле count, которое отражает количество объектов (постов, страниц и т.д.), связанных с термином. Если count равен нулю, значит термин пустой.
Этот запрос выведет список всех пустых терминов по всем таксономиям. Можно уточнить поиск, добавив фильтр по конкретной таксономии, например, для категорий:
AND tt.taxonomy = 'category'
Удаление пустых терминов через PHP: пример функции для wpCodes
Для автоматизации процесса удаления пустых терминов можно использовать кастомную функцию, которую удобно запускать через админский хук или WP-CLI. Ниже пример функции, которая удаляет пустые термины для указанной таксономии:
function wpcodes_delete_empty_terms( $taxonomy = 'category' ) {
// Получаем все термины таксономии с count = 0
$empty_terms = get_terms( array(
'taxonomy' => $taxonomy,
'hide_empty' => true, // true для исключения непустых
'fields' => 'ids',
'count' => 0
) );
// Альтернативно: get_terms с 'hide_empty' => false и фильтрация вручную
if ( empty( $empty_terms ) || is_wp_error( $empty_terms ) ) {
return 'Пустых терминов не найдено.';
}
foreach ( $empty_terms as $term_id ) {
wp_delete_term( $term_id, $taxonomy );
}
return count( $empty_terms ) . ' пустых терминов удалено из таксономии "' . $taxonomy . '".';
}
// Пример вызова функции
// echo wpcodes_delete_empty_terms( 'category' );
Обратите внимание, что параметр hide_empty по умолчанию исключает пустые термины, поэтому для их получения лучше использовать hide_empty => false и затем фильтровать по count в коде. Вот улучшенный вариант:
function wpcodes_delete_empty_terms( $taxonomy = 'category' ) {
$terms = get_terms( array(
'taxonomy' => $taxonomy,
'hide_empty' => false
) );
if ( empty( $terms ) || is_wp_error( $terms ) ) {
return 'Термины не найдены или ошибка.';
}
$deleted_count = 0;
foreach ( $terms as $term ) {
if ( intval( $term->count ) === 0 ) {
wp_delete_term( $term->term_id, $taxonomy );
$deleted_count++;
}
}
return $deleted_count . ' пустых терминов удалено из таксономии "' . $taxonomy . '".';
}
Автоматизация удаления пустых терминов с помощью Cron и WP-Cron
Чтобы не запускать функцию вручную, можно настроить автоматическое удаление пустых терминов по расписанию. Для этого используем WP-Cron. Пример добавления задачи:
// Регистрируем событие при активации плагина или темы
if ( ! wp_next_scheduled( 'wpcodes_delete_empty_terms_cron' ) ) {
wp_schedule_event( time(), 'daily', 'wpcodes_delete_empty_terms_cron' );
}
// Обработчик события
add_action( 'wpcodes_delete_empty_terms_cron', function() {
wpcodes_delete_empty_terms( 'category' );
wpcodes_delete_empty_terms( 'post_tag' );
} );
// Не забудьте очистить событие при деактивации
register_deactivation_hook( __FILE__, function() {
wp_clear_scheduled_hook( 'wpcodes_delete_empty_terms_cron' );
} );
Такой подход позволяет регулярно очищать базу от пустых терминов без вмешательства администратора.
Плагины для управления и очистки таксономий
Если хотите использовать готовые решения, обратите внимание на следующие плагины:
- Term Management Tools — позволяет сливать, удалять и управлять терминами в WordPress. Удобен для ручной очистки.
- WP Sweep — инструмент для оптимизации базы данных, включая удаление неиспользуемых терминов и метаданных.
- Clearfy Pro — комплексный плагин оптимизации с возможностью очистки мусора, включая пустые термины таксономий. Подробнее на wpshop.ru.
Использование плагинов подходит для пользователей, не желающих писать код, однако для точечного управления и автоматизации лучше создавать собственные решения.
Пример интеграции с плагином Clearfy Pro для автоматической очистки
Если на вашем сайте установлен Clearfy Pro, можно воспользоваться встроенными инструментами для удаления пустых терминов:
- Перейдите в настройки Clearfy Pro;
- Выберите раздел «Оптимизация базы данных»;
- Активируйте опцию удаления пустых терминов;
- Настройте расписание автоматической очистки.
Это позволит эффективно поддерживать базу данных в чистоте без дополнительных усилий.
Рекомендации по безопасности и резервному копированию
Перед удалением терминов, особенно автоматизированным, настоятельно рекомендуется сделать резервную копию базы данных. Удаление терминов — необратимая операция, и ошибки могут привести к потере важных связей и данных.
Используйте плагины для бэкапов, например, WPBackup, или настраивайте автоматическое резервное копирование на сервере.
Также стоит тщательно тестировать кастомные функции на тестовом сайте перед применением на боевом ресурсе.
Итоги и лучшие практики
Удаление пустых терминов таксономий — важная задача для поддержания чистоты и эффективности сайта на WordPress. Используйте SQL-запросы для быстрого анализа, пишите кастомные функции для автоматизации и применяйте проверенные плагины для удобства.
Помните о безопасности — всегда делайте резервные копии. Настройте регулярное удаление пустых терминов через WP-Cron, чтобы база данных не захламлялась со временем.
Такой подход улучшит работу сайта и упростит управление контентом как для разработчиков, так и для контент-менеджеров.