ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

WordPress, 『投稿』は親子関係(階層)ができない。値を変えると固定ページになっちゃう!

wordpress image
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

固定ページは投稿同士の親子関係を作れます。そういう設定だからなんですが、それなら投稿もできるんじゃないかと思って設定を変えてみました。

すると、できない。なんなら不思議な動きをしてしまいました。

WordPressを5年くらい使っててこんな発見をするとは思わなかった。

投稿タイプの設定に階層の有効化がある

投稿データはデータベースの wp_posts テーブルにあります。プログラムでは WP_Post オブジェクトに収められ、グローバル変数の $post にも入ってる。

WordPress Codex 日本語版

クラスリファレンス - WP_Post

WordPress.org リファレンス

Class - WP_Post

その中に、親投稿のIDが入っている変数が用意されています。

この親投稿を使うように有効にするのが、投稿タイプを登録するとき。そのソースコードを見てみましょう。

wp-includes/post.php
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 日本語版

関数リファレンス - register_post_type

WordPress.org リファレンス

Function - register_post_type

'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 リファレンス

Hook - register_post_type_args

これを、処理フローでテーマの 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' に意味を持たせてるなんて思わなかった。たんに階層化の使用有無だけだと思ってた。

ちなみに、カテゴリ(タクソノミー)の設定を変えれば、固定ページでもカテゴリを設定できます。

そこは強制してないんだ...。

前の投稿
WordPress, 投稿や固定ページをカスタマイズする。(投稿タイプのカスタマイズ)
WordPress, カテゴリと投稿の階層(親子関係)をもてる投稿タイプを作る
次の投稿

WordPressの本

post-cta-image

たくさんあるなかで、WordPressの基本が学べる、目的別に学べる本を選びました。

  • WordPressの基本。
  • Webサイト作成から運用まで全体的に学ぶ。
  • かんたんなカスタマイズを学ぶ。
  • 何も分からないところから学ぶ。
  • WordPressからPHPプログラミングを学ぶ。

の5冊です。どうしてもネット上で調べて勉強するのが苦手という人におすすめです。

この内容をモノにすればほかの本は必要ありません。あとは自分の力で、書籍を使わずにインターネット上にある情報だけで学んでいけます。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください