カスタム投稿タイプを登録!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_type string 登録したい投稿タイプ名。
最大 20 文字、大文字や空白は禁止。
なし
$args(任意) array 投稿タイプの設定。 なし

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

よく使う設定

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

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

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

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

あまり使わない設定

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

参考サイト