Как автоматически удалять пустые категории в WordPress

Диагностика проблемы: зачем удалять пустые категории

Пустые категории — это таксономии, у которых нет ни одной опубликованной записи. Они засоряют админку, ухудшают 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Автоматически поддерживает чистоту категорий, безопасно при правильной настройкеНеобходимо создавать и поддерживать код, возможны ошибки при неправильной реализации
Как использовать REST API WooCommerce для автоматизации обработки заказов
25.04.2026
Автоматическое удаление старых записей в WordPress через WP-Cron
30.03.2026
Как создать автоматические уведомления о обновлениях в WordPress
25.01.2026
Как добавить автоматическое удаление старых записей через WP-Cron в WordPress
31.01.2026
Как автоматически удалять пустые категории в WordPress
06.06.2026