Если на сайте накопились пустые категории после импорта, миграции или долгой работы редакции, вручную проверять каждую из них неудобно и долго. В WordPress это можно сделать автоматически: сначала найти категории, у которых нет записей, затем удалить их через админку, SQL или небольшой PHP-скрипт. Самый безопасный путь зависит от того, сколько категорий нужно убрать и есть ли у вас доступ к базе данных.
Сразу оговорюсь: удалять нужно именно пустые категории, а не все термины подряд. Если на сайте есть вложенные категории, часть из них может выглядеть пустой только потому, что записи распределены не так, как вы ожидаете. Поэтому перед очисткой лучше понять, как WordPress считает «пустоту» категории.
Как WordPress определяет пустую категорию
Для таксономии category пустой считается категория, к которой не привязано ни одной записи. При этом в расчёт обычно не попадают записи в статусе черновика, а также другие типы контента, если они не подключены к этой таксономии. Именно поэтому после импорта часто остаются категории, которые в админке выглядят бесполезными, но вручную их приходится открывать по одной.
Если категория пустая, WordPress показывает у неё ноль записей в списке категорий. Но ориентироваться только на визуальную проверку неудобно, особенно когда категорий сотни. В таких случаях лучше использовать автоматический отбор по количеству записей.
Самый безопасный способ: удалить пустые категории через админку
Если категорий немного, можно обойтись встроенным интерфейсом WordPress. Откройте Записи → Рубрики и отсортируйте список по количеству записей. У пустых категорий в колонке количества будет 0. Дальше их можно выделить и удалить массовым действием.
Этот способ не требует кода, но у него есть ограничение: WordPress не умеет автоматически выделить только пустые категории. Если их много, придётся всё равно просматривать список и отмечать вручную. Для разовой чистки это нормально, для регулярной миграции — уже нет.
Автоматическое удаление пустых категорий через SQL
Когда нужно быстро очистить сайт после импорта или переноса, удобнее работать напрямую с базой данных. Но здесь важно не торопиться: перед любыми изменениями сделайте резервную копию базы. Если удалить не те строки, восстановление без бэкапа будет сложным.
Ниже запрос, который находит категории с нулём записей и удаляет их из таблиц таксономий WordPress. Он подходит для стандартной таксономии категорий и обычной структуры таблиц с префиксом wp_. Если у вас другой префикс, замените его на свой.
DELETE tt, t, tr, tm, trc, trp, trp2, trp3, trp4, trp5, trp6, trp7, trp8, trp9, trp10, trp11, trp12, trp13, trp14, trp15, trp16, trp17, trp18, trp19, trp20, trp21, trp22, trp23, trp24, trp25, trp26, trp27, trp28, trp29, trp30, trp31, trp32, trp33, trp34, trp35, trp36, trp37, trp38, trp39, trp40, trp41, trp42, trp43, trp44, trp45, trp46, trp47, trp48, trp49, trp50, trp51, trp52, trp53, trp54, trp55, trp56, trp57, trp58, trp59, trp60, trp61, trp62, trp63, trp64, trp65, trp66, trp67, trp68, trp69, trp70, trp71, trp72, trp73, trp74, trp75, trp76, trp77, trp78, trp79, trp80, trp81, trp82, trp83, trp84, trp85, trp86, trp87, trp88, trp89, trp90, trp91, trp92, trp93, trp94, trp95, trp96, trp97, trp98, trp99, trp100 FROM wp_term_taxonomy tt INNER JOIN wp_terms t ON t.term_id = tt.term_id LEFT JOIN wp_term_relationships tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy = 'category' AND tt.count = 0;Этот вариант намеренно не стоит использовать вслепую. В чистом виде он зависит от структуры вашей базы и может быть слишком агрессивным, если вы не понимаете, какие таблицы затрагивает. На практике безопаснее сначала посмотреть список пустых категорий, а уже потом удалять их по term_id.
Гораздо надёжнее выполнить сначала выборку:
SELECT t.term_id, t.name, t.slug, tt.count, tt.parent<br>FROM wp_terms t<br>INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id<br>WHERE tt.taxonomy = 'category' AND tt.count = 0<br>ORDER BY t.name;После этого вы увидите конкретные категории, которые можно удалить. Если список небольшой, удаляйте их точечно. Если список большой, лучше использовать скрипт или WP-CLI, чтобы не ошибиться вручную.
Удаление пустых категорий через PHP-скрипт
Если у вас нет удобного доступа к SQL-клиенту, можно использовать короткий PHP-скрипт внутри WordPress. Этот вариант удобен тем, что он работает через штатные функции CMS и удаляет именно термины категории, а не строки в базе «в лоб».
Ниже пример кода, который можно временно добавить в отдельный файл плагина или в functions.php дочерней темы и запустить один раз. После выполнения код нужно удалить, чтобы он не срабатывал повторно.
$terms = get_terms( array(<br> 'taxonomy' => 'category',<br> 'hide_empty' => false,<br> 'fields' => 'all',<br>) );<br><br>if ( ! is_wp_error( $terms ) ) {<br> foreach ( $terms as $term ) {<br> if ( (int) $term->count === 0 ) {<br> wp_delete_term( $term->term_id, 'category' );<br> }<br> }<br>}Здесь важны две вещи. Во-первых, hide_empty => false нужен, чтобы получить все категории, включая пустые. Во-вторых, проверка $term->count === 0 отсекает только те термины, у которых нет записей. Это уже безопаснее, чем удалять всё подряд по названию или slug.
Если вы не хотите править тему, такой код лучше запускать через временный мини-плагин или через сниппет-менеджер, если он у вас уже установлен. После очистки не забудьте убрать код, иначе при каждом открытии страницы он будет снова проходить по категориям.
Когда лучше использовать WP-CLI
Если сайт большой и категорий много, WP-CLI обычно удобнее всего. Он позволяет запускать очистку без браузера и без лишней нагрузки на админку. Но этот вариант подходит только если хостинг даёт доступ к командной строке.
Сначала можно посмотреть пустые категории:
wp term list category --fields=term_id,name,countДальше отфильтровать их по нулевому количеству записей. В самом WP-CLI нет универсальной команды «удалить все термины с count=0» без дополнительной логики, поэтому на практике используют либо shell-обвязку, либо PHP-скрипт через wp eval. Например:
wp eval '
$terms = get_terms( array(