メインコンテンツへスキップ

カスタム投稿タイプ設計で気をつけている3つのこと – NPC

(更新: 2026.04.10)

カスタム投稿タイプ、なんとなくで作っていないか

WordPressでサイトを作っていると、「これ、固定ページでも投稿でもないな」という場面に必ず出くわす。実績、スタッフ紹介、商品、お知らせ……。そこで登場するのがカスタム投稿タイプ(Custom Post Type)だ。

※「カスタム投稿タイプ」とは、WordPressに標準で用意されている「投稿」や「固定ページ」以外に、自分で新しい投稿の種類を追加できる機能のこと。たとえば「実績」「スタッフ」など、用途に合わせた箱を作れます。

ただ、このカスタム投稿タイプ、作ること自体は簡単なのに「設計」を間違えるとあとから地獄を見る。スラッグを変えたらURLが全部変わってSEOに影響が出たり、リビジョンが効かなくて過去の状態に戻せなかったり。

自分はWordPress案件を2016年ごろからやっていて、カスタム投稿タイプの設計で何度か痛い目に遭ってきた。その経験から「最低限これだけは気をつけている」という3つのポイントを共有したい。

1. スラッグとラベルは最初に確定させる

カスタム投稿タイプを登録するとき、最初に決めるのがpost_typeのスラッグ(内部名)とラベル(管理画面での表示名)。ここを軽く考えると、あとで取り返しがつかなくなる。

スラッグは「短く」「英語で」「変えない前提で」

スラッグはURLの一部になる。たとえばworksというスラッグで登録すれば、個別ページのURLは/works/記事スラッグ/になる。これを途中でportfolioに変えたくなったら、全ページのURLが変わる。当然、検索エンジンに登録されたURLも無効になるので、301リダイレクトの設定が必要になる。

自分のルールはこう。

英小文字とハイフンのみ:日本語やアンダースコアは避ける。データベースのカラム名ではないので、スネークケースよりケバブケースが自然
8文字以内が理想:URLに含まれるので短いほうがいい。staffworksnewsなど
複数形にしない:WordPressの内部処理で複数形が使われる場面があるので、単数形で登録しておくほうが混乱しにくい

ラベルは「クライアントが迷わない名前」にする

ラベルは管理画面のサイドバーに表示される名前。開発者目線で「Works」としたくなるが、クライアントが使う管理画面なので「制作実績」のように日本語でわかりやすくする。labels配列でnamesingular_nameadd_newなどを丁寧に設定しておくと、管理画面の使い勝手がぐっと上がる。

2. supportsは「足りないもの」を意識して設定する

register_post_type()supports引数は、その投稿タイプでどの編集機能を使えるかを決めるパラメータ。ここが曲者で、書かなかった機能は使えない

※「supports」とは、register_post_type()関数に渡すオプションのひとつで、タイトル・本文エディタ・アイキャッチ画像・リビジョンなど、その投稿タイプで有効にする機能を配列で指定します。

リビジョンを忘れると過去に戻れない

通常の「投稿」はデフォルトでリビジョン(編集履歴)が有効になっている。でもカスタム投稿タイプでは、supports'revisions'を明示的に入れないとリビジョンが保存されない。

自分はこれで実際に痛い目を見た。ある案件でカスタム投稿タイプの本文を更新したら表示が崩れて、「リビジョンで戻そう」と思ったら履歴が1件もなかった。結局、手作業で復旧する羽目になった。

カスタム投稿タイプを設計するときのsupportsのチェックリストはこれ。

supportsに入れるかチェックする項目
  • title — ほぼ必須
    • タイトルが不要なケースはほぼない
  • editor — 本文エディタ
    • ACFだけで完結する場合は外すことも
  • thumbnail — アイキャッチ画像
    • 一覧ページで画像を出すなら必須
  • revisions — リビジョン
    • 忘れがち。必ず入れる
  • excerpt — 抜粋
    • 一覧ページの説明文に使うなら
  • page-attributes — 並び順(menu_order)
    • 手動で表示順を制御したい場合

既存のカスタム投稿タイプを触るときは、最初にREST APIで/wp-json/wp/v2/types/スラッグを叩いて、現在のsupportsを確認するようにしている。思い込みで作業を始めると、「あるはずの機能がない」で時間を溶かす。

3. ACFとの役割分担を最初に決める

WordPress案件でカスタム投稿タイプを使うなら、ほぼ確実にACF(Advanced Custom Fields)もセットで使う。ここで迷うのが「どの情報を本文エディタに入れて、どの情報をACFのカスタムフィールドに入れるか」という線引きだ。

※「ACF」とは、WordPressの管理画面にオリジナルの入力欄(カスタムフィールド)を追加できるプラグイン。テキスト、画像、セレクトボックスなど様々な入力形式を用意でき、投稿タイプごとに異なるフィールドを設定できます。

判断基準は「クライアントが自由に書くか、構造化されたデータか」

自由記述のコンテンツ(ブログ本文のような文章)は本文エディタ。決まった構造のデータ(価格、所在地、営業時間、スタッフの肩書きなど)はACFのカスタムフィールド。このシンプルな基準で分けている。

たとえば「スタッフ紹介」の投稿タイプなら、こんな設計になる。

本文エディタに入れるもの
  • 自己紹介の自由記述
  • ブログ的なコンテンツ
  • 書き手によって長さ・内容が変わるもの

構造化されたデータをACFに切り出しておくと、テンプレート側での出力が安定する。本文エディタに全部入れると、クライアントがHTMLを壊してレイアウトが崩れる……というのはWordPress案件あるあるだ。

ACFフィールドグループの命名も統一する

フィールドグループ名やフィールド名はスネークケース(staff_positionstaff_photoなど)で統一している。投稿タイプのスラッグをプレフィックスにすると、他の投稿タイプのフィールドと被らない。get_field('position')だと他と衝突するかもしれないが、get_field('staff_position')なら安全だ。

設計フローをまとめると

カスタム投稿タイプを新規に設計するとき、自分はだいたいこの順番で進めている。

用途とデータ構造を整理
スラッグ・ラベル・supports確定
ACFフィールド設計
テンプレート実装

2番目のステップがいちばん重要。ここで決めたスラッグやsupportsは、あとから変更するコストが高い。「とりあえず作って、あとで直そう」が通用しにくいのがカスタム投稿タイプの設計だ。

まとめ:「あとから変えにくいもの」を最初に固める

カスタム投稿タイプの設計で気をつけていることを3つ挙げた。

  • スラッグとラベルは最初に確定させる。特にスラッグはURLに直結するので変更コストが高い
  • supportsは「何を入れるか」より「何を入れ忘れていないか」を意識する。リビジョンは必須
  • ACFとの役割分担を最初に決める。自由記述は本文エディタ、構造化データはACFフィールド

どれも派手なテクニックではないけれど、この3つを押さえておくだけで「あとから困る」ケースがかなり減る。カスタム投稿タイプは一度作るとサイトの骨格になるものなので、最初の設計に時間をかける価値は大きい。

※この記事はNPCの中の人の実務経験をもとに書いています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA



デザイン切替 // THEME
N
NPC アシスタント
オンライン