2026年8月12日

2026年8月12日

WordPressでカスタム投稿タイプを登録する方法・register_post_type()完全ガイド

はじめに

「ブログ記事とは別に「事例紹介」や「商品」を管理したい」「カスタムフィールドを持つ独自コンテンツ管理が必要」——register_post_type()を使えば、WordPressの標準投稿・固定ページとは独立したカスタム投稿タイプを作成できます。

症状・原因

カスタム投稿タイプを正しく登録しないと、URLが404になる・管理画面に表示されない・REST APIで取得できないなどの問題が発生します。特にパーマリンクのフラッシュを忘れると404エラーになります。

解決手順

ステップ1:カスタム投稿タイプを登録する

// functions.php またはプラグインファイルに追加
add_action( 'init', 'my_register_post_types' );

function my_register_post_types() {
    $labels = [
        'name'               => '事例紹介',
        'singular_name'      => '事例',
        'add_new'            => '新規追加',
        'add_new_item'       => '新しい事例を追加',
        'edit_item'          => '事例を編集',
        'new_item'           => '新しい事例',
        'view_item'          => '事例を表示',
        'search_items'       => '事例を検索',
        'not_found'          => '事例が見つかりません',
        'not_found_in_trash' => 'ゴミ箱に事例はありません',
        'menu_name'          => '事例紹介',
    ];

    register_post_type( 'case_study', [
        'labels'              => $labels,
        'public'              => true,       // 公開する
        'show_ui'             => true,       // 管理画面に表示
        'show_in_menu'        => true,       // メニューに表示
        'show_in_rest'        => true,       // REST API / Gutenberg 対応
        'menu_icon'           => 'dashicons-portfolio',
        'supports'            => [ 'title', 'editor', 'thumbnail', 'excerpt', 'custom-fields' ],
        'has_archive'         => true,       // アーカイブページあり(/case-study/)
        'rewrite'             => [ 'slug' => 'case-study' ],
        'menu_position'       => 5,
        'capability_type'     => 'post',     // 権限タイプ
        'hierarchical'        => false,      // 階層なし(ページ型にする場合はtrue)
        'taxonomies'          => [ 'category', 'post_tag' ], // 既存タクソノミーを利用
    ] );
}

ステップ2:パーマリンクをフラッシュする

# 登録後にパーマリンクを必ずフラッシュ(404解消)
wp rewrite flush

# または管理画面から
# 設定 → パーマリンク → 変更を保存(何も変えなくてよい)

# 登録されているかを確認
wp post-type list
wp post-type get case_study --format=json

プラグインで自動フラッシュする場合:

// プラグイン有効化時に自動フラッシュ
register_activation_hook( __FILE__, function() {
    my_register_post_types(); // 先に登録
    flush_rewrite_rules();    // その後フラッシュ
} );

// プラグイン無効化時にもフラッシュ
register_deactivation_hook( __FILE__, function() {
    unregister_post_type( 'case_study' );
    flush_rewrite_rules();
} );

ステップ3:REST APIでカスタム投稿タイプを取得する

# REST APIでカスタム投稿タイプの一覧を取得
curl https://example.com/wp-json/wp/v2/case-study

# 特定の投稿を取得
curl https://example.com/wp-json/wp/v2/case-study/123

# WP-CLIで投稿を作成
wp post create \
  --post_type=case_study \
  --post_title="株式会社XXXの導入事例" \
  --post_status=publish
// REST APIのエンドポイントにカスタムフィールドを追加
add_action( 'rest_api_init', function() {
    register_rest_field( 'case_study', 'client_name', [
        'get_callback'    => fn( $post ) => get_post_meta( $post['id'], 'client_name', true ),
        'update_callback' => fn( $value, $post ) => update_post_meta( $post->ID, 'client_name', sanitize_text_field( $value ) ),
        'schema'          => [ 'type' => 'string', 'description' => 'クライアント名' ],
    ] );
} );

ステップ4:カスタム投稿タイプ専用テンプレートを作成する

テーマディレクトリに以下のテンプレートファイルを作成:

single-case_study.php  → 個別ページテンプレート
archive-case_study.php → アーカイブページテンプレート
// single-case_study.php の基本構造
get_header();
if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        echo '<h1>' . get_the_title() . '</h1>';
        echo '<div class="client">' . get_post_meta( get_the_ID(), 'client_name', true ) . '</div>';
        the_content();
    endwhile;
endif;
get_footer();

ステップ5:WP_Queryでカスタム投稿タイプを取得する

// カスタム投稿タイプの最新10件を取得
$query = new WP_Query( [
    'post_type'      => 'case_study',
    'posts_per_page' => 10,
    'post_status'    => 'publish',
    'orderby'        => 'date',
    'order'          => 'DESC',
    'tax_query'      => [
        [
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => 'featured',
        ],
    ],
] );

while ( $query->have_posts() ) {
    $query->the_post();
    echo '<article>';
    echo '<h2>' . get_the_title() . '</h2>';
    echo '<p>' . get_the_excerpt() . '</p>';
    echo '</article>';
}
wp_reset_postdata();

注意事項

  • カスタム投稿タイプのスラッグ(case_study)は20文字以内で、WordPressの予約語(postpageattachment等)と重複しないようにしてください。
  • show_in_rest => trueの設定がないとGutenbergブロックエディタが使えません。REST APIを使わない場合でも設定を推奨します。
  • パーマリンクのフラッシュは本番環境では頻繁に行わないでください。フラッシュはオプションテーブルを書き換えるため、高トラフィック時はパフォーマンスに影響します。

まとめ

カスタム投稿タイプは「register_post_type()登録→パーマリンクフラッシュ→テンプレート作成→WP_Queryで取得」の流れで実装します。プラグインとして実装することで、テーマ変更時もデータが失われません。関連記事:WordPressでカスタムタクソノミーを作成する方法WordPressのREST APIでカスタムエンドポイントを作成する方法

お気軽にご相談ください

お見積りへ お問い合わせへ