WordPressでカスタム投稿タイプを作るなら、登録用のコードを小さな自作プラグインにまとめる方法がおすすめです。
テーマのfunctions.phpに書くと、テーマを切り替えたときに投稿タイプが管理画面から消えてしまうためです。
コードを書かずに作りたい場合は、Custom Post Type UIのようなプラグインで登録する方法もあります。
この記事は、制作実績・お知らせ・商品などを、通常の投稿とは別の一覧やURLで管理したい方に向けたものです。
掲載したコードは、2026年10月15日にWordPress 7.1.3(PHP 8.0)のサイトで読み込ませ、登録される設定値とアーカイブのURLを確認しました。
確認はデータベースに書き込まない方法で行ったため、実際に記事を投稿して表示するところまでは試していません。
カスタム投稿タイプが向いている場面
カスタム投稿タイプは、通常の「投稿」とは別の種類の記事を作る仕組みです。
管理画面のメニュー、記事のURL、一覧ページを、通常の投稿と分けられます。
| やりたいこと | 向いている方法 |
|---|---|
| ブログ記事とは別に、制作実績や商品を専用の一覧で見せたい | カスタム投稿タイプ |
| URLを「/works/記事名/」のように分けたい | カスタム投稿タイプ |
| 同じブログ記事の中で、話題ごとに分けたいだけ | カテゴリーやタグ |
| 記事ごとに価格や日付など決まった項目を入力したい | カスタム投稿タイプに、カスタムフィールドを組み合わせる |
ブログ記事を話題ごとに分けたいだけなら、カテゴリーで足ります。
登録の方法は2つ
| 方法 | よい点 | 注意点 |
|---|---|---|
| 自作プラグインにコードを書く | 設定がファイルとして残り、テーマを変えても消えない | PHPのファイルを編集する必要がある |
| Custom Post Type UIなどのプラグインを使う | 管理画面の入力欄だけで登録できる | 登録内容がそのプラグインに依存する |
WordPressの公式リファレンスでは、テーマの中で登録すると、別のテーマに切り替えたときに投稿タイプが管理画面から消えると説明されています(WordPress公式:register_post_type())。
投稿したデータはデータベースに残りますが、もう一度登録するまで管理画面から編集できなくなります。
Custom Post Type UIは、2026年10月15日に確認したWordPress.orgの配布ページで、バージョン1.19.3、WordPress 7.0.7までテスト済みと表示されていました(WordPress.org:Custom Post Type UI)。
使っているWordPressのバージョンと、配布ページの表示を照らし合わせてから導入してください。
コードで登録する手順
ここでは、制作実績を載せる投稿タイプを例にします。
- サーバーの「wp-content/plugins」の中に「mysite-works」というフォルダーを作る
- フォルダーの中に「mysite-works.php」というファイルを作り、下のコードを保存する
- 管理画面の「プラグイン」で「制作実績の投稿タイプ」を有効にする
- 管理画面の左のメニューに「制作実績」が追加されたことを確かめる
<?php
/**
* Plugin Name: 制作実績の投稿タイプ
*/
add_action( 'init', 'mysite_register_works' );
function mysite_register_works() {
register_post_type(
'mysite_works',
array(
'labels' => array(
'name' => '制作実績',
'singular_name' => '制作実績',
'add_new_item' => '制作実績を追加',
'edit_item' => '制作実績を編集',
),
'public' => true,
'has_archive' => true,
'show_in_rest' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-portfolio',
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
'rewrite' => array( 'slug' => 'works' ),
)
);
}
register_activation_hook( __FILE__, 'mysite_works_activate' );
function mysite_works_activate() {
mysite_register_works();
flush_rewrite_rules();
}コードの中の主な設定は、次のとおりです。
| 設定 | 意味 | 例の値 |
|---|---|---|
| 投稿タイプの識別子 | データベースに保存される名前。20文字以内で、英小文字・数字・ハイフン・アンダースコアだけが使える | mysite_works |
| public | サイトの訪問者に公開する | true |
| has_archive | 一覧ページ(アーカイブ)を作る | true |
| show_in_rest | ブロックエディターとREST APIで使えるようにする | true |
| supports | 編集画面で使う機能(タイトル、本文、アイキャッチ、抜粋など) | title、editor、thumbnail、excerpt |
| rewrite | URLに使う文字列 | works |
| menu_icon | 管理メニューのアイコン | dashicons-portfolio |
識別子の先頭には、サイトや会社を表す短い文字を付けておくと、ほかのプラグインと名前がぶつかりにくくなります。
WordPressの公式ハンドブックでは、識別子に「wp_」を使わないよう注意しています(WordPress公式:Registering Custom Post Types)。
2026年10月15日の確認では、このコードでアーカイブのURLが「サイトのURL/works/」になり、ブロックエディターとREST APIで使える設定で登録されました。
404になるときは、パーマリンクの設定を保存し直す
投稿タイプを登録しただけでは、新しいURLのルールが反映されず、記事や一覧のページが404になることがあります。
2026年10月15日の確認でも、登録しただけの段階では、「works」のURLのルールはデータベースに保存されていませんでした。
WordPressの公式リファレンスでは、プラグインで登録する場合、有効化のときにURLのルールを作り直す処理(flush_rewrite_rules)を呼ぶよう案内しています。
上のコードの後半は、そのための処理です。
ファイルを書き換えた後などで404が続く場合は、管理画面の「設定」から「パーマリンク」を開き、何も変えずに「変更を保存」を押してください。
パーマリンクの設定が「/blog/%postname%/」のように先頭に固定の文字列を含む場合、初期設定ではカスタム投稿タイプのURLにもその文字列が付きます。
付けたくない場合は、rewriteの設定に'with_front' => falseを加えます。
一覧ページと個別ページを表示する
カスタム投稿タイプの個別ページは、テーマに「single-投稿タイプ名.php」があればそのファイル、なければ「single.php」で表示されます。
一覧ページは「archive-投稿タイプ名.php」、なければ「archive.php」です(WordPress公式:Custom Post Type Template Files)。
例の投稿タイプなら、専用のテンプレートのファイル名は「single-mysite_works.php」と「archive-mysite_works.php」です。
SWELLにはsingle.phpとarchive.phpがあるため、専用のテンプレートを作らなくても表示自体はできます。
見た目を変えたい場合は、子テーマに専用のテンプレートを作ります。
SWELLの投稿リストブロックで表示する
トップページなどにカスタム投稿タイプの一覧を並べたい場合は、SWELLの投稿リストブロックの「投稿タイプで絞り込む」で投稿タイプを選びます。
SWELL 2.19.0では、この選択肢をREST APIから取得した投稿タイプの一覧から作っています。
そのため、show_in_restをtrueにしていない投稿タイプは選択肢に出ません。
関連記事の表示を投稿タイプで絞る方法は、SWELLで投稿タイプやカスタムタクソノミーを指定して関連記事を表示する方法で紹介しています。
登録した後に確かめること
- 管理メニューに投稿タイプが表示される
- 「新規追加」を押すと、ブロックエディターが開く
- 公開した記事のURLと、一覧ページのURLが404にならない
- SEOプラグインの設定で、検索結果に出すかどうかが意図どおりになっている
- テーマを切り替える予定がある場合、登録のコードがテーマの外にある
SEO SIMPLE PACK 3.7.0の初期値では、カスタム投稿タイプの個別ページはインデックスさせる設定、一覧ページ(アーカイブ)はnoindexです。
一覧ページも検索結果に出したい場合は、WordPressのnoindex設定方法を参考に設定を見直してください。
よくあるつまずき
編集画面がブロックエディターにならない
show_in_restがtrueになっているかを確かめます。
WordPressの公式リファレンスでも、ブロックエディターで使うにはこの設定をtrueにするよう説明されています。
あとから識別子を変えたい
識別子を変えると、すでに投稿した記事は古い識別子のままデータベースに残り、新しい投稿タイプの一覧には出てきません。
投稿済みの記事がある場合は、データベースのバックアップを取ってから移し替える作業が必要です。
REST APIで記事を読み書きする方法は、WordPress REST APIとは?できること・エンドポイント一覧で説明しています。



