- 実践 WordPress ホーム
- 投稿タイプ管理
WordPress の関数 register_post_type()
の使い方まとめ
WordPress でカスタム投稿タイプを作るための関数 register_post_type()
についてまとめました。
基本的な使い方
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()
を参照のこと。
label
と labels
の両方ともセットされなかった場合は、 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-attributes
を supports
jに追加する必要あり。
デフォルトは false
。
exclude_from_search
フロント画面の検索機能の検索結果から除外するかどうか。
除外する場合は 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_ui
が true
である必要あり。
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
。
menu_position
管理画面のメニューアイテムの位置。
動作するには show_in_menu
が true
である必要あり。
デフォルトは null
(「コメント」の下)。
5
: 「投稿」の下10
: 「メディア」の下20
: 「固定ページ」の下25
: 「コメント」の下60
: 1 つめのセパレータの下65
: 「プラグイン」の下70
: 「ユーザー」の下75
: 「ツール」の下80
: 「設定」の下100
: 2 つめのセパレータの下
menu_icon
管理画面のメニューアイテムのアイコン。 以下の値を指定可能。
- 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
: 投稿編集画面での自動保存
デフォルトは title
と editor
の 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
。
_edit_link
内部使用用 。
編集リンクに使う 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. 最小限の設定(プログラマ向け)
画面なしの内部的な投稿タイプだけを作りたい場合は第 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_ui
にtrue
をセットするsupports
にeditor
を追加するshow_in_rest
にtrue
をセットする
'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'],
] );
} );
サムネイル画像機能を使うには supports
に thumbnail
を追加します。
サンプル 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_ui
に true
をセットすれば 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 リファレンス・コード
register_post_type()
– Function | Developer.WordPress.org- wordpress-develop/src/wp-includes/post.php at 6.6 · WordPress/wordpress-develop
確認時のバージョン
- WordPress
6.6.1