WordPress管理画面のカスタム投稿タイプ一覧(複数)にカスタムフィールドを表示する方法

「1つのカスタム投稿タイプにカスタムフィールドを表示する」のは簡単なんですが、「複数のカスタム投稿にそれぞれでしか使用しないカスタムフィールドを表示する」のがなかなかうまくいかず、手こずったので備忘録として。

前提条件

  • カスタム投稿タイプ「news」「topics」の2つ
  • 「news」で使用しているカスタムフィールドは「StartData」
  • 「topics」で使用しているカスタムフィールドは「EndData」

やりたいこと

管理画面において
「news」の記事一覧には「StartData」のカラムを表示し、
「topics」の記事一覧には「EndData」のカラムを表示したい

まず「news」の場合

1つだけでしたら簡単です。

function add_column($column_name, $post_id) {
	if( $column_name == 'StartData' ) {
		echo attribute_escape(get_post_meta($post_id, 'StartData', true));
	}
}
function manage_posts_columns($columns) {
	$columns['StartData'] = "スタート";
	return $columns;
}
add_action( 'manage_news_posts_custom_column', 'add_column', 10, 2 );
add_filter( 'manage_news_posts_columns', 'manage_posts_columns' );

続いて「topics」の場合(失敗バージョン)

まず失敗した書き方を載せます。
成功バージョンだけ見たい人は飛ばしてください。
上の「news」の場合の記述に「topics」分を追加してみました。

function add_column($column_name, $post_id) {
	if( $column_name == 'StartData' ) {
		echo attribute_escape(get_post_meta($post_id, 'StartData', true));
	}
	elseif( $column_name == EndData' ) {
		echo attribute_escape(get_post_meta($post_id, 'EndData', true));
	}
}
function manage_posts_columns($columns) {
	$columns['StartData'] = "スタート";
	$columns['EndData'] = "エンド";
	return $columns;
}
add_action( 'manage_news_posts_custom_column', 'add_column', 10, 2 );
add_filter( 'manage_news_posts_columns', 'manage_posts_columns' );
add_action( 'manage_topics_posts_custom_column', 'add_column', 10, 2 );
add_filter( 'manage_topics_posts_columns', 'manage_posts_columns' );

これだと「news」「topics」両方の記事一覧に「StartData」「EndData」のカラムが出てしまいました。
かと言って別々に書くとエラーになります。

function add_column($column_name, $post_id) {
	if( $column_name == 'StartData' ) {
		echo attribute_escape(get_post_meta($post_id, 'StartData', true));
	}
}
function manage_posts_columns($columns) {
	$columns['StartData'] = "スタート";
	return $columns;
}
add_action( 'manage_news_posts_custom_column', 'add_column', 10, 2 );
add_filter( 'manage_news_posts_columns', 'manage_posts_columns' );
function add_column($column_name, $post_id) {
	elseif( $column_name == EndData' ) {
		echo attribute_escape(get_post_meta($post_id, 'EndData', true));
	}
}
function manage_posts_columns($columns) {
	$columns['EndData'] = "エンド";
	return $columns;
}
add_action( 'manage_topics_posts_custom_column', 'add_column', 10, 2 );
add_filter( 'manage_topics_posts_columns', 'manage_posts_columns' );

まぁ、actionの’add_column’とfilterの’manage_posts_columns’被ってますからエラー当然です。

結論としては「ならば新しく作る」です。

「topics」の場合(成功バージョン)

add_action( 'manage_topics_posts_custom_column', 'my_add_column', 10, 2 );
function my_add_column($column_name, $post_id) {
	elseif( $column_name == EndData' ) {
		echo attribute_escape(get_post_meta($post_id, 'EndData', true));
	}
}
add_filter( 'manage_topics_posts_columns', 'my_manage_posts_columns' );
function my_manage_posts_columns($columns) {
	$columns['EndData'] = "エンド";
	return $columns;
}

actionの’add_column’を’my_add_column’に
filterの’manage_posts_columns’を’my_manage_posts_columns’としました。
これで「news」の記事一覧には「StartData」のカラム、「topics」の記事一覧には「EndData」のカラムを表示することができました。