В работе с WordPress иногда возникает необходимость массово удалить все записи, относящиеся к определённой категории. Например, вы хотите очистить устаревший раздел сайта или подготовиться к новой структуре контента. В этой статье мы подробно рассмотрим, как удалить все посты из категории в WordPress, используя как готовые плагины, так и собственные решения с помощью кода.
Почему важно правильно удалять посты из категории
Простое удаление категории не удаляет записи, а лишь отвязывает их от этой категории. Если вы хотите полностью избавиться от всех постов в разделе, нужно удалить сами записи. Это важно для поддержания чистоты базы данных и улучшения производительности сайта. При неправильном удалении могут остаться «мусорные» записи или нарушиться структура сайта.
Кроме того, массовое удаление записей вручную через админку неудобно и занимает много времени, особенно если постов много. Автоматизация процесса — оптимальный путь.
Удаление постов из категории с помощью плагинов
Плагин Bulk Delete
Один из самых популярных плагинов для массового удаления постов — Bulk Delete. Он позволяет фильтровать посты по категориям, тегам, статусу и другим параметрам и удалять их пакетно.
Пошаговая инструкция:
- Установите и активируйте плагин Bulk Delete через админку WordPress.
- Перейдите в меню Bulk WP → Bulk Delete Posts.
- В разделе «Delete by Category» выберите нужную категорию.
- Установите параметры удаления: например, удалять только опубликованные записи, или все, включая черновики.
- Нажмите кнопку «Bulk Delete» и подтвердите действие.
Плагин очень удобен, но будьте внимательны: восстановить удалённые записи будет невозможно без резервной копии.
Плагин WP Bulk Delete Pro (платный)
Для более гибких настроек и автоматизации можно рассмотреть WP Bulk Delete Pro. Он поддерживает удаление по более сложным условиям, расписаниям и даже удаление пользовательских типов записей.
Удаление постов из категории через пользовательский PHP-код
Если вы предпочитаете программный подход или хотите встроить удаление в свои инструменты, можно написать функцию, которая удалит все посты из выбранной категории.
Ниже приведён пример функции с префиксом wplog_, которую можно добавить в файл functions.php вашей темы или в отдельный плагин:
function wplog_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 wplog_delete_posts_by_category('novosti');Этот код удалит все посты категории с слагом novosti. Обратите внимание, что удаление происходит без возможности восстановления, поэтому рекомендуется сделать резервную копию базы данных перед запуском.
Особенности и рекомендации
- Функция удаляет все посты, включая черновики и приватные записи.
- Если посты связаны с другими типами контента, удаление может повлиять на структуру сайта.
- Для больших сайтов стоит выполнять удаление пакетами, чтобы избежать таймаута скрипта.
Как удалить посты из категории пакетно, чтобы избежать таймаута
Для сайтов с большим количеством записей лучше удалять посты порциями. Ниже пример улучшенной функции, которая удаляет по 50 постов за один вызов:
function wplog_delete_posts_by_category_batch($category_slug, $batch_size = 50) {
$category = get_category_by_slug($category_slug);
if (!$category) {
return 'Категория не найдена';
}
$cat_id = $category->term_id;
$args = array(
'category' => $cat_id,
'posts_per_page' => $batch_size,
'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) . ' постов удалено в текущем пакете. Запустите функцию снова для продолжения.';
}Такую функцию удобно запускать через WP-CLI или вручную несколько раз до полного удаления.
Обработка ошибок и безопасность при удалении постов
Важно убедиться, что удаление выполняется только авторизованным пользователем с необходимыми правами. Для этого добавьте проверку прав в функцию:
function wplog_delete_posts_by_category_secure($category_slug) {
if (!current_user_can('delete_posts')) {
return 'У вас нет прав на удаление постов';
}
return wplog_delete_posts_by_category($category_slug);
}Также всегда делайте резервные копии сайта перед массовыми действиями. Это позволит восстановить данные в случае ошибки.
Выводы и рекомендации по удалению постов из категории
Удаление всех постов из категории — задача, которая часто возникает при реорганизации контента. Используйте для этого либо проверенные плагины, либо собственные функции с правильной обработкой ошибок и безопасностью.
Обязательно тестируйте действия на тестовом сайте, чтобы избежать потери важных данных. При больших объёмах записей пользуйтесь пакетным удалением.
Если нужны дополнительные функции, например, удаление по датам, тегам или пользовательским типам записей, вы можете доработать приведённые примеры кода под свои задачи.