デフォルト投稿タイプの『投稿』はカテゴリ(タクソノミー)が使えるけど階層構造(親子関係)は持ってない。『固定ページ』は階層構造は持ってるけどカテゴリは使えない。
この2つをもったオールラウンダーな投稿タイプを作っていきます。ただ若干の課題があり、アーカイブページの修正も必要です。
デフォルトの投稿、固定ページには制限がある。
WordPressには2つの投稿タイプがあります。『投稿』と『固定ページ』。この2つはお互い使えるものと使えないものがあります。
まず真っ先に使うのは『投稿』。投稿はブログの記事を書くもので、記事をグループ化するタクソノミーのカテゴリとタグの設定ができます。
その次は固定ページ。どんどんページを増やしていくというものではなく、ホームやプライバシポリシーなどあまり変更のないページを作るもの。
企業の紹介サイトであるコーポレートサイトなどは固定ページを多く使うでしょう。
固定ページはデフォルトではカテゴリ・タグのタクソノミーの設定はなく、その代わりページ同士の親子関係があります。
(投稿は親子関係がない。)
投稿と固定ページにはガチガチの制限がある。
つい最近気づいたことなんですが、デフォルトの投稿と固定ページにはガチガチの制限があります。
試しに投稿の設定で親子関係を有効化したんですが、編集画面の投稿のメニューが固定ページになっちゃいました。逆に固定ページの親子関係を無効化したんですが、今度は固定ページが投稿になっちゃいました。
どうやら投稿と固定ページはページの性格をガチガチに固めてるところがあるらしく、親子関係の有無で無理やり投稿タイプを変えるらしい。
ちなみに固定ページはタクソノミーを関連付けることができます。デフォルトのカテゴリ・タグも可能。
ただこうなると『固定ページ』という名前がネックになります。そこに柔軟性を加えると名前とのギャップが生まれて編集者の混乱を招く。
ということで、タクソノミーが使えて投稿の親子関係も使える新たな投稿タイプを作ります。
新規のカスタム投稿を作る
まずは新規のカスタム投稿を作ります。
add_action('init', function() {
$labels = array(
'name' => '汎用',
'singular_name' => '汎用',
'add_new_item' => '新しい汎用を追加',
'add_new' => '新規追加',
'new_item' => '新しい汎用',
'view_item' => '汎用を表示',
'not_found' => '汎用はありません',
'not_found_in_trash' => 'ゴミ箱に汎用はありません。',
'search_items' => '汎用を検索',
);
$args = array(
'labels' => $labels,
'public' => true,
'show_ui' => true,
'query_var' => true,
'hierarchical' => true,
'menu_position' => 5,
'has_archive' => false,
'show_in_rest' => true,
'supports' => array(
'title',
'editor',
'thumbnail',
'page-attributes'
)
);
register_post_type('generic', $args );
} );
くわしい作り方は割愛して、これで『汎用』という投稿タイプが作られます。ちなみに、本来日本語の文字列は翻訳関数でくくるべきです。サンプルなのでこれも割愛。
カテゴリ・タグを『汎用』で使えるようにする。
今度は、タクソノミーを汎用で使えるようにしましょう。
add_action('init', function() {
register_taxonomy_for_object_type( 'category', 'generic');
register_taxonomy_for_object_type( 'post_tag', 'generic');
});
一応これで編集ページで設定できるようになったんですが、カテゴリやタグのアーカイブページのリストには含まれません。
アーカイブページのリスト取得のクエリーを作り直す必要があります。
(固定ページでカテゴリ・タグを使えるようにしても同じ。)
でもこれだとややこしいので、汎用専用のカテゴリやタグを新たに作ったほうが良いかも。デフォルトのカテゴリ・タグは『投稿』専用だとしたほうが良さそうです。
アーカイブページで、カテゴリやタグに含まれるすべての投稿タイプのページを取得するというチャレンジをしてもいいけど。