2026年5月20日

2026年5月20日

WordPressにカスタム投稿タイプを追加する方法

はじめに

WordPressにカスタム投稿タイプ(CPT)を追加するには register_post_type() を使います。ニュース・スタッフ・事例紹介など、標準の「投稿」とは別に独立したコンテンツ管理ができます。

症状・原因

  • ニュースや事例など投稿とは別のコンテンツを管理したい
  • カスタム投稿タイプを追加したがメニューに表示されない
  • アーカイブページが404になる
  • REST APIでカスタム投稿タイプを取得したい

解決手順

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

// functions.php
add_action('init', function(): void {
    register_post_type('news', [
        // 管理画面の表示名
        'labels' => [
            'name'               => 'ニュース',
            'singular_name'      => 'ニュース',
            'add_new_item'       => '新しいニュースを追加',
            'edit_item'          => 'ニュースを編集',
            'new_item'           => '新規ニュース',
            'view_item'          => 'ニュースを表示',
            'search_items'       => 'ニュースを検索',
            'not_found'          => 'ニュースが見つかりません',
            'not_found_in_trash' => 'ゴミ箱にニュースはありません',
        ],

        // 公開設定
        'public'       => true,       // フロントエンドに表示
        'has_archive'  => true,       // アーカイブページを有効化
        'show_in_rest' => true,       // Gutenbergエディタ・REST API対応

        // パーマリンク設定
        'rewrite' => [
            'slug'       => 'news',   // URL: /news/{slug}/
            'with_front' => false,    // ベースURLを追加しない
        ],

        // サポートする機能
        'supports' => [
            'title',
            'editor',
            'thumbnail',
            'excerpt',
            'author',
            'revisions',
        ],

        // メニュー設定
        'menu_position' => 5,         // 「投稿」の下
        'menu_icon'     => 'dashicons-megaphone',

        // 管理画面での表示
        'show_ui'           => true,
        'show_in_menu'      => true,
        'show_in_nav_menus' => true,
    ]);
});

ステップ2:パーマリンクを更新する

# カスタム投稿タイプ登録後は必ずパーマリンクを更新
wp rewrite flush --hard

# 登録されているカスタム投稿タイプを確認
wp post-type list --format=table

# カスタム投稿タイプの情報を確認
wp post-type get news --format=json

ステップ3:複数のカスタム投稿タイプをまとめて登録する

// functions.php
add_action('init', function(): void {
    $post_types = [
        'news' => [
            'name'      => 'ニュース',
            'slug'      => 'news',
            'icon'      => 'dashicons-megaphone',
            'supports'  => ['title', 'editor', 'thumbnail'],
        ],
        'staff' => [
            'name'      => 'スタッフ',
            'slug'      => 'staff',
            'icon'      => 'dashicons-admin-users',
            'supports'  => ['title', 'editor', 'thumbnail', 'excerpt'],
        ],
        'case_study' => [
            'name'      => '事例',
            'slug'      => 'cases',
            'icon'      => 'dashicons-portfolio',
            'supports'  => ['title', 'editor', 'thumbnail'],
        ],
    ];

    foreach ($post_types as $type => $config) {
        register_post_type($type, [
            'labels'       => ['name' => $config['name'], 'singular_name' => $config['name']],
            'public'       => true,
            'has_archive'  => true,
            'show_in_rest' => true,
            'rewrite'      => ['slug' => $config['slug'], 'with_front' => false],
            'supports'     => $config['supports'],
            'menu_icon'    => $config['icon'],
        ]);
    }
});

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

# REST API エンドポイントを確認
wp eval "echo rest_url('wp/v2/news');"

# ブラウザまたはcurlで取得
# https://example.com/wp-json/wp/v2/news
// フロントエンドからJSで取得
fetch('/wp-json/wp/v2/news?per_page=5')
    .then(r => r.json())
    .then(posts => {
        posts.forEach(post => {
            console.log(post.title.rendered, post.link);
        });
    });

ステップ5:WP-CLIでカスタム投稿タイプの記事を操作する

# カスタム投稿タイプの記事を作成
wp post create \
    --post_type=news \
    --post_title="重要なお知らせ" \
    --post_status=publish \
    --porcelain

# 一覧表示
wp post list --post_type=news --format=table

# 記事数を確認
wp post list --post_type=news --post_status=publish --format=count

注意事項

  • register_post_type()init アクション内で呼び出してください。早すぎると機能が利用できない場合があります
  • has_archive => true を設定した後は wp rewrite flush --hard が必須です
  • show_in_rest => true を設定しないとGutenbergエディタが使えません(クラシックエディタが表示される)
  • プラグインを使う場合は Custom Post Type UI(CPT UI)が手軽です

まとめ

register_post_type()init アクション内で呼び出し、publichas_archiveshow_in_resttrue にします。登録後は必ず wp rewrite flush --hard を実行してください。アーカイブテンプレートは archive-{post_type}.php で作成できます。

お気軽にご相談ください

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