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 アクション内で呼び出し、public・has_archive・show_in_rest を true にします。登録後は必ず wp rewrite flush --hard を実行してください。アーカイブテンプレートは archive-{post_type}.php で作成できます。