В процессе разработки и эксплуатации сайта на WordPress часто возникает ситуация, когда регистрируются кастомные типы записей (CPT), которые со временем перестают использоваться. Они продолжают занимать место в базе данных, могут создавать путаницу в админке и даже влиять на производительность. В этой статье подробно разберём, как безопасно удалить неиспользуемые типы постов в WordPress с помощью кода, чтобы очистить базу и интерфейс.
Почему важно удалять неиспользуемые типы постов
Типы постов в WordPress — это сущности, которые определяют структуру и отображение контента. При разработке сайтов часто создают CPT для каталогов, портфолио, отзывов и пр. Если такой тип поста больше не нужен, его удаление поможет:
- Упростить админ-панель, убрав ненужные пункты меню.
- Освободить базу данных от записей, которые не используются.
- Повысить скорость загрузки страниц и админки.
- Избежать конфликтов с другими плагинами, которые могут реагировать на CPT.
Однако удалить тип поста не так просто, как кажется, потому что WordPress не предоставляет встроенных средств для удаления CPT и связанных с ним данных. Поэтому придётся делать это вручную через код и SQL-запросы.
Как определить, какие типы постов не используются
Перед удалением важно определить, какие именно типы постов вы хотите удалить. Для этого можно воспользоваться запросом к базе или посмотреть список зарегистрированных типов через админку или с помощью кода.
Получение списка всех типов постов через код
Добавьте следующий код в файл темы functions.php или в плагин для разработчика, чтобы вывести все зарегистрированные типы постов:
function yelly_get_all_post_types() {
$post_types = get_post_types([], 'names');
echo '<pre>';
print_r($post_types);
echo '</pre>';
}
add_action('admin_notices', 'yelly_get_all_post_types');Этот код выведет массив всех типов постов, зарегистрированных на сайте. Изучив его, вы сможете определить, какие CPT устарели.
Проверка количества записей в типах постов
Для удаления неиспользуемых типов постов важно убедиться, что в них нет данных или они не нужны. Для этого можно выполнить SQL-запрос в phpMyAdmin или через WP CLI для подсчёта количества записей:
SELECT post_type, COUNT(*) AS count FROM wp_posts GROUP BY post_type;Замените wp_ на префикс вашей базы. Так вы увидите, сколько записей есть в каждом типе.
Как удалить кастомный тип поста в WordPress
Удаление типа поста состоит из двух этапов:
- Отменить регистрацию CPT, чтобы WordPress перестал его видеть.
- Удалить все записи этого типа из базы данных.
Отмена регистрации типа поста
Обычно CPT регистрируются через функцию register_post_type() в коде темы или плагине. Чтобы «удалить» тип поста, нужно перестать его регистрировать — то есть удалить или закомментировать этот код. Но если CPT зарегистрирован плагином, то деактивация плагина может помочь.
Если же CPT регистрируется динамически, и вы хотите временно скрыть его без удаления кода, можно воспользоваться хаком:
function yelly_unregister_post_type() {
unregister_post_type('my_custom_post_type');
}
add_action('init', 'yelly_unregister_post_type', 100);Замените my_custom_post_type на название вашего типа. Этот код отменит регистрацию CPT после стандартной и скроет его из админки.
Удаление всех записей типа поста
После отмены регистрации CPT записи остаются в базе. Их нужно удалить вручную. Для этого можно использовать SQL-запрос:
DELETE FROM wp_posts WHERE post_type = 'my_custom_post_type';И не забудьте очистить связанные метаданные:
DELETE pm FROM wp_postmeta pm
INNER JOIN wp_posts p ON pm.post_id = p.ID
WHERE p.post_type = 'my_custom_post_type';Если вы хотите сделать это через код в WordPress, используйте следующий пример функции:
function yelly_delete_custom_post_type_posts($post_type) {
$args = [
'post_type' => $post_type,
'post_status' => 'any',
'posts_per_page' => -1,
'fields' => 'ids',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true); // true — без перемещения в корзину
}
}
}
// Вызов функции для удаления записей
// yelly_delete_custom_post_type_posts('my_custom_post_type');Такой код удалит все записи CPT программно, что безопаснее, чем прямой SQL, особенно на больших сайтах.
Очистка таксономий и метаданных, связанных с CPT
Кастомные типы постов часто связаны с таксономиями — категориями, тегами или своими. Их тоже нужно удалить, иначе в базе останутся «мертвые» данные.
Для удаления таксономий, связанных с CPT, можно использовать SQL:
DELETE FROM wp_term_relationships WHERE object_id IN (
SELECT ID FROM wp_posts WHERE post_type = 'my_custom_post_type'
);Или в коде через функции WordPress:
function yelly_delete_term_relationships($post_type) {
global $wpdb;
$post_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = %s",
$post_type
));
if (!empty($post_ids)) {
foreach ($post_ids as $post_id) {
wp_delete_object_term_relationships($post_id, 'category'); // замените 'category' на нужную таксономию
}
}
}Не забудьте заменить 'category' на свои таксономии, если они есть.
Полезные плагины для управления типами постов
Если вы не хотите работать с кодом напрямую, можно использовать плагины, которые помогают управлять CPT:
- Clearfy Pro — плагин для оптимизации и управления функционалом сайта, в том числе отключения неиспользуемых CPT.
- WPRemark — позволяет гибко управлять метаданными и типами записей.
Использование таких плагинов упрощает работу и снижает риск ошибок.
Резюме и рекомендации по безопасности
Удаление неиспользуемых типов постов — важный шаг для поддержания чистоты и производительности сайта. Однако перед удалением обязательно сделайте резервную копию базы данных. Проверяйте, что удаляемые данные действительно не нужны, и не удаляйте системные типы постов, такие как post, page и т.п.
Используйте программные методы удаления через WP API для большей безопасности, а SQL-запросы применяйте с осторожностью и только если уверены в своих действиях.
Следуя этим рекомендациям, вы улучшите качество кода и структуру сайта на WordPress, что положительно скажется на скорости и удобстве управления контентом.