投稿には2つのグループ分けができます。ひとつはタクソノミーを作ってカテゴリの箱を用意すること。もうひとつは、投稿そのものに階層構造(親子関係)を持たせること。
それぞれに特長があり使い分けが必要です。今回はタクソノミーと親子関係の仕組みと違いから、それぞれの使い方を説明します。
制限は多いけどシンプルで分かりやすい投稿の階層構造(親子関係)
投稿の階層構造の特長はこれだけです。
子が持てる親はひとつだけ。(親が無くてもいい)
親は子を複数持てる。
数世代にわたって親子関係を作れる。
(プログラム的に、サイトパフォーマンス的に限界はあるが気にするほどではない。)
これはカテゴリなどのタクソノミーと同じ。階層構造ができる投稿タイプの投稿一覧を見ればカテゴリと同じように表示されます。
("-" を使って階層を表現している。)
そして一番の特長はURLが階層になるところ。
親1 | https://example.com/parent-1 |
子1 | https://example.com/parent-1/child-1 |
子2 | https://example.com/parent-1/child-2 |
子3 | https://example.com/parent-1/child-3 |
親のURLパスに子のスラッグが足されていきます。階層が深ければ深いほどURLは長くなりますが、URLを見てどのグループに属しているかが分かるメリットがあります。
デフォルトの投稿タイプで使えるのは固定ページのみ
投稿の階層構造は、デフォルトの投稿タイプで使えるのは『固定ページ』だけです。『投稿』では使えません。
投稿タイプを作るソースコードを見れば一目瞭然。
/**
* Creates the initial post types when 'init' action is fired.
*
* See {@see 'init'}.
*
* @since 2.9.0
*/
function create_initial_post_types() {
register_post_type(
'post',
array(
'labels' => array(
'name_admin_bar' => _x( 'Post', 'add new from admin bar' ),
),
'public' => true,
'_builtin' => true, /* internal use only. don't use this when registering your own post type. */
'_edit_link' => 'post.php?post=%d', /* internal use only. don't use this when registering your own post type. */
'capability_type' => 'post',
'map_meta_cap' => true,
'menu_position' => 5,
'hierarchical' => false,
'rewrite' => false,
'query_var' => false,
'delete_with_user' => true,
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'post-formats' ),
'show_in_rest' => true,
'rest_base' => 'posts',
'rest_controller_class' => 'WP_REST_Posts_Controller',
)
);
register_post_type(
'page',
array(
'labels' => array(
'name_admin_bar' => _x( 'Page', 'add new from admin bar' ),
),
'public' => true,
'publicly_queryable' => false,
'_builtin' => true, /* internal use only. don't use this when registering your own post type. */
'_edit_link' => 'post.php?post=%d', /* internal use only. don't use this when registering your own post type. */
'capability_type' => 'page',
'map_meta_cap' => true,
'menu_position' => 20,
'hierarchical' => true,
'rewrite' => false,
'query_var' => false,
'delete_with_user' => true,
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'page-attributes', 'custom-fields', 'comments', 'revisions' ),
'show_in_rest' => true,
'rest_base' => 'pages',
'rest_controller_class' => 'WP_REST_Posts_Controller',
)
);
// 以下省略
}
WordPress Codex 日本語版
WordPress.org リファレンス
register_post_type() のパラメータ 'hierarchical' が、固定ページが true, 投稿ページが falseになっています。
(trueにすると投稿タイプで階層構造が使える。)
投稿の階層の弱点
投稿の階層は投稿自身がひとつの親しか持てないので、複数のグループに属することができません。
例えば、会社の社員には複数の部署を兼任する人がいます。こういうときグループ分けするには不便です。
なぜデフォルトの投稿タイプでは固定ページだけを有効にしているのか分かるでしょう。投稿の階層はガチガチに固めてるので、変更や追加の多いページには向きません。
とくに変更は、グループを変更しただけでURLが変わります。Webサイトはリンクを貼って繋げていくのでリンク先の修正が大変。
せっかく自サイトの情報が良いと判断されて第3者にリンクしてもらってもそれが切れてしまっては意味がない。
Webサイトは情報が広がってなんぼのところがあるのでそのメリットが活かせません。そういうときは、制限のゆるいタクソノミーを使います。
親情報は子の投稿がもつ
投稿の親子関係の情報は、子になる投稿に入ってます。WP_Postオブジェクト。グローバル変数の $post と言ったほうが分かりやすいでしょうか?
そこに、$post->post_parent という項目があり、親の投稿IDが入ります。これは整数値を入れることになっているので複数の親を持つことができません。
投稿の階層はグループ分けが変わらないものに有効。
柔軟すぎてURLが階層になってないタクソノミー
投稿の親子関係の弱点を補うのがタクソノミーです。デフォルトでは『カテゴリ』が使えます。タクソノミーはグループだけを表す独立したデータ。
データベースでもテーブルがちがう(wp_taxonomy, wp_posts)。
一方、投稿の階層はwp_postsのカラムで親投稿IDを持たせてる。
これだけ見ても、投稿の階層よりも親子関係のつなぎ方が弱いことが分かります。これを俗に疎結合と言います。
(逆に結合が強いものを密結合という。)
この弱い結合により投稿は親を複数持つことができ、また子を複数持つことができます。
投稿編集画面では、どのタクソノミーに所属するのかオプションで選択できる。
疎結合では、投稿同士は親子関係をもってないことに注意して下さい。あくまで階層を作っているのはタクソノミーです。
投稿はタクソノミーに所属することで間接的に親子関係を構成します。だから疎結合になる。
デフォルトでカテゴリを使えるのは『投稿』のみ。
投稿の階層では固定ページだけが使えると言いましたが、デフォルトのタクソノミーのカテゴリを使えるのは『投稿』のみです。
『投稿』はブログの記事を書くことを目的にしているので、大量のページを書くことが予想されます。親子関係も柔軟じゃないとなにかと不便になる。
たとえば、コスメの記事を書いていて、『コスメ』というジャンルのカテゴリに入れたいし、『おすすめの商品』というカテゴリに入れたいなど。
そういうとき、疎結合のカテゴリが使いやすいです。
register_taxonomy(
'category',
'post',
array(
'hierarchical' => true,
'query_var' => 'category_name',
'rewrite' => $rewrite['category'],
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'_builtin' => true,
'capabilities' => array(
'manage_terms' => 'manage_categories',
'edit_terms' => 'edit_categories',
'delete_terms' => 'delete_categories',
'assign_terms' => 'assign_categories',
),
'show_in_rest' => true,
'rest_base' => 'categories',
'rest_controller_class' => 'WP_REST_Terms_Controller',
)
);
register_taxonomy()の2番目のパラメータを見てください。'post' だけが指定されています。ここでどの投稿タイプで使うかを指定しています。
タクソノミーは、登録情報を変更する方法が用意されています。タクソノミー名以外はすべて変更可能。
タクソノミーの弱点
タクソノミーでのグループ化の弱点は投稿のURLが階層になっていないこと。当たり前です。階層を作ってるのはタクソノミーなので。
でも、投稿が所属するタクソノミーのパンくずリストをページに表示できるので心配ありません。(投稿の階層でもパンくずリストが作れる。)
URLは階層とは無関係なので所属するグループをあとで変更することも可能です。ざっくりとしたグループを細分化する、グループを簡素化するなどの柔軟性があります。
SEOの点からURLに意味を持たせないといけないと考える人もいるかも知れませんが、個人的にはあまり意味がないと思っています。
Googleなどの検索エンジンは、サイトの評価に構造化マークアップ(Schema.org)を見ています。パンくずリストもSchema.orgで明記することができるので、サイトのページにパンくずリストを作り、その構造化マークアップをHTMLに挿入すれば問題ありません。
というか、SEOの点から見てもSchema.orgの挿入は必須。これさえしとけはURLはどうでもいいと思います。
TwitterなどのSNSではリンクを貼ったページのURLを短縮させます。
そのURLはランダムなもので意味はまったくない。
URLの短縮はそのほかでも行われているので、URLに意味をもたせるメリットは無くなっています。
かつてはURLを直接編集して上の階層に移動したりしていましたが、今それをしている人はほとんどいないでしょう。
タクソノミーのアーカイブページのURLはタクソノミーの親子関係を使って階層構造です。
タクソノミーでの投稿の親子関係はつながりがゆるい。
URLはどうでもいい。Schema.orgを挿入すれば良い。
タグとカテゴリのちがい
WordPressのデフォルトのタクソノミーにはもうひとつ、タグがあります。タグはSNSで使われ一般化したグループ化のしくみ。
カテゴリとちがってタグに親子関係はありません。
register_taxonomy(
'post_tag',
'post',
array(
'hierarchical' => false,
'query_var' => 'tag',
'rewrite' => $rewrite['post_tag'],
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'_builtin' => true,
'capabilities' => array(
'manage_terms' => 'manage_post_tags',
'edit_terms' => 'edit_post_tags',
'delete_terms' => 'delete_post_tags',
'assign_terms' => 'assign_post_tags',
),
'show_in_rest' => true,
'rest_base' => 'tags',
'rest_controller_class' => 'WP_REST_Terms_Controller',
)
);
ソースコードを確認するとやっぱり 'hierarchical' は false になってます。