В работе с 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_post — true).
Пояснения к коду
get_posts с параметром 'fields' => 'ids' возвращает только ID записей, что экономит память при большом количестве постов.
Параметр post_status => 'any' учитывает все статусы постов, в том числе черновики и опубликованные.
Функция возвращает строку с результатом удаления — удобно для отладки.
Удаление постов из категории через плагин Bulk Delete
Для тех, кто не хочет копаться в коде, есть удобный плагин Bulk Delete.
Этот плагин позволяет удалять посты по множеству критериев, включая категории, теги, дату и статус.
Чтобы удалить все посты из категории:
- Установите и активируйте плагин Bulk Delete.
- Перейдите в меню Bulk WP > Bulk Delete Posts.
- Выберите опцию удаления постов по категории.
- Отметьте нужную категорию и задайте дополнительные параметры.
- Нажмите кнопку удаления.
Плюс плагина — безопасность и визуальный контроль. Минус — в зависимости от количества постов процесс может занять время.
Как обеспечить безопасность при массовом удалении
При удалении большого количества данных всегда есть риск ошибок и потери важной информации. Чтобы минимизировать риски:
- Всегда делайте резервную копию базы данных и файлов сайта.
- Тестируйте функции удаления на тестовом или локальном сайте.
- Если используете кастомный код, добавляйте проверки и логирование.
- Понимайте, что удаление с параметром
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. В любом случае, не забывайте о резервном копировании и тестировании. Используйте приведённые в статье примеры кода как основу и адаптируйте под свои задачи.