Диагностика проблемы: почему появляются пустые категории
В процессе активного управления контентом на сайте WordPress часто накапливаются категории, в которых не осталось ни одного опубликованного поста. Они могут возникать после удаления или переноса записей, автоматического импорта, или ошибок в работе плагинов. Наличие пустых категорий негативно влияет на SEO и пользовательский опыт, так как такие страницы ведут в никуда или имеют низкое качество.
Чтобы проверить наличие пустых категорий, используйте SQL-запрос к базе данных или готовые функции WordPress.
SELECT t.term_id, t.name, COUNT(tr.object_id) AS posts_count
FROM wp_terms AS t
LEFT JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id
LEFT JOIN wp_term_relationships AS tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tt.taxonomy = 'category'
GROUP BY t.term_id
HAVING posts_count = 0;Этот запрос покажет все категории без связанных с ними постов.
Пошаговое решение: удаление пустых категорий и связанных постов
1. Удаление пустых категорий через WP-CLI
Если ваш хостинг поддерживает WP-CLI, можно быстро удалить пустые категории:
wp term list category --field=term_id --format=ids --hide-empty | xargs -n1 -I % wp term delete category %Эта команда получает ID пустых категорий (--hide-empty) и удаляет их.
2. Автоматическое удаление пустых категорий и связанных с ними постов через PHP
Если нужна автоматизация прямо в теме или плагине, используйте следующий код:
function delete_empty_categories_and_posts() {
$empty_cats = get_terms( array(
'taxonomy' => 'category',
'hide_empty' => true,
'fields' => 'ids',
'meta_query' => array(),
) );
// Получим все категории
$all_cats = get_terms( array(
'taxonomy' => 'category',
'hide_empty' => false,
'fields' => 'ids',
) );
// Найдём пустые категории
$empty_cats = array_diff( $all_cats, $empty_cats );
foreach ( $empty_cats as $cat_id ) {
// Удаляем все посты, если есть (редко, но проверим)
$posts = get_posts(array(
'category' => $cat_id,
'post_type' => 'post',
'post_status' => 'any',
'numberposts' => -1
));
foreach ( $posts as $post ) {
wp_delete_post( $post->ID, true );
}
// Удаляем категорию
wp_delete_term( $cat_id, 'category' );
}
}
// Запускаем функцию один раз, например при активации темы или вручную
// delete_empty_categories_and_posts();3. Ручное удаление категорий в админке
В разделе "Записи > Рубрики" можно отфильтровать категории по количеству записей и вручную удалить пустые. Однако при большом количестве категорий это неудобно.
Проверка результата после внедрения
- Выполните SQL-запрос из первого раздела повторно — пустых категорий не должно остаться.
- Проверьте в админке раздел «Рубрики» — количество пустых категорий должно быть равно нулю.
- Убедитесь, что страницы с такими категориями возвращают 404 или редиректят на релевантные разделы.
Частые ошибки и как их исправить
Неверное определение пустых категорий
Если использовать параметр hide_empty => true в get_terms, вы получите только непустые категории. Чтобы найти пустые, нужно наоборот получить все категории и исключить непустые.
Удаление категории без проверки прав
Код удаления категорий должен запускаться с проверкой прав пользователя, чтобы избежать случайного удаления. Лучше запускать вручную или через WP-CLI.
Удаление без учёта постов других типов
Если используются пользовательские типы записей, связанные с категориями, их тоже нужно учитывать, иначе категории могут казаться пустыми.
Практические советы по безопасности и производительности
- Перед массовым удалением сделайте резервную копию базы данных.
- Выполняйте операции удаления в ночное время или при низкой нагрузке, чтобы не замедлять сайт.
- Для больших сайтов используйте WP-CLI вместо PHP-скриптов в браузере.
- Если категории связаны с пользовательскими типами записей, адаптируйте код для их удаления.
Сравнение методов удаления пустых категорий
| Метод | Плюсы | Минусы | Подходит для |
|---|---|---|---|
| WP-CLI | Очень быстро, без нагрузки на сайт | Требует доступа к консоли | Администраторы с SSH |
| PHP-код в теме/плагине | Можно автоматизировать, подходит для хостингов без SSH | Нагрузка на сайт, риск ошибок при неправильном запуске | Разработчики и продвинутые пользователи |
| Ручное удаление через админку | Просто и безопасно | Не подходит для большого количества категорий | Маленькие сайты |