Диагностика проблемы: зачем удалять пустые категории
Пустые категории — это таксономии, у которых нет ни одной опубликованной записи. Они засоряют админку, ухудшают SEO (пустые страницы категорий могут индексироваться), снижают удобство навигации для пользователей и могут создавать лишнюю нагрузку на сайт при выводе списков. Автоматическое удаление таких категорий помогает поддерживать чистоту структуры сайта без ручного контроля.
Как проверить, есть ли пустые категории на сайте
Для диагностики можно использовать WP-CLI или SQL-запрос:
wp term list category --fields=term_id,name,count --format=tableВ столбце count отображается число записей в категории. Если count = 0, категория пустая.
Альтернативно SQL-запрос для проверки пустых категорий:
SELECT t.term_id, t.name, tt.count FROM wp_terms t
INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
WHERE tt.taxonomy = 'category' AND tt.count = 0;Пошаговое решение: автоматическое удаление пустых категорий через код
Для автоматизации удаления пустых категорий создадим функцию, которая будет запускаться по крону раз в сутки. Она найдет все категории с нулевым количеством записей и удалит их.
1. Добавляем функцию удаления пустых категорий
function wptest_delete_empty_categories() {
$empty_cats = get_terms(
array(
'taxonomy' => 'category',
'hide_empty' => true, // true вернет только непустые, поэтому ставим false
'fields' => 'ids',
'count' => 0,
'hide_empty' => false
)
);
// Но get_terms с count=0 не работает, поэтому используем WP_Term_Query
$terms = get_terms(array(
'taxonomy' => 'category',
'hide_empty' => false
));
foreach ($terms as $term) {
if ($term->count == 0) {
wp_delete_term($term->term_id, 'category');
}
}
}2. Регистрация ежедневного WP-Cron события
function wptest_schedule_empty_cat_cleanup() {
if (!wp_next_scheduled('wptest_daily_empty_cat_cleanup')) {
wp_schedule_event(time(), 'daily', 'wptest_daily_empty_cat_cleanup');
}
}
add_action('wp', 'wptest_schedule_empty_cat_cleanup');
add_action('wptest_daily_empty_cat_cleanup', 'wptest_delete_empty_categories');3. Удаление крон-события при деактивации темы или плагина
function wptest_clear_empty_cat_cleanup_schedule() {
$timestamp = wp_next_scheduled('wptest_daily_empty_cat_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wptest_daily_empty_cat_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wptest_clear_empty_cat_cleanup_schedule');Проверка результата после внедрения
Чтобы проверить, что скрипт работает, можно:
- В админке перейти в «Записи» → «Рубрики» и убедиться, что пустые категории исчезли.
- Выполнить вручную функцию из консоли WP-CLI:
wp eval 'wptest_delete_empty_categories();'и проверить результат. - Посмотреть логи сервера или добавить временный лог внутри функции:
error_log('Удалена категория с ID: ' . $term->term_id);Частые ошибки и как их исправить
- Пустые категории не удаляются: возможно, в функции используется
get_termsс параметромhide_empty=true, который не вернет пустые категории. Убедитесь, чтоhide_empty=false. - Удаление приводит к ошибкам: проверьте, что у пользователя с которого запускается код есть права на удаление терминов (обычно это администратор).
- Функция не запускается по крону: убедитесь, что WP-Cron работает. Для теста можно вызвать событие вручную через WP-CLI:
wp cron event run wptest_daily_empty_cat_cleanup. - Крон-события накапливаются: добавьте удаление расписания при деактивации плагина или темы.
Практические советы по безопасности и производительности
- Функция удаления категорий запускается раз в сутки, чтобы не создавать нагрузку.
- Перед удалением категорий можно добавить дополнительную проверку, например, не удалять категории с определенными ID, чтобы избежать случайной потери нужных.
- Можно сделать резервное копирование базы перед автоматическим удалением через плагины или WP-CLI.
- Если на сайте много категорий, используйте
WP_Term_Queryс постраничной загрузкой для обработки по частям.
Сравнение методов удаления пустых категорий
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Трудоемко, требует постоянного контроля |
| SQL запрос | Быстрое удаление, можно настроить под свои нужды | Риск повреждения данных, требует знаний SQL |
| Автоматизация через WP-Cron и PHP | Автоматически поддерживает чистоту категорий, безопасно при правильной настройке | Необходимо создавать и поддерживать код, возможны ошибки при неправильной реализации |