投稿を階層ありにした場合の、管理画面の投稿一覧のカスタムカラム

WordPress 標準の「投稿」(post) を、固定ページのように階層を持つようにする必要が生じたため、アクションフック registered_post_type を利用して「投稿」の hierarchical プロパティを変更しました。

add_action( 'registered_post_type', function( $post_type, $post_type_object ) {
if ( $post_type == 'post' ) {
$post_type_object->hierarchical = true;
add_post_type_support( 'post', 'page-attributes' );
}
}, 10, 2 );

これで、投稿の階層を有効化できたのですが、アクションフック manage_posts_custom_column で管理画面の投稿一覧に追加していたカスタムカラムの内容が出力されなくなってしまいました。具体的には、各投稿のアイキャッチ画像のサムネイルを表示するカラムに何も表示されなくなりました。

当初は、階層を持たせたことで get_the_post_thumbnail() でアイキャッチ画像の情報を取得する部分の挙動に何らかの影響が出たのかと思ったのですが、調べてみたら、そもそも manage_posts_custom_column にフックしたコードが全然実行されていませんでした。

なぜだろうと思っていろいろ検索していたら、”manage_posts_custom_column でダメなら manage_{$post_type}_posts_custom_column を使え” 的なブログ記事があって、試してみたらアイキャッチ画像カラムが復活したので、「プロパティを変更するとカスタム投稿タイプ扱いになるのか」と思ったのですが、それは違いました。

そもそものコアのソース (wp-admin\includes\class-wp-posts-list-table.php) を見てみると…

(public function column_default() の末尾付近の抜粋)
if ( is_post_type_hierarchical( $post->post_type ) ) { do_action( 'manage_pages_custom_column', $column_name, $post->ID ); } else { do_action( 'manage_posts_custom_column', $column_name, $post->ID ); } do_action( "manage_{$post->post_type}_posts_custom_column", $column_name, $post->ID );

…となっていて、投稿タイプが階層を持つかどうかで実行するアクションフックが分かれていました。つまり、投稿タイプ post を階層アリに変更したら、カスタムカラム表示のためのアクションフックは manage_pages_custom_column を使えばよいのでした。

階層の有無によるフックの切り分けの後に manage_{$post->post_type}_posts_custom_column が実行されるので、これを使ってもいいわけですが、標準の投稿に対して使うとすると manage_post_posts_custom_column というフック名になって、ちょっと変な感じになります。

「hierarchicalプロパティを変更したらカスタム投稿タイプ扱いになる」というのがどうも腑に落ちない感じだったのですが、やっぱりそんなことはなかったわけです。横着せずにコアのソースを読まないとダメですね。


さて、ようやく先日から Gutenberg エディタを使い始めました。始めのうちは戸惑うことも多くて、ついクラシックエディタに戻りたくなってしまいますが、ここは乗り越えないと未来が広がらないと思って耐えています。