При оптимизации сайта на WordPress очень часто возникает необходимость удалить неиспользуемые пользовательские типы записей (Custom Post Types, CPT). Такие записи могут занимать место в базе данных, замедлять работу сайта и создавать путаницу в админке. В этой статье мы подробно рассмотрим, как удалить все записи определенного типа и сам тип записи, не прибегая к установке плагинов.
Почему важно удалять неиспользуемые виды постов
Пользовательские типы записей создаются для специфических целей: портфолио, отзывы, товары и т.п. Если проект меняется, а CPT становится неактуален, то оставлять записи бесполезно:
- Они занимают место в базе данных.
- Создают нагрузку при запросах.
- Могут мешать SEO — если доступны в выдаче.
- Усложняют админ-панель и работу редакторов.
Поэтому важно грамотно от них избавиться без риска повредить сайт.
Удаление записей пользовательского типа через SQL-запрос
Самый быстрый способ — удалить все записи нужного типа напрямую из базы данных. Для этого можно использовать SQL-запросы через phpMyAdmin или консоль MySQL.
Пример запроса для удаления всех записей типа my_custom_type:
DELETE FROM wp_posts WHERE post_type = 'my_custom_type';
DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT ID FROM wp_posts);
Объяснения:
- Первая команда удаляет все записи нужного типа.
- Вторая удаляет связанные мета-данные, чтобы не оставалось мусора.
Важно: перед выполнением запросов сделайте резервную копию базы данных!
Удаление терминов и связей таксономий для CPT
Если у CPT были свои таксономии, то стоит почистить и их связи:
DELETE tr FROM wp_term_relationships tr
LEFT JOIN wp_posts p ON p.ID = tr.object_id
WHERE p.ID IS NULL;
Этот запрос удалит все связи терминов с удаленными постами.
Удаление записей CPT с помощью PHP-кода
Если вы предпочитаете удалять записи программно, например, чтобы добавить проверку или логирование, то подойдет следующий код. Его можно добавить в файл темы или создать отдельный скрипт, который запускается один раз:
function wpclean_delete_cpt_posts( $post_type ) {
$args = [
'post_type' => $post_type,
'posts_per_page' => -1,
'post_status' => 'any',
'fields' => 'ids',
];
$posts = get_posts( $args );
foreach ( $posts as $post_id ) {
wp_delete_post( $post_id, true ); // true — удаление без перемещения в корзину
}
}
// Использование
wpclean_delete_cpt_posts('my_custom_type');
Такой подход удобно применять, если нужно удалить записи с дополнительной логикой.
Как удалить регистрацию CPT из кода
После удаления записей стоит убрать регистрацию CPT из кода сайта (обычно в functions.php или в плагине), чтобы WordPress не продолжал создавать интерфейс для него и не пытался работать с ним.
Пример регистрации CPT:
function wpclean_register_my_cpt() {
register_post_type( 'my_custom_type', [
'labels' => [
'name' => 'Мои записи'
],
'public' => true,
'has_archive' => true,
]);
}
add_action( 'init', 'wpclean_register_my_cpt' );
Чтобы полностью удалить CPT, просто удалите или закомментируйте этот код и очистите кэш сайта.
Рекомендации по безопасности при удалении CPT и записей
Удаление данных напрямую — это всегда риск. Вот несколько советов:
- Обязательно делайте резервную копию базы данных перед началом.
- Выполняйте удаление на тестовой копии сайта, если возможно.
- Удаляйте записи партиями, если их очень много, чтобы избежать таймаутов.
- Проверяйте, не используется ли CPT где-то в шаблонах или плагинах.
Примеры полезных плагинов для управления CPT и оптимизации
Если в будущем понадобится удобный интерфейс для работы с CPT, можно рассмотреть плагины:
- Clearfy — оптимизация и очистка базы данных, в том числе работа с CPT.
- WPRemark — расширенный контроль над комментариями и записями.
Но если хочется полностью контролировать процесс и минимизировать нагрузку, то ручное удаление, описанное выше, — лучший вариант.