В процессе эксплуатации WordPress-сайта нередко накапливаются неиспользуемые термины таксономий (категорий, меток и пользовательских таксономий). Такие термины не прикреплены ни к одному посту или другому объекту, занимают место в базе данных и могут усложнять навигацию в админке. В этой статье мы подробно рассмотрим, как автоматизировать процесс удаления подобных терминов, используя WP-Cron и кастомный плагин.
Что такое неиспользуемые taxonomy termы и почему их нужно удалять
Неиспользуемые термины — это элементы таксономий, к которым не привязано ни одного поста или другого объекта. Например, категория была создана, но затем все записи из нее удалены или перенесены в другие категории.
Причины удаления неиспользуемых терминов:
- Оптимизация базы данных и уменьшение ее размера.
- Упрощение интерфейса и избежание путаницы в админке.
- Повышение производительности запросов, связанных с таксономиями.
Ручное удаление таких терминов занимает время и может быть забыто, поэтому целесообразно автоматизировать процесс.
Подготовка: создание плагина для автоматизации удаления терминов
Для начала создадим плагин, который будет проверять и удалять неиспользуемые термины по расписанию WP-Cron. Это позволит запускать очистку автоматически, например, раз в неделю.
Основные шаги:
- Создать кастомный плагин с основным файлом
wpdetect-clean-terms.php. - Добавить функцию для поиска и удаления терминов без привязанных объектов.
- Настроить WP-Cron для регулярного запуска этой функции.
Пример кода плагина для удаления неиспользуемых терминов
Ниже приведён полный код плагина с комментариями. Его нужно поместить в папку /wp-content/plugins/wpdetect-clean-terms/ и активировать в админке.
<?php
/*
Plugin Name: WPDetect Clean Unused Terms
Description: Автоматическое удаление неиспользуемых taxonomy termов для оптимизации базы данных.
Version: 1.0
Author: WPDetect
*/
// Добавляем расписание, если его нет
add_filter('cron_schedules', 'wpdetect_add_weekly_cron_schedule');
function wpdetect_add_weekly_cron_schedule($schedules) {
if (!isset($schedules['weekly'])) {
$schedules['weekly'] = array(
'interval' => 604800, // 7 дней в секундах
'display' => __('Once Weekly')
);
}
return $schedules;
}
// Регистрируем событие при активации плагина
register_activation_hook(__FILE__, 'wpdetect_activation');
function wpdetect_activation() {
if (!wp_next_scheduled('wpdetect_cron_clean_unused_terms')) {
wp_schedule_event(time(), 'weekly', 'wpdetect_cron_clean_unused_terms');
}
}
// Удаляем событие при деактивации
register_deactivation_hook(__FILE__, 'wpdetect_deactivation');
function wpdetect_deactivation() {
$timestamp = wp_next_scheduled('wpdetect_cron_clean_unused_terms');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpdetect_cron_clean_unused_terms');
}
}
// Хук для выполнения функции очистки
add_action('wpdetect_cron_clean_unused_terms', 'wpdetect_clean_unused_terms');
function wpdetect_clean_unused_terms() {
global $wpdb;
// Получаем все таксономии, кроме системных
$taxonomies = get_taxonomies(array(), 'names');
foreach ($taxonomies as $taxonomy) {
// Получаем термины с count = 0 (неиспользуемые)
$terms = get_terms(array(
'taxonomy' => $taxonomy,
'hide_empty' => true, // true по умолчанию, чтобы исключить термины с count=0
'fields' => 'ids'
));
// get_terms с hide_empty=true вернёт только используемые, нам нужны пустые
// Поэтому делаем запрос напрямую в БД
$empty_terms = $wpdb->get_col($wpdb->prepare(
"SELECT term_id FROM {$wpdb->term_taxonomy} WHERE taxonomy = %s AND count = 0",
$taxonomy
));
if (!empty($empty_terms)) {
foreach ($empty_terms as $term_id) {
wp_delete_term($term_id, $taxonomy);
}
}
}
}
Объяснение и расширение функционала
В данном коде мы используем WP-Cron для регулярного запуска функции wpdetect_clean_unused_terms, которая проходит по всем таксономиям и удаляет термины с нулевым счётом (count = 0), то есть не связанные ни с одним объектом.
Обратите внимание, что функция get_terms с параметром hide_empty=true возвращает только используемые термины, поэтому для получения пустых терминов мы делаем прямой SQL-запрос к таблице term_taxonomy.
Если у вас есть пользовательские таксономии, они также будут обработаны этим скриптом, что очень удобно.
Как улучшить и обезопасить процесс
- Добавьте логирование удалённых терминов в отдельный файл или через error_log для мониторинга.
- Внедрите фильтры, чтобы исключить из удаления определённые таксономии, например, системные или важные для SEO.
- Перед удалением терминов можно отправлять уведомление администратору или делать резервную копию базы.
Пример расширения: исключение важных таксономий из очистки
Добавим фильтр, который позволит исключить таксономии, например, category и post_tag:
function wpdetect_clean_unused_terms() {
global $wpdb;
$excluded_taxonomies = array('category', 'post_tag');
$taxonomies = get_taxonomies(array(), 'names');
foreach ($taxonomies as $taxonomy) {
if (in_array($taxonomy, $excluded_taxonomies)) {
continue; // пропускаем исключённые таксономии
}
$empty_terms = $wpdb->get_col($wpdb->prepare(
"SELECT term_id FROM {$wpdb->term_taxonomy} WHERE taxonomy = %s AND count = 0",
$taxonomy
));
if (!empty($empty_terms)) {
foreach ($empty_terms as $term_id) {
wp_delete_term($term_id, $taxonomy);
}
}
}
}
Рекомендации по использованию и поддержке
Используйте данный плагин на тестовой среде перед запуском на боевом сайте, чтобы убедиться, что удаление терминов не повлияет на функционал.
Для дополнительной защиты можно добавлять подтверждения или делать резервные копии базы данных. Для автоматизации бэкапов обратите внимание на плагин WPDetect Backup.
Также, если вам нужно более продвинутое управление таксономиями и их оптимизация, можно рассмотреть плагин Clearfy Pro, который содержит инструменты для очистки и оптимизации базы данных WordPress.
Выводы
Автоматизация удаления неиспользуемых taxonomy termов — важный аспект поддержки чистоты и производительности WordPress-сайта. С помощью собственного плагина и WP-Cron вы сможете настроить регулярную очистку без лишних усилий, что упростит администрирование и улучшит работу сайта.