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の予約語(post・page・attachment等)と重複しないようにしてください。 show_in_rest => trueの設定がないとGutenbergブロックエディタが使えません。REST APIを使わない場合でも設定を推奨します。- パーマリンクのフラッシュは本番環境では頻繁に行わないでください。フラッシュはオプションテーブルを書き換えるため、高トラフィック時はパフォーマンスに影響します。
まとめ
カスタム投稿タイプは「register_post_type()登録→パーマリンクフラッシュ→テンプレート作成→WP_Queryで取得」の流れで実装します。プラグインとして実装することで、テーマ変更時もデータが失われません。関連記事:WordPressでカスタムタクソノミーを作成する方法、WordPressのREST APIでカスタムエンドポイントを作成する方法。