カスタム投稿タイプを登録する方法の覚え書きです。

カスタム投稿タイプとは?

カスタム投稿タイプとは独自の投稿タイプを追加することができる機能のことで、既存の「投稿(post)」や「固定ページ(page)」とは別にコンテンツを追加できるので、管理がしやすくなります。

カスタム投稿タイプを追加する

カスタム投稿タイプを追加するには、register_post_type()を使って、独自の投稿タイプ(ラベル、サポートする機能、使える場面など)の特徴を定義します。

functions.php

function register_my_post_type() { // アクションフックに登録する関数
  $labels = array (
	'name' => _x('お知らせ', 'post type general name'),
	'singular_name' => _x('お知らせ', 'post type singular name'),
	'add_new' => _x( '新規追加', 'info'),
	'add_new_item' => __('新規項目追加'),
	'new_item' => __('新規項目'),
	'edit_item' => __('項目を編集'),
	'view_item' => __('項目を表示'),
	'all_items' => __('投稿一覧'),
  );
  $args = array (
	'labels' => $labels,
	'public' => true, // 管理画面とサイト上で利用可能にする
	'publicly_queryable' => true, 
	'show_ui' => true, 
	'show_in_rest' => true, // 新エディタ Gutenberg で使用できるようにする
	'has_archive' => true, // 投稿タイプのアーカイブ(記事一覧)を作成できるようにする
	'hierarchical' => false, // この投稿タイプを階層構造にするか(親を指定できるようにする)
	'rewrite' => array('slug' => 'info'), // この投稿タイプのパーマリンクのリライト方法を変更する(自動書き換えを避けるにはfalseを指定)
	'query_var' => true, // この投稿に使用する query_var キーの名前。
	'supports' => array( 'title', 'editor', 'thumbnail')
  );
  register_post_type('info', $args); // (カスタム投稿タイプ名, $args)
 }
 add_action('init', 'register_my_post_type', 0); // 上記で定義した関数名を登録

上記を「functions.php」に記述すると、WordPressの管理画面に「お知らせ」という投稿タイプが追加されます。

「all_items」や「add_new」で指定したラベル名が表示され、新規追加の編集画面では「supports」で指定したアイキャッチ画像(thumbnail)などが設定できるようになっています。

カテゴリーやタグを追加する

functions.php

function register_my_post_type() {
 $labels = array (
	'name' => _x('事例紹介', 'post type general name'),
	'singular_name' => _x('事例紹介', 'post type singular name'),
	'add_new' => _x( '新規追加', 'case'),
	'add_new_item' => __('新規項目追加'),
	'new_item' => __('新規項目'),
	'edit_item' => __('項目を編集'),
	'view_item' => __('項目を表示'),
	'all_items' => __('投稿一覧'),
 );
 $args = array (
	'labels' => $labels,
	'public' => true,
	'publicly_queryable' => true, 
	'show_ui' => true, 
	'show_in_rest' => true, 
	'has_archive' => true,
	'hierarchical' => true,
	'rewrite' => array('slug' => 'case'),
	'query_var' => true,
	'supports' => array( 'title', 'editor', 'thumbnail', 'page-attributes'),
	'menu_position' => 4,
	'taxonomies' => array('category', 'post_tag') // これを追加
 );
 register_post_type('case', $args);
}
add_action('init', 'register_my_post_type', 0);

上記を「functions.php」に記述すると「事例紹介」というカスタム投稿タイプにカテゴリーとタグが追加されているのが確認できます。

カスタムタクソノミー(カスタム分類)

カスタム投稿タイプに独自のカテゴリーやタグを追加したい場合は、「カスタムタクソノミー」を登録します。このカスタムタクソノミー(カスタム分類)は、任意で名前を設定することが可能で「カテゴリー」のように階層を持たせたり、「タグ」のように単一で扱うこともできます。

ここでは、先ほど追加した「事例紹介」というカスタム投稿タイプに対して、「事例カテゴリー」や「事例タグ」というカスタム分類を追加してみます。

functions.php

function register_my_taxonomies() {
 $labels = array (
	'name' => _x('事例カテゴリー', 'taxonomy general name'),
	'singular_name' => _x('事例カテゴリー', 'taxonomy singular name'),
	'menu_name' => __('事例カテゴリー'),
	);
 );
 $args = array (
	'labels' => $labels,
	'public' => true,
	'publicly_queryable' => true, 
	'hierarchical' => true,
	'show_ui' => true,
	'show_in_menu' => true,
	'show_in_nav_menus' => true,
	'rewrite' => array('slug' => 'case_cat'),
	'query_var' => true,
 );  
 
  register_taxonomy('case_cat', 'case', $args);
  
  $labels = array(
	'name' => _x('事例タグ', 'taxonomy general name'),
	'singular_name' => _x('事例タグ', 'taxonomy singular name'),
	'menu_name' => __('事例タグ'),
  );
  
  $args = array (
	'labels' => $labels,
	'public' => true,
	'publicly_queryable' => true, 
	'hierarchical' => true,
	'show_ui' => true,
	'show_in_menu' => true,
	'show_in_nav_menus' => true,
	'rewrite' => array('slug' => 'case_tag'),
	'query_var' => true,
 );  
 
  register_taxonomy('case_tag', 'case', $args);
  
}
add_action('init', 'register_my_taxonomies', 0);

上記を「functions.php」に記述した後に管理画面を見てみると、「事例カテゴリー」と「事例タグ」というカスタムタクソノミーが追加されているのが確認できます。

カスタム投稿で使用されるテンプレート

カスタム投稿タイプの一覧ページ

archive-○○○.php

カスタム投稿で設定したカスタム投稿名のパラメータを入れるので、上の例で言うと、「事例紹介」の一覧ページは「archive-case.php」になる。

カスタム投稿タイプの記事ページ

single-○○○.php

カスタム投稿で設定したカスタム投稿名のパラメータを入れるので、上の例で言うと、「事例紹介」の記事ページは「single-case.php」になる。

カスタムタクソノミー(カスタム分類)の一覧ページ

taxonomy-○○○.php

カスタム投稿で設定したカスタムタクソノミー(カスタム分類)名のパラメータを入れるので、上の例で言うと、「事例カテゴリー」の一覧ページは「taxonomy-case_cat.php」で「事例タグ」の一覧ページは「taxonomy-case_tag.php」になる。