コンテンツにスキップ

WordPress の関数 register_post_type() の使い方まとめ

メインイメージ

WordPress でカスタム投稿タイプを作るための関数 register_post_type() についてまとめました。

register_post_type( $post_type, $args );

基本的な使い方

init アクションフックのコールバック内で実行します。 関数に渡すべき引数は 2 つで、第 1 引数は投稿タイプの名前を表すキー、第 2 引数は設定を指定するための連想配列です。

add_action( 'init', 'myplugin_register_post_types' );
function myplugin_register_post_types() {
  // カスタム投稿タイプ「商品」を作る
  register_post_type( 'product', [
    // ラベル:
    'labels' => [ 'name' => '商品' ],
    // 投稿編集画面とフロント画面を作る:
    'public' => true,
    // アーカイブページは作成しない:
    'has_archive' => false,
    // REST API に含める:
    'show_in_rest', => true,
    // メニューのアイコンを products に適したものに設定する:
    'menu_icon' => 'dashicons-products',
    // スラグを設定する:
    'rewrite' => [ 'slug' => 'products' ],
  ] );
}

引数

第 1 引数 $post_type string

投稿タイプを表すキー。

  • 1 文字以上 20 文字以下である必要あり
  • 使用可能な文字は小文字のアルファベットと数字、 - (ダッシュ)、 _ (アンダースコア)

WordPress 本体やコミュニティプラグインが提供する投稿タイプと名前が衝突することを避けるため、一般に独自のプリフィックスを付けることが推奨されています。

以下の名前は WordPress 本体が定義する投稿タイプと衝突するため使えません。

  • post
  • page
  • attachment
  • revision
  • nav_menu_item
  • custom_css
  • customize_changeset
  • oembed_cache
  • user_request
  • wp_block
  • wp_global_styles
  • wp_navigation
  • wp_template
  • wp_template_part

以下の名前も WordPress 本体の機能に影響する可能性があるため使ってはいけません。

  • action
  • author
  • order
  • theme

第 2 引数 $args array|string

投稿タイプ登録のための引数。 指定可能なキーは次のとおり。

label

管理画面のメニューに表示される名称。 英語の場合は複数形。 デフォルトは labels['name'] の値。

labels

label よりも細かく設定できる名称。 30 個以上のキーが利用可能。 利用可能なキーの一覧は get_post_type_labels() を参照のこと。

labellabels の両方ともセットされなかった場合は、 WordPress 本体が定義する投稿タイプの値が継承される(区別がつかなくなるので一般には設定することが推奨される)。

hierarchical の値 true page
label のデフォルト値 page post

description

人間向けの簡潔な説明。

public

管理画面やフロント画面を投稿の画面を生成するかどうか。 exclude_from_search publicly_queryable show_ui show_in_nav_menus は個別にセットしなければ public の値をもとに自動的にセットされる。

public の値 true false
exclude_from_search false true
publicly_queryable true false
show_ui true false
show_in_nav_menus true false

デフォルトは false

hierarchical

投稿に階層構造を持たせるかどうか。 投稿の編集ページに親投稿を選択するセレクトボックスを表示するには page-attributessupports jに追加する必要あり。 デフォルトは false

フロント画面の検索機能の検索結果から除外するかどうか。 除外する場合は true 。 デフォルトは public の反対の値。

publicly_queryable

フロント画面で GET クエリを使った投稿の表示を可能にするかどうか。 true の場合に利用可能なエンドポイントは次のとおり。

  • ?post_type={post_type_key}
  • ?{post_type_key}={single_post_slug}
  • ?{post_type_query_var}={single_post_slug}

デフォルトは public の値。

show_ui

管理画面に投稿管理用ページを生成するかどうか。 デフォルトは public の値。

show_in_menu

管理画面のメニューにアイテムを表示するかどうか。 機能するには show_uitrue である必要あり。

  • true: トップレベルのメニューアイテムとして表示する
  • false: メニューアイテムを表示しない
  • 既存のトップレベルメニューの文字列(例: tools.php / edit.php?post_type=page ): 対象のメニューアイテムのサブメニューとして表示される

デフォルトは show_ui の値。

show_in_nav_menus

フロント画面のナビゲーションメニューで利用できるようにするかどうか。 デフォルトは public の値。

show_in_admin_bar

管理者向けの上部ツールバーで「新規」や「投稿を編集」を利用できるようにするか。

show_in_rest

WordPress の REST API で利用可能にするかどうか。 ブロックエディタを利用する場合は現状 true にセットする必要あり(将来的にこの仕様は変更される可能性あり)。 デフォルトは false

rest_base

REST API におけるベーススラッグ。 デフォルトは $post_type の値。

rest_namespace

REST API の URL のネームスペース。 デフォルトは wp/v2

rest_controller_class

REST API のコントローラクラス。 デフォルトは WP_REST_Posts_Controller

autosave_rest_controller_class

REST API の自動保存のコントローラクラス。 デフォルトは WP_REST_Autosaves_Controller

revisions_rest_controller_class

REST API のリビジョンのコントローラクラス。 デフォルトは WP_REST_Revisions_Controller

late_route_registration

REST API のコントローラによるルートの登録処理を自動保存やリビジョンのルートの登録処理よりも後に実行するかどうか。 デフォルトは false

管理画面のメニューアイテムの位置。 動作するには show_in_menutrue である必要あり。 デフォルトは null (「コメント」の下)。

  • 5: 「投稿」の下
  • 10: 「メディア」の下
  • 20: 「固定ページ」の下
  • 25: 「コメント」の下
  • 60: 1 つめのセパレータの下
  • 65: 「プラグイン」の下
  • 70: 「ユーザー」の下
  • 75: 「ツール」の下
  • 80: 「設定」の下
  • 100: 2 つめのセパレータの下

管理画面のメニューアイテムのアイコン。 以下の値を指定可能。

  • Dashicons のヘルパークラス(例: dashicons-chart-pie
  • base64 エンコードされた SVG の data URI: data:image/svg+xml;base64, から始まるもの
  • none: CSS でアイコンを指定できるよう空にする

capability_type

読み込み・編集・削除の権限の構築に使われる文字列または ['単数形', '複数形'] の 2 要素の配列。 デフォルトは post

capabilities

読み込み・編集・削除などの権限の配列。 デフォルトでは capability_type をもとに構築される。 関係する実装は get_post_type_capabilities() を参照のこと。

map_meta_cap

内部のデフォルトメタ権限処理を使用するかどうか。 false にセットされると通常の管理者は投稿を編集できなくなるため、投稿を編集可能にするには edit_post 権限を付与する必要がある。 デフォルトは null

supports

投稿タイプに付与する投稿コア機能。 add_post_type_support() を直接実行する代わりのエイリアスとして機能する。 指定可能な機能は次のとおり。

  • title: 投稿タイトル
  • editor: ブロックエディタ
  • comments: コメント
  • revisions: リビジョン
  • trackbacks: トラックバック
  • author: 投稿者と投稿者別編集権限
  • excerpt: 抜粋
  • page-attributes: 階層化に役立つ「親ページ」「表示順序」
  • thumbnail: サムネイル画像(アイキャッチ画像)
  • custom-fields: カスタムフィールド(投稿メタ)
  • post-formats: 「 Aside 」「 Gallery 」などの投稿フォーマット
  • autosave: 投稿編集画面での自動保存

デフォルトは titleeditor の 2 つを含む配列。 値が false の場合はどの機能も付与されない。

register_meta_box_cb

編集フォームのメタボックスを設定するコールバック関数。 コールバック関数内で remove_meta_box()add_meta_box() を使って使用するもの。 デフォルトは null

taxonomies

投稿タイプで使うタクソノミー識別子の配列。 タクソノミーは後で register_taxonomy()register_taxonomy_for_object_type() で登録可。 デフォルトは []

has_archive

投稿タイプのアーカイブページを作るかどうか。 値が文字列の場合はアーカイブページのスラッグ。 rewrite が有効な場合に専用の書き換えルールが生成される。 デフォルトは false

rewrite

URL リライト処理を行うかどうか。 false をセットするとリライトが行われない。 デフォルトは true で、その場合は $post_type スラッグが使用される。 リライトルールを改めて設定したい場合は次のキーを持つ連想配列を渡すとよい。

  • slug (文字列): パーマリンク構造のスラッグ。デフォルトは $post_type の値。
  • with_front (真偽値): パーマリンク構造の先頭に WP_Rewrite::$front を付けるかどうか。デフォルトは true
  • feeds (真偽値): フィードのパーマリンク構造を構築するかどうか。 デフォルトは has_archive の値。
  • pages (真偽値): パーマリンク構造でページネーションを提供するかどうか。デフォルトは true
  • ep_mask (整数): 割り当てるエンドポイントマスク。この値が未指定で permalink_epmask が設定されている場合は permalink_epmask を継承する。この値が未指定で permalink_epmask も設定されていない場合のデフォルト値は EP_PERMALINK

query_var

HTTP リクエストの GET クエリで使う query_var パラメータキー。 デフォルトは $post_type の値。 false に設定された場合は ?{query_var}={post_slug} クエリが使用不可になる。 文字列に設定された場合は ?{query_var_string}={post_slug} クエリが有効になる。

can_export

エクスポートを許可するかどうか。 デフォルトは true

delete_with_user

ユーザーが削除されたときにその投稿を削除するかどうか。 指定された値別のユーザーが削除されたときの処理は次のとおり。

  • true: 削除されたユーザーに属する投稿がゴミ箱に移動される。
  • false: 削除されたユーザーに属する投稿がゴミ箱に移動されたり削除されたりしない。
  • null: 投稿タイプが author 機能をサポートしている場合は削除されたユーザーに属する投稿がゴミ箱に移動される。 author 機能をサポートしていない場合は投稿はゴミ箱に移動されたり削除されたりしない。

デフォルトは null

template

投稿編集画面でエディターの初期状態を指定した配列。 各要素はブロック名と任意の属性を含む配列。

template_lock

template がセットされている場合にそのテンプレートをロックするかどうか。

新しいブロックの挿入 既存のブロックの移動 既存のブロックの削除
all 不可 不可 不可
insert 不可 不可
false

デフォルトは false

_builtin

内部使用用 。 WordPress 本体にビルトインの投稿タイプ(投稿と固定ページ)の場合 true で、その他の場合は false 。 デフォルトは false

内部使用用 。 編集リンクに使う URL セグメント。 デフォルトは post.php?post=%d

$args のキーのデフォルト値

各キーをセットしなかった場合のデフォルト値は次のとおりです。

キー デフォルト
label labels['name'] の値
labels []
description (空文字列)
public false
hierarchical false
exclude_from_search public の値の逆
publicly_queryable public の値
show_ui public の値
show_in_menu show_ui の値
show_in_nav_menus public の値
show_in_admin_bar show_in_menu の値
show_in_rest false
rest_base 第 1 引数 $post_type の値
rest_namespace wp/v2
rest_controller_class WP_REST_Posts_Controller
autosave_rest_controller_class WP_REST_Autosaves_Controller
revisions_rest_controller_class WP_REST_Revisions_Controller
late_route_registration false
menu_position null (「コメント」の次)
menu_icon null (投稿アイコン)
capability_type 'post'
capabilities capability_type を使った配列
map_meta_cap null
supports ['title', 'thumbnail']
register_meta_box_cb null
taxonomies []
has_archive false
rewrite true
query_var 第 1 引数 $post_type の値
can_export true
delete_with_user null
template []
template_lock false
_builtin false
_edit_link 'post.php?post=%d'

サンプルコード

サンプル A. 最小限の設定(プログラマ向け)

add_action( 'init', function () {
  register_post_type( 'product' );
} );

画面なしの内部的な投稿タイプだけを作りたい場合は第 1 引数だけを渡せば OK です。

サンプル B. ブロックエディタを使う

add_action( 'init', function () {
  register_post_type( 'product', [
    'labels' => ['name' => '商品'],
    'show_ui' => true,
    'supports' => ['title', 'editor'],
    'show_in_rest' => true,
  ] );
} );

ブロックエディタを有効にするには次の 3 つのことを行う必要があります。

  • show_uitrue をセットする
  • supportseditor を追加する
  • show_in_resttrue をセットする

'show_ui' => true は管理画面の投稿編集ページを利用するために必要です。 フロント側の詳細ページなどもあわせて作りたい場合は代わりに public を使っても OK です。

supports のデフォルトは ['title', 'editor'] なので supports 自体 をセットしなければ 'show_ui' => true'show_in_rest' => true の 2 つだけでも十分です:

add_action( 'init', function () {
  register_post_type( 'product', [
    'labels' => ['name' => '商品'],
    'public' => true,
    'show_in_rest' => true,
  ] );
} );

ただし show_in_rest は将来的に不要になる可能性があります。

サンプル C. サムネイル画像(アイキャッチ画像)を使う

add_action( 'init', function () {
  register_post_type( 'product', [
    'labels' => ['name' => '商品'],
    'public' => true,
    'supports' => ['title', 'editor', 'thumbnail'],
  ] );
} );

サムネイル画像機能を使うには supportsthumbnail を追加します。

サンプル D. フロント側に詳細ページを作りたいがアーカイブページは作りたくない

add_action( 'init', function () {
  register_post_type( 'product', [
    'labels' => ['name' => '商品'],
    'public' => true,
    'has_archive' => false,
  ] );
} );

アーカイブページなしで詳細ページを作りたい場合は 'public' => true'has_archive' => false をセットすれば OK です。 検索機能からも除外したい場合は 'public' => true の代わりに 'publicly_queryable' => true をセットすれば OK です。

サンプル E. 管理画面で編集 UI は使いたいがフロント側に一覧ページや詳細ページは作りたくない

add_action( 'init', function () {
  register_post_type( 'product', [
    'labels' => ['name' => '商品'],
    'show_ui' => true,
  ] );
} );

フロント側にページを作らず投稿管理画面を使いたい場合は public をデフォルトの false にしたまま show_uitrue をセットすれば OK です。

パーマリンクに関する注意点

カスタム投稿タイプのパーマリンクを正しく動作させるには、投稿タイプを定義したプラグインかテーマの有効化時にリライトルールを作成し直す必要があります。

プラグインの場合:

add_action( 'init', 'my_cpt_init' );
function my_cpt_init() {
  register_post_type( ... );
}

// プラグインが有効化されたときに
// 投稿タイプを定義してからリライトルールをフラッシュする
register_activation_hook( __FILE__, 'my_rewrite_flush' );
function my_rewrite_flush() {
  my_cpt_init();
  flush_rewrite_rules();
}

テーマの場合:

add_action( 'init', 'my_cpt_init' );
function my_cpt_init() {
  register_post_type( ... );
}

// テーマが有効化されたときに
// 投稿タイプを定義してからリライトルールをフラッシュする
add_action( 'after_switch_theme', 'my_rewrite_flush' );
function my_rewrite_flush() {
  my_cpt_init();
  flush_rewrite_rules();
}

これらのコードを書く代わりに、管理画面「設定」→「パーマリンク」で「変更を保存」ボタンをクリックする形でもリライトルールを再作成できます。

register_post_type() で登録する投稿タイプの設定を追加した後にリライトルールを変更した場合もリライトルールの再作成が必要になります。

WordPress.org リファレンス・コード

確認時のバージョン

  • WordPress 6.6.1

関連ページ