wp-code.ru wordpress WP-Codе

Как программно удалить неиспользуемые типы записей в WordPress

Диагностика: как определить неиспользуемые типы записей (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Быстро, без изменения плагиновТип записи остаётся в БД, но не виденКогда нет доступа к основному коду
Программное удаление записейЧистит базу полностьюРиск потери данных, требует резервной копииПри необходимости полностью удалить данные
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше