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

В процессе работы с WordPress иногда возникает необходимость массово удалить все записи, принадлежащие к одной конкретной категории. Это может быть связано с редизайном сайта, сменой структуры контента или очисткой устаревших материалов. В этой статье мы рассмотрим, как удалить все посты из одной категории в WordPress без риска потерять важные данные и с минимальными усилиями.

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

Простое удаление категории в админке WordPress не удалит посты — они останутся без категории или с другой, назначенной по умолчанию. Если же требуется именно удалить все записи, то нужно делать это осознанно, чтобы не повредить структуру сайта и не потерять важный контент.

Кроме того, массовое удаление через админку может быть неудобным и занимать много времени, особенно если постов много. Поэтому автоматизация процесса с помощью кода или специальных плагинов — лучший вариант.

Как удалить все посты из категории с помощью WP_Query и кода

Для опытных разработчиков самый надежный способ — написать кастомный PHP-скрипт, который выберет все посты из нужной категории и удалит их программно. Ниже пример функции для файла functions.php вашей темы или в отдельном плагине:

function wpcom_delete_posts_by_category($category_slug) {
    // Получаем ID категории по слагу
    $category = get_category_by_slug($category_slug);
    if (!$category) {
        return 'Категория не найдена';
    }
    $cat_id = $category->term_id;

    // Параметры запроса
    $args = array(
        'category' => $cat_id,
        'posts_per_page' => -1,
        'post_type' => 'post',
        'post_status' => 'any',
        'fields' => 'ids' // Получаем только ID
    );

    $posts = get_posts($args);
    if (empty($posts)) {
        return 'Посты не найдены в категории';
    }

    foreach ($posts as $post_id) {
        wp_delete_post($post_id, true); // true - удаляет без возможности восстановления
    }

    return count($posts) . ' постов удалено из категории "' . $category_slug . '"';
}

Использование:

echo wpcom_delete_posts_by_category('novosti');

Где 'novosti' — слаг категории, из которой нужно удалить все посты.

Обратите внимание, что функция удаляет посты без возможности восстановления, поэтому перед использованием сделайте резервную копию базы данных.

Удаление постов через WP-CLI: быстро и удобно

Если у вас есть доступ к командной строке сервера, WP-CLI — отличный инструмент для массовых операций. Удалить все посты из категории можно так:

wp post delete $(wp post list --category=slug_kategorii --format=ids) --force

Где slug_kategorii — слаг вашей категории.

Этот способ очень быстрый и не требует написания кода, но требует доступа к серверу и установленного WP-CLI.

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

Если вы не хотите работать с кодом или консолью, есть несколько плагинов, которые позволяют фильтровать и массово удалять записи:

  • Bulk Delete — позволяет удалять записи по различным критериям, включая категории, метки, дату публикации и т.д.
  • WP Bulk Delete — мощный инструмент с возможностью настроить условия удаления, например, удалить только опубликованные посты из выбранной категории.

После установки и активации плагина в его настройках выбираете категорию и параметры удаления. Обязательно внимательно читайте предупреждения и делайте резервные копии.

Пример использования плагина Bulk Delete

1. Установите и активируйте плагин Bulk Delete.

2. Перейдите в меню Bulk WP > Delete Posts.

3. В разделе Delete By Category выберите нужную категорию.

4. Укажите дополнительные фильтры, если нужно (например, статус постов).

5. Нажмите кнопку для удаления. Плагин удалит все подходящие записи.

Как избежать ошибок и потери данных при удалении постов

Массовое удаление может привести к нежелательным последствиям, если не подготовиться:

  • Резервное копирование. Перед удалением сделайте полную резервную копию базы данных и файлов сайта.
  • Тестирование на тестовом сайте. Если есть возможность, сначала протестируйте удаление на копии сайта.
  • Понимание, что удаляется. Убедитесь, что удаляете именно те посты, которые нужны, и что это не повредит структуре сайта.
  • Удаление без восстановления. Функция wp_delete_post с параметром true удаляет без возможности восстановления через корзину.

Расширение: удаление постов из нескольких категорий сразу

Если нужно удалять посты из нескольких категорий, можно модифицировать функцию так:

function wpcom_delete_posts_by_categories($category_slugs = array()) {
    if (empty($category_slugs)) {
        return 'Не указаны категории';
    }

    $cat_ids = array();
    foreach ($category_slugs as $slug) {
        $cat = get_category_by_slug($slug);
        if ($cat) {
            $cat_ids[] = $cat->term_id;
        }
    }
    if (empty($cat_ids)) {
        return 'Категории не найдены';
    }

    $args = array(
        'category__in' => $cat_ids,
        'posts_per_page' => -1,
        'post_type' => 'post',
        'post_status' => 'any',
        'fields' => 'ids'
    );

    $posts = get_posts($args);
    if (empty($posts)) {
        return 'Посты не найдены для указанных категорий';
    }

    foreach ($posts as $post_id) {
        wp_delete_post($post_id, true);
    }

    return count($posts) . ' постов удалено из категорий: ' . implode(', ', $category_slugs);
}

Вызов:

echo wpcom_delete_posts_by_categories(array('novosti', 'stati'));

Это удобно, если нужно очистить несколько разделов сайта.

Выводы

Удаление всех постов из одной категории — задача, которую можно решить несколькими способами: с помощью собственного кода, WP-CLI или плагинов. Каждый метод имеет свои преимущества и подходит под разные навыки и условия.

Главное — всегда делать резервные копии и внимательно проверять категории и посты перед удалением, чтобы избежать потерь важных данных.

Сервис определения шаблона и плагинов на сайте