以前の記事「カスタム投稿タイプとカスタムフィールドでカスタマイズ」では、独立した投稿を定義してカスタムフィールドを実装する方法については詳細を説明しました。
今回は次の点を記事にしました。(日本語の記事を見出せませんでしたので)
まずは基本
レシピをカスタム投稿タイプで掲載していきたい!という設定です。
階層型タクソノミ(カテゴリ)は「主食」「おかず」「副菜」「デザート」などレシピ分類に。非階層型タクソノミ(タグ)は「じゃがいも」「豚肉」「アジ」などの食材分類に活用するというような。
実装例
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 に指定することにより、今回は「投稿」の次に。
このようになるはずです。
親メニュー名と異なる子メニュー名で表示
上述の例で実はもう一か所、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’のメニューに表示ということです。
これで、「レシピ」というカスタム投稿タイプの親メニュー内に「作レポ一覧」という二つ目のカスタム投稿タイプの子メニューが追加できました。
でも・・・
「作レポ追加」のメニューも追加したい
上記の例では、「作レポ一覧」というメニューが追加されただけで、「作レポ」を追加する「作レポ追加」メニューはありません。
「作レポ追加」がなくても「作レポ一覧」ページから追加はできるのですが、新規追加の編集の時に、管理メニューに注目すると「レシピ一覧」がフォーカスされて、少し気持ち悪い状態です。
こんな感じです。
それで、「作レポ追加」メニューも追加するには、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', ''); }
これで完成です。
投稿画面内に高度なカスタムフィールドを実装する方法については、「カスタム投稿タイプとカスタムフィールドでカスタマイズ」をご参照ください。
直接メールしてみる
コメントをどうぞ
コメント:2 件
入れ子の方法についてありがとうございます。難しく考えすぎてハマっていたので助かりました。
参考にしていただきありがとうございました。