В процессе работы с WordPress накапливается множество категорий, которые могут оставаться пустыми — без связанных с ними записей. Такие категории не только создают беспорядок в админке, но и негативно влияют на SEO и юзабилити. В этой статье подробно разберём, как программно удалять пустые категории в WordPress, используя собственные функции и удобные плагины.
Почему важно удалять пустые категории в WordPress
Пустые категории — это таксономии, к которым не привязано ни одной записи. Они могут появляться в результате удаления записей, миграции контента или ошибочных действий. Если не очищать такие категории, это приводит к:
- загромождению панели администратора и усложнению навигации;
- появлению неиндексируемых страниц в поисковиках, что снижает SEO;
- потере эффективности фильтров и виджетов категорий на сайте.
Решить проблему можно вручную, но при большом объёме категорий это неудобно. Автоматизация с помощью кода — лучший вариант.
Как проверить наличие пустых категорий в WordPress
Для начала стоит просмотреть список категорий, чтобы убедиться, какие из них пустые. Это можно сделать через админку в разделе Записи → Рубрики, где в столбце "Записей" отображается количество записей в категории.
Чтобы вывести пустые категории программно, используйте следующий код, который можно добавить, например, в файл functions.php вашей темы или в отдельный плагин:
function wp1_get_empty_categories() {
$empty_categories = get_categories(array(
'hide_empty' => true,
'fields' => 'ids',
'number' => 0
));
$all_categories = get_categories(array(
'hide_empty' => false,
'fields' => 'ids'
));
$empty = array_diff($all_categories, $empty_categories);
return $empty;
}Этот код получает все категории и категории с записями, после чего вычисляет пустые.
Удаление пустых категорий через PHP-код
Чтобы удалить все пустые категории, можно использовать функцию wp1_delete_empty_categories(). Ниже пример реализации:
function wp1_delete_empty_categories() {
$empty_cats = wp1_get_empty_categories();
foreach ($empty_cats as $cat_id) {
wp_delete_category($cat_id);
}
}Вызов этой функции удалит пустые категории. Рекомендуется запускать её разово или через WP-CLI, чтобы случайно не удалить нужные категории.
Для запуска функции вручную, например, через админку, можно добавить временный экшен:
add_action('admin_init', function() {
if (current_user_can('manage_options') && isset($_GET['wp1_delete_empty_cats'])) {
wp1_delete_empty_categories();
wp_redirect(admin_url('edit-tags.php?taxonomy=category'));
exit;
}
});Теперь достаточно перейти по ссылке https://ваш-сайт.ru/wp-admin/edit-tags.php?taxonomy=category&wp1_delete_empty_cats=1 с правами администратора, чтобы запустить удаление.
Автоматизация удаления пустых категорий с помощью Cron
Если хотите регулярно очищать пустые категории, можно установить периодический запуск функции через WP-Cron:
function wp1_schedule_empty_cat_cleanup() {
if (!wp_next_scheduled('wp1_cleanup_empty_categories_hook')) {
wp_schedule_event(time(), 'weekly', 'wp1_cleanup_empty_categories_hook');
}
}
add_action('wp', 'wp1_schedule_empty_cat_cleanup');
add_action('wp1_cleanup_empty_categories_hook', 'wp1_delete_empty_categories');Этот код запускает функцию удаления пустых категорий раз в неделю. Период можно изменить на «daily» или «monthly» по необходимости.
Плагины для управления и очистки категорий
Если вы не хотите работать с кодом, существуют плагины, которые помогают управлять категориями и удалять пустые:
- Term Management Tools — расширяет возможности таксономий, в том числе позволяет сливать и удалять термины.
- Bulk Delete — мощный инструмент для массового удаления постов и таксономий по разным условиям, включая пустые категории.
Например, Bulk Delete предлагает удобный интерфейс и гибкие фильтры для очистки категорий без необходимости писать код.
Как избежать появления пустых категорий
Чтобы минимизировать появление пустых категорий, придерживайтесь следующих правил:
- Перед удалением поста проверяйте, не останется ли категория без записей.
- Используйте кастомные сообщения или предупреждения для администраторов при удалении категорий.
- Для новостных сайтов и блогов планируйте структуру категорий заранее, чтобы не создавать лишних.
Также можно настроить автоматическое удаление категории, если к ней не привязано записей более определённого времени, реализовав это через WP-Cron и дополнительную логику.
Пример расширенного кода: удаление пустых категорий старше 30 дней
Более сложный вариант — удалять только те пустые категории, которые существуют пустыми дольше месяца:
function wp1_delete_old_empty_categories() {
$empty_cats = wp1_get_empty_categories();
foreach ($empty_cats as $cat_id) {
$category = get_category($cat_id);
if (!$category) continue;
$term_created = get_term_meta($cat_id, 'wp1_term_created', true);
if (!$term_created) {
// Если мета отсутствует, сохраняем текущую дату
update_term_meta($cat_id, 'wp1_term_created', time());
continue;
}
if (time() - $term_created > 30 * DAY_IN_SECONDS) {
wp_delete_category($cat_id);
}
}
}Для корректной работы нужно при создании категории добавлять мета с датой создания, что можно сделать через хук created_category. Это позволит точно отслеживать время существования пустых категорий.
Реализация сохранения даты создания категории:
add_action('created_category', function($term_id, $tt_id) {
update_term_meta($term_id, 'wp1_term_created', time());
}, 10, 2);