wp-code.ru wordpress WP-Codе

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

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

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

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

Поэтому рекомендуется использовать встроенные функции WordPress для удаления постов, которые автоматически очищают все связанные элементы.

В дополнение, перед массовым удалением советуем сделать полную резервную копию сайта и базы данных.

Массовое удаление постов из категории через WP-CLI

Если у вас есть доступ к командной строке сервера, самый быстрый способ — использовать WP-CLI.

Команда для удаления всех постов из категории с ID 5 выглядит так:

wp post delete $(wp post list --category=5 --field=ID) --force

Разберём шаги:

  • wp post list --category=5 --field=ID — выводит список ID постов в категории с ID 5.
  • wp post delete ... --force — удаляет посты без помещения в корзину.

Этот метод очень эффективен, но требует аккуратности, так как удалённые данные восстановить будет сложно.

Удаление постов из категории программно через PHP

Если WP-CLI недоступен, можно написать функцию на PHP и добавить её в файл functions.php вашей темы или в отдельный плагин.

Ниже пример функции wpcode_delete_posts_by_category, которая удаляет все публикации из указанной категории по её слагу.

function wpcode_delete_posts_by_category($category_slug) {
    $args = [
        'category_name' => $category_slug,
        'post_type' => 'post',
        'posts_per_page' => -1,
        'fields' => 'ids',
        'post_status' => 'any'
    ];
    $posts = get_posts($args);
    if (empty($posts)) {
        return 'Посты не найдены в категории ' . $category_slug;
    }
    foreach ($posts as $post_id) {
        wp_delete_post($post_id, true); // true - удаление без корзины
    }
    return 'Удалено ' . count($posts) . ' постов из категории ' . $category_slug;
}

Используйте эту функцию так:

echo wpcode_delete_posts_by_category('novosti');

Где 'novosti' — это слаг категории.

Обратите внимание, что функция удаляет все посты безвозвратно (вторая переменная в wp_delete_posttrue).

Пояснения к коду

get_posts с параметром 'fields' => 'ids' возвращает только ID записей, что экономит память при большом количестве постов.

Параметр post_status => 'any' учитывает все статусы постов, в том числе черновики и опубликованные.

Функция возвращает строку с результатом удаления — удобно для отладки.

Удаление постов из категории через плагин Bulk Delete

Для тех, кто не хочет копаться в коде, есть удобный плагин Bulk Delete.

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

Чтобы удалить все посты из категории:

  1. Установите и активируйте плагин Bulk Delete.
  2. Перейдите в меню Bulk WP > Bulk Delete Posts.
  3. Выберите опцию удаления постов по категории.
  4. Отметьте нужную категорию и задайте дополнительные параметры.
  5. Нажмите кнопку удаления.

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

Как обеспечить безопасность при массовом удалении

При удалении большого количества данных всегда есть риск ошибок и потери важной информации. Чтобы минимизировать риски:

  • Всегда делайте резервную копию базы данных и файлов сайта.
  • Тестируйте функции удаления на тестовом или локальном сайте.
  • Если используете кастомный код, добавляйте проверки и логирование.
  • Понимайте, что удаление с параметром wp_delete_post($id, true) удаляет посты без возможности восстановления из корзины.
  • При большом объёме данных разбивайте удаление на части, чтобы избежать проблем с таймаутами и нагрузкой.

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

Если постов очень много, удалять все сразу не стоит. Вот пример функции, которая удаляет посты пакетами по 50 штук:

function wpcode_delete_posts_batch($category_slug, $batch_size = 50) {
    $args = [
        'category_name' => $category_slug,
        'post_type' => 'post',
        'posts_per_page' => $batch_size,
        'fields' => 'ids',
        'post_status' => 'any'
    ];
    $posts = get_posts($args);
    if (empty($posts)) {
        return 'Посты для удаления не найдены.';
    }
    foreach ($posts as $post_id) {
        wp_delete_post($post_id, true);
    }
    return 'Удалено ' . count($posts) . ' постов из категории ' . $category_slug;
}

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

Итоги

Удаление всех постов из категории — задача, которая требует аккуратного подхода. Вы можете использовать WP-CLI, написать собственный PHP-скрипт или применить плагин Bulk Delete. В любом случае, не забывайте о резервном копировании и тестировании. Используйте приведённые в статье примеры кода как основу и адаптируйте под свои задачи.

×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше