固定ページは投稿同士の親子関係を作れます。そういう設定だからなんですが、それなら投稿もできるんじゃないかと思って設定を変えてみました。
すると、できない。なんなら不思議な動きをしてしまいました。
WordPressを5年くらい使っててこんな発見をするとは思わなかった。
投稿タイプの設定に階層の有効化がある
投稿データはデータベースの wp_posts テーブルにあります。プログラムでは WP_Post オブジェクトに収められ、グローバル変数の $post にも入ってる。
その中に、親投稿のIDが入っている変数が用意されています。
この親投稿を使うように有効にするのが、投稿タイプを登録するとき。そのソースコードを見てみましょう。
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',
)
);
WordPress Codex 日本語版
WordPress.org リファレンス
'hierarchical' の値が投稿の階層の有効/無効です。投稿ページは false なので使えません。このパラメータの値は後で変更することが可能なので、それを使って投稿ページの階層を有効化しました。
『投稿』を階層化すると...。とんでもないことが起きた。
さっきの投稿タイプの設定情報はフィルターで変えることができます。そのコードがこちら。
add_filter('register_post_type_args', function( $args, $post_type ) {
if ( $post_type === 'post' ){
$args['hierarchical'] = true;
}
return $args;
}, 10, 2);
WordPress.org リファレンス
これを、処理フローでテーマの functions.php までに挿入すればOK。
よくテーマのfunctions.phpにコードを挿入する説明が見られますが、よくありません。テーマは本来機能を入れるものではないので。
本来やるべきではありませんが、テーマに入れる場面ではfunctions.phpにいろいろな処理を入れると、数百行、へたすると千単位にもわたる縦長のソースコードになってしまいます。
その記述はプログラマの書くものではありません。機能、役割ごとにファイルを分割するのがプログラミングの基本中の基本。
functions.phpは、requireを使って各機能のphpファイルをロードする親ファイルに徹してください。
すると、こんなん出ちゃいました。
管理画面のメニューで投稿が固定ページになりました。もちろん本来の固定ページとはちがいます。(下の方にちゃんとある。)
試しに、固定ページの階層化を解除してみました。挿入するコードはこちら。
add_filter('register_post_type_args', function( $args, $post_type ) {
if ( $post_type === 'page' ){
$args['hierarchical'] = false;
}
return $args;
}, 10, 2);
すると今度は、固定ページが投稿になっちゃいました。(キャプチャは割愛。)
デフォルト投稿タイプは階層有無に意味があるらしい。
投稿と固定ページはデフォルトの投稿タイプです。(WordPressのインストール時にすでにある。)
デフォルトでは、投稿はカテゴリ・タグが使えて階層化なし、固定ページは階層化があってカテゴリ・タグが使えない。
どうやら、投稿は階層化できない制限がある代わりにカテゴリ・タグがあって、固定ページは階層化があるからカテゴリ・タグを使えないようにしたらしい。
その性格を変えちゃいけねーよっていう仕様らしい。どこかに階層化されてたら固定ページにする、階層化されてなかったら投稿にする、というガチガチの処理をしてるよう。
そこまで、'hierarchical' に意味を持たせてるなんて思わなかった。たんに階層化の使用有無だけだと思ってた。
ちなみに、カテゴリ(タクソノミー)の設定を変えれば、固定ページでもカテゴリを設定できます。
そこは強制してないんだ...。