Диагностика: как определить неиспользуемые типы записей (post types)
Для начала нужно понять, какие типы записей зарегистрированы на вашем сайте и действительно ли они используются. Часто после установки плагинов или тем остаются кастомные типы, которые не нужны, но нагружают базу данных и интерфейс админки.
Проверка зарегистрированных типов записей:
global $wp_post_types;
foreach ( $wp_post_types as $post_type ) {
echo $post_type->name . " - " . $post_type->label . "\n";
}Далее проверяем количество записей для каждого типа:
function count_posts_by_type( $post_type ) {
$count = wp_count_posts( $post_type );
return array_sum( (array) $count );
}
$post_types = get_post_types( [], 'names' );
foreach ( $post_types as $type ) {
echo "$type: " . count_posts_by_type( $type ) . " записей\n";
}Если у типа ноль записей и он не нужен для функционала сайта — его можно удалить.
Пошаговое решение: удаление неиспользуемого типа записи
1. Отключение регистрации типа записи
Лучший способ — убрать регистрацию типа записи из кода темы или плагина. Если это невозможно, можно программно отключить регистрацию через хук register_post_type_args:
add_filter( 'register_post_type_args', function( $args, $post_type ) {
$types_to_remove = [ 'unused_type', 'old_type' ]; // укажите имена ненужных типов
if ( in_array( $post_type, $types_to_remove ) ) {
return false; // предотвращаем регистрацию
}
return $args;
}, 10, 2 );2. Удаление записей из базы
Для удаления используйте следующий код. Он удалит все записи указанного типа безопасно, учитывая все связанные данные:
function delete_all_posts_of_type( $post_type ) {
$posts = get_posts([
'post_type' => $post_type,
'numberposts' => -1,
'post_status' => 'any',
'fields' => 'ids',
]);
foreach ( $posts as $post_id ) {
wp_delete_post( $post_id, true ); // принудительное удаление без перемещения в корзину
}
}
delete_all_posts_of_type( 'unused_type' );3. Очистка метаданных и таксономий
Удаление постов не всегда удаляет метаданные и таксономии. Добавьте очистку вручную при необходимости:
global $wpdb;
// Удаление метаданных
$wpdb->query( $wpdb->prepare( "DELETE pm FROM {$wpdb->postmeta} pm INNER JOIN {$wpdb->posts} p ON pm.post_id = p.ID WHERE p.post_type = %s", 'unused_type' ) );
// Удаление связей таксономий
$wpdb->query( $wpdb->prepare( "DELETE tr FROM {$wpdb->term_relationships} tr INNER JOIN {$wpdb->posts} p ON tr.object_id = p.ID WHERE p.post_type = %s", 'unused_type' ) );Проверка результата после внедрения
После удаления:
- Повторите скрипт подсчёта записей для проверяемого типа — должно быть 0.
- Проверьте в админке WordPress, что тип записи не отображается в меню.
- Обратите внимание на ошибки 404 для URL старых записей — если они остались, настройте редиректы.
Частые ошибки и как исправить
- Тип записи не удаляется из меню: возможно, зарегистрирован через плагин с высоким приоритетом. Используйте фильтр
register_post_type_argsс приоритетом 100. - Записи не удаляются полностью: wp_delete_post с параметром
$force_delete = falseперемещает посты в корзину вместо удаления. Убедитесь, что используетеtrue. - Метаданные и таксономии остаются: вручную удалите через SQL-запросы, как показано выше.
- Ошибки в админке после удаления: очистите кэш и обновите постоянные ссылки (Settings → Permalinks → Save).
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы.
- Для больших сайтов удаляйте записи партиями по 100-200 штук во избежание перегрузки сервера.
- Удаление через код лучше запускать один раз, потом удалять код из functions.php.
- Отключайте типы записей через фильтр, а не удаляйте напрямую, чтобы избежать конфликтов с плагинами.
Сравнение способов удаления неиспользуемых типов записей
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Удаление кода регистрации типа | Чисто, без нагрузки на БД | Нужно иметь доступ к коду темы/плагина | Если возможно редактировать темы/плагины |
Фильтр register_post_type_args | Быстро, без изменения плагинов | Тип записи остаётся в БД, но не виден | Когда нет доступа к основному коду |
| Программное удаление записей | Чистит базу полностью | Риск потери данных, требует резервной копии | При необходимости полностью удалить данные |