カスタム投稿タイプを登録!register_post_typeについて詳細に解説【具体例あり】

Featured image of the post

概要

プラグインを使わずfunctions.phpだけでカスタム投稿タイプを追加することができる関数

カスタム投稿タイプについては以下を参照。

📄カスタム投稿タイプを使いこなす!初心者向けチュートリアル

プラグインとの使い分け

プラグイン「Custom Post Type UI」を使えば、register_post_typeを使わなくてもカスタム投稿タイプを追加できる。

プラグインがおすすめの場面
  • 簡単に実装したい🔰
  • プラグインを増やすことに抵抗がない

register_post_typeがおすすめの場面
  • ある程度WordPressに詳しい
  • プラグインを増やしたくない

🚫 ただいま記事作成中です💭

関数の説明

引数・戻り値
register_post_type( $post_type, $args );

引数
Name説明初期値
$post_typestring登録したい投稿タイプ名。
最大 20 文字、大文字や空白は禁止。
なし
$args(任意)array投稿タイプの設定。なし

【補足】第二引数$argsの詳細
  • カスタム投稿タイプの細かい設定ができる。

よく使う設定

キー説明初期値
publicboolカスタム投稿タイプを有効(公開)にするか。falseだと無効(非公開)。false
labelstring管理画面などで表示する投稿タイプの名称。日本語でもOK。$post_type
labelsarray「管理画面に表示される言葉」を細かく設定できる。※1投稿または固定ページと同じ言葉になる。(hierarchicalがtrueなら固定ページの言葉が採用される)
descriptionstringカスタム投稿タイプの説明文。‘’
hierarchicalbool投稿同士で親子関係を持たせられるようにするか。(例えば投稿はfalse、固定ページはtrueになっている。)false
taxonomiesarrayカスタム投稿タイプで使用するタクソノミー(category, tagなど)なし
has_archivebool,stringカスタム投稿タイプのアーカイブページを生成するか。

trueを指定した場合:アーカイブページのスラッグは$post_typeになる。

文字列を指定した場合:その文字列がアーカイブページのスラッグになる。

※ファイル編集後リライトルールの更新([設定-パーマリンク設定]を更新)しないと反映されない。
false
show_in_restboolブロックエディタ(グーテンベルク)を有効化する。(trueのときはカスタム投稿タイプをREST APIに含まれる)false
supportsbool,arrayadd_post_type_support() を直接呼び出し、カスタム投稿タイプの編集ページに出てくる項目を追加する。
falseを指定するとすべて非表示。
※投稿画面から本文などを削除する場合remove_post_type_support関数を使うことが多いがカスタム投稿タイプでは使わない。ここで'supports' => array(’title’)のように指定して最初から本文は有効化しない!
array(’title’, ‘editor’)
(タイトル欄、本文欄が表示される)
menu_positionint管理画面のサイドバーの何番目に表示されるか。
(show_in_menuがtrueのときのみ有効)
• 5 - 投稿の下
• 10 - メディアの下
• 15 - リンクの下
• 20 - 固定ページの下
• 25 - コメントの下
• 60 - 最初の区切りの下(コメントの下に区切りがある)
• 65 - プラグインの下
• 70 - ユーザーの下
• 75 - ツールの下
• 80 - 設定の下
• 100 - 二つ目の区切りの下(設定の下に区切りがある)
null(コメントの下)

あまり使わない設定

キー説明初期値
publicly_queryableboolカスタム投稿タイプを取得するクエリが実行可能か(公開可能か)。→アーカイブページでカスタム投稿タイプを取得できるか。(falseにするとプレビューも表示もできない)publicと同じ
exclude_from_searchboolカスタム投稿タイプを検索結果から除外するか。publicの反対
show_uibool管理画面でカスタム投稿タイプ管理ページを表示するか。publicと同じ
show_in_nav_menusboolナビゲーションメニューにカスタム投稿タイプを表示するか。publicと同じ
show_in_menubool管理画面のサイドバーにカスタム投稿タイプを表示する。
(show_uiがtrueのときのみ有効)
publicと同じ
show_in_admin_barboolカスタム投稿タイプを管理バーから使えるか。show_in_menuと同じ
menu_iconstring管理画面のサイドバーに表示されるアイコン。
get_template_directory_uri() . "images/icon.png”のようにして画像を指定できる。
null(投稿と同じアイコン)
capabilitiesarrayカスタム投稿タイプの権限名を定義する。独自の権限グループを作成するときにこの権限名を使う。(map_meta_capがtrueのときのみ有効)
参考サイト:https://2inc.org/blog/2013/05/15/3244/
capability_typeによる
capability_typearray,stringカスタム投稿タイプの権限の種類を定義する。独自の権限グループを作成するときにこの権限の種類を使う。独自の種類を定義しておけば[投稿][固定ページ]と分けて権限を設定できる。
参考サイト:https://2inc.org/blog/2013/05/15/3244/
‘post’(投稿と同じグループ)
map_meta_capboolWordPressがもつデフォルトのメタ権限(read、delete_posts、delete_private_posts、delete_published_posts、delete_others_posts、edit_published_posts、edit_private_posts)を使用可能にする。
参考サイト:https://2inc.org/blog/2013/05/15/3244/
null
register_meta_box_cbcallback編集ページにメタボックスを追加/削除するときに使う。メタボックスを追加/削除する処理(add_meta_box/remove_meta_box)を使った処理をコールバック関数に指定する。null
rewritebool,arrayカスタム投稿タイプのパーマリンク構造を変更する。
※変更後に[設定−パーマリンク]で変更の保存をしないと反映されない。
true(パーマリンクは$post_type/スラッグ
query_varbool,stringカスタム投稿タイプのページをクエリパラメータでアクセスできるようにする。クエリパラメータによるアクセスが不要な場合はfalse。true(example.com/?$post_type=値でアクセス可能になる)
can_exportboolカスタム投稿タイプがエクスポート可能か。true

※1:labelsの設定内容

Image in a image block

詳細は以下の公式ドキュメントを参照。

【注意】指定NGな投稿タイプ名

第一引数に以下の文字列を指定してはいけない

(デフォルトで用意されている投稿タイプ名と重複してしまうため)

  • post
  • page
  • attachment
  • revision
  • nav_menu_item
  • action
  • order
  • theme

戻り値

カスタム投稿タイプの登録に成功した場合:登録された投稿タイプのオブジェクト

カスタム投稿タイプの登録に失敗した場合:エラーオブジェクト

使用例

カスタム投稿タイプ[hoge]を追加する。

// カスタム投稿タイプを登録する
function register_post_hoge() {
    $args = array(
      'public' => true,    // 管理画面、サイトに公開
      'label'  => 'hoge'   // 管理画面上のカスタム投稿タイプの名前「hoge」
    );
		// カスタム投稿タイプを登録
    register_post_type( 'hoge', $args );
}
// アクションフックに登録
add_action( 'init', 'register_post_hoge' );
Image in a image block

解説
  • register_post_hoge()
    • カスタム投稿タイプを登録する関数を用意。
    • register_post_type( 'hoge', $args );で登録する。
    • 詳細な情報は$argsで設定
  • add_action( 'init', 'register_post_hoge' );
    • アクションフックinitにカスタム投稿タイプ登録処理を追加する。

関連記事

🚫 ただいま記事作成中です💭

実践的な例

カスタム投稿タイプ[FAQ]を追加する。

function create_my_post_types() {
    // FAQ カスタム投稿タイプを登録
    register_post_type(
        "faq-post",           // 投稿タイプ名(スラッグになる)
      array(
        'public' => true,               // 管理画面、サイトにFAQを表示する
        'label' => 'FAQ',               // 管理画面上のカスタム投稿タイプの名前
        'labels' => array(              // 管理画面[FAQ]に表示される言葉
          'add_new' => '新規FAQ追加',
          'edit_item' => 'FAQの編集',
          'view_item' => 'FAQを表示',
          'search_items' => 'FAQを検索',
          'not_found' => 'FAQは見つかりませんでした。',
          'not_found_in_trash' => 'ゴミ箱にFAQはありませんでした。',
        ),
        'description' => 'FAQの投稿に使用します。',  //説明文
        'has_archive' => true,          // アーカイブページを生成する
        'show_in_rest' => true,         // ブロックエディタを有効化
        'supports' => array(            // 編集画面に表示する項目(add_post_type_supportと同じ)
          'title',                      // タイトル
          'editor',                     // 本文の編集機能
          'thumbnail',                  // アイキャッチ画像(add_theme_support('post-thumbnails')が必要)
          'excerpt',                    // 抜粋
          'custom-fields',              // カスタムフィールド
          'revisions'                   // リビジョンを保存
        ),
        'menu_position' => 5,           // 管理画面のサイドバー[投稿]の下に[FAQ]を追加する
        'taxonomies' => array('faq-kind'),  // 使用するタクソノミー("faq-kind"を使用)
      )
    );
  }
//init アクションフックで登録
add_action('init', 'create_my_post_types');

注意

register_post_type(…)でカスタム投稿タイプを登録した後は、[設定-パーマリンク]で更新すること⚠

Image in a image block

💡
これをしないとカスタム投稿タイプの個別ページが生成されない

アレンジ

カスタム投稿タイプの個別ページを生成しない

あまりない要件だが、以下のような場合の方法。

💡
カスタム投稿タイプの個別ページ(single.php相当)は不要!一覧ページ(archive.php)などで表示できればいい!

方法

引数を以下のようにする。

'public' => false,              // カスタム投稿タイプを非公開にする

// publicをfalseにすると、自動で以下もすべてfalseになってしまうので明示的にtrueを指定
'publicly_queryable' => true,   // アーカイブページでは取得可能
'show_ui' => true,              // 管理画面に表示
'show_in_nav_menus' => true,    // ナビゲーションメニューに表示
'show_in_menu' => true,         // 管理画面のサイドバーに表示

具体例

function create_my_post_types() {
    // FAQ カスタム投稿タイプを登録
    register_post_type(
        "faq-post",
      array(
        'public' => false,              // カスタム投稿タイプを非公開
				'publicly_queryable' => true,   // 一覧ページでは取得可能
				'show_ui' => true,              // 管理画面に表示
				'show_in_nav_menus' => true,    // ナビゲーションメニューに表示
        'show_in_menu' => true,         // 管理画面のサイドバーに表示

				// 以下は通常どおり指定する
        'label' => 'FAQ',
        'labels' => array(
          'add_new' => '新規FAQ追加',
          'edit_item' => 'FAQの編集',
          'view_item' => 'FAQを表示',
          'search_items' => 'FAQを検索',
          'not_found' => 'FAQは見つかりませんでした。',
          'not_found_in_trash' => 'ゴミ箱にFAQはありませんでした。',
        ),
        'description' => 'FAQの投稿に使用します。',
        'has_archive' => true,
        'show_in_rest' => true,
        'supports' => array(
          'title',
          'editor',
          'thumbnail',
          'excerpt',
          'custom-fields',
          'revisions'
        ),
        'menu_position' => 5,
        'taxonomies' => array('faq-kind'),
      )
    );
  }
//init アクションフックで登録
add_action('init', 'create_my_post_types');

参考サイト