つながるnet

複数のカスタム投稿タイプを一つの管理メニューに

以前の記事「カスタム投稿タイプとカスタムフィールドでカスタマイズ」では、独立した投稿を定義してカスタムフィールドを実装する方法については詳細を説明しました。

今回は次の点を記事にしました。(日本語の記事を見出せませんでしたので)

まずは基本

レシピをカスタム投稿タイプで掲載していきたい!という設定です。
階層型タクソノミ(カテゴリ)は「主食」「おかず」「副菜」「デザート」などレシピ分類に。非階層型タクソノミ(タグ)は「じゃがいも」「豚肉」「アジ」などの食材分類に活用するというような。

実装例

Codexに掲載されている例を、今回の設定に合わせて日本語化すると以下のようになります。
functions.phpに追加します。

add_action('init', 'my_recipe_init');
function my_recipe_init() {

	register_post_type('recipe', array(
			'labels' => array(
			'name' => 'レシピ',
			'singular_name' => 'レシピ',
			'all_items' => 'レシピ一覧',
			'add_new' => 'レシピ追加',
			'add_new_item' => 'レシピの追加',
			'edit_item' => 'レシピの編集',
			'new_item' => 'レシピ追加',
			'view_item' => 'レシピを表示',
			'search_items' => 'レシピを検索',
			'not_found' =>  'レシピが見つかりません',
			'not_found_in_trash' => 'ゴミ箱内にレシピが見つかりませんでした。', 
			'parent_item_colon' => ''
		),
		'public' => true,
		'publicly_queryable' => true,
		'show_ui' => true, 
		'query_var' => true,
		'rewrite' => true,
		'capability_type' => 'post',
		'hierarchical' => false,
		'menu_position' => 5,
		'supports' => array('title','editor','author','thumbnail','excerpt','comments')
  ));

	// (カテゴリーのような) 階層化できる新規分類を追加
	register_taxonomy('recipecat',array('recipe'), array(
		'hierarchical' => true,
		'labels' => array(
				'name' => 'レシピ分類',
				'singular_name' => 'レシピ分類',
				'search_items' =>  'レシピ分類を検索',
				'all_items' => 'すべてのレシピ分類',
				'parent_item' => '親分類',
				'parent_item_colon' => '親分類:',
				'edit_item' => '編集', 
				'update_item' => '更新',
				'add_new_item' => '新規分類を追加',
				'new_item_name' => '名前',
		),
		'show_ui' => true,
		'query_var' => true,
		'rewrite' => array( 'slug' => 'recipecat' ),
	));

	// (タグのような) 階層化できない新規分類を追加
	register_taxonomy('foodstuff','recipe',array(
		'hierarchical' => false,
		'labels' => array(
				'name' => 'レシピ食材',
				'singular_name' => '食材',
				'search_items' =>  '食材を検索',
				'popular_items' => '人気の食材',
				'all_items' => 'すべての食材',
				'parent_item' => null,
				'parent_item_colon' => null,
				'edit_item' => '編集', 
				'update_item' => '更新',
				'add_new_item' => '食材を追加',
				'new_item_name' => '名前',
				'separate_items_with_commas' => '食材が複数ある場合はカンマで区切ってください',
				'add_or_remove_items' => '食材の追加/削除',
				'choose_from_most_used' => 'よく使われている食材から検索'
		),
		'show_ui' => true,
		'query_var' => true,
		'rewrite' => array( 'slug' => 'foodstuff' ),
  ));
}

詳細はCodexを参照してください。
register_post_type
register_taxonomy

ひとつだけヒント:
26行目:’menu_position’ => 5
この部分でメニューの位置を指定しています。
上記リンクの例では、この値が false になっており、コメントの下になってしまいます。5 に指定することにより、今回は「投稿」の次に。

このようになるはずです。
cp02

親メニュー名と異なる子メニュー名で表示

上述の例で実はもう一か所、Codexのサンプルと異なる行を追加しています。

8行目:’all_items’ => ‘レシピ一覧’

「レシピ」メニューを見ると、その親メニューが「レシピ」、一つ目の子メニューが「レシピ一覧」となっています。

この子メニュー名の表記を親メニュー名と違う表記にするのが ‘all_items’ => ‘レシピ一覧’ です。
これがないと、親メニュー名と同じ「レシピ」となります。

それでよいならよいのですが・・・

でも、次の見出しで示すように、同一「レシピ」メニュー内に、つまり複数のカスタム投稿タイプを表示したい場合は、より明確に名称を分けたいと思うでしょ?

複数のカスタム投稿タイプを同一親メニュー内に配置

例えば、某有名レシピサイトにもあるような「みんなの作レポ」などを掲載するような感じです。

「作レポ」カスタム投稿タイプを追加

前述の function my_recipe_init() に次のコードを追加

	register_post_type('report', array(
			'labels' => array(
			'name' => '作レポ',
			'singular_name' => '作レポ',
			'add_new' => '作レポ追加',
			'add_new_item' => '作レポの追加',
			'all_items' => '作レポ一覧',
			'edit_item' => '作レポの編集',
			'new_item' => '作レポ追加',
			'view_item' => '作レポを表示',
			'search_items' => '作レポを検索',
			'not_found' =>  '作レポが見つかりません',
			'not_found_in_trash' => 'ゴミ箱内に作レポが見つかりませんでした。', 
			'parent_item_colon' => ''
		),
		'public' => true,
		'publicly_queryable' => true,
		'show_ui' => true,
		'show_in_menu' => 'edit.php?post_type=recipe',
		'query_var' => true,
		'rewrite' => true,
		'capability_type' => 'post',
		'hierarchical' => false,
		'menu_position' => false,
		'supports' => array('title','editor','author','thumbnail','excerpt','comments')
  ));

一つ目のカスタム投稿タイプ「レシピ」との違いは:
19行目:’show_in_menu’ => ‘edit.php?post_type=recipe’
24行目:’menu_position’ => false(これはどちらでもよい?)

肝は19行目です。
‘show_in_menu’ はその言葉のとおりメニューをどこに表示するかということを指定しています。この例では、‘edit.php’でしかもpost_typeが’recipe’のメニューに表示ということです。

これで、「レシピ」というカスタム投稿タイプの親メニュー内に「作レポ一覧」という二つ目のカスタム投稿タイプの子メニューが追加できました。

でも・・・

「作レポ追加」のメニューも追加したい

上記の例では、「作レポ一覧」というメニューが追加されただけで、「作レポ」を追加する「作レポ追加」メニューはありません。

「作レポ追加」がなくても「作レポ一覧」ページから追加はできるのですが、新規追加の編集の時に、管理メニューに注目すると「レシピ一覧」がフォーカスされて、少し気持ち悪い状態です。

cp03

こんな感じです。

それで、「作レポ追加」メニューも追加するには、add_submenu_page を使います。次のfunctionとフックを追加。

add_action('admin_menu', 'my_recipe_admin_menus');
function my_recipe_admin_menus(){
    add_submenu_page('edit.php?post_type=recipe', 'Add Report', '作レポ追加', 7, 'post-new.php?post_type=report', '');
}

これで完成です。
cp04

投稿画面内に高度なカスタムフィールドを実装する方法については、「カスタム投稿タイプとカスタムフィールドでカスタマイズ」をご参照ください。

直接メールしてみる

お名前 (必須)
メールアドレス (必須)
件名
ご相談内容
画像文字をご入力ください
captcha

コメントを残す