wp-code.ru wordpress WP-Codе

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

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

В процессе активного управления контентом на сайте 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Нагрузка на сайт, риск ошибок при неправильном запускеРазработчики и продвинутые пользователи
Ручное удаление через админкуПросто и безопасноНе подходит для большого количества категорийМаленькие сайты
×
Сделай свой сайт крутым!

Скидка -20% на премиум плагины WordPress

Выбрать плагин сейчас ⋙