WordPress管理画面の一覧でカラムを表示させたい

管理画面で、投稿や固定ページ、カスタム投稿の一覧には、タイトルや投稿者などの項目が並んでいますが、そこにカスタムフィールドを表示させたい場合があります。

今回、ちょっと手こずったところもあったので、それも合せてまとめ。

管理画面の一覧でカラムを表示

まず、管理画面の一覧でカラムを表示させたい場合、
固定ページでは、manage_pages_columns
投稿では、manage_posts_columns
カスタム投稿では、manage_posts_columns、または、manage_${post_type}_posts_columns
を使います。

以下、itemsというカスタム投稿と、item_idというカスタムフィールドがすでにあるとして、それを表示させたい場合。function.phpに以下を追加します。

固定ページでは、

function add_column_name ( $columns ) {
	$columns['item_id'] = "アイテムID";
	return $columns;
}
add_filter( 'manage_pages_columns', 'add_column_name' );

投稿では、

function add_column_name ( $columns ) {
	$columns['item_id'] = "アイテムID";
	return $columns;
}
add_filter( 'manage_posts_columns', 'add_column_name' );

とします。

$columns[‘item_id’] のitem_id はカスタムフィールド名と一致していなくてもも構いません。また、カスタム投稿は、投稿の一種なので、manage_posts_columnsを使えば、同じように表示されます。

なので、カスタム投稿では表示させたいくない場合、get_post_type を使って、投稿の場合だけに限定する必要があります。

function add_column_name ( $columns ) {
	global $post;
	if (get_post_type( $post ) == 'post'){
		$columns['item_id'] = "アイテムID";
	}
	return $columns;
}
add_filter( 'manage_posts_columns', 'add_column_name' );

カスタム投稿だけに限定したければ、同じように、

function add_column_name ( $columns ) {
	global $post;
	if (get_post_type( $post ) == 'itenms'){
		$columns['item_id'] = "アイテムID";
	}
	return $columns;
}
add_filter( 'manage_posts_columns', 'add_column_name' );

とすればOKです。
または、manage_${post_type}_posts_columns を使って、以下のようにしてもおなじです。

function add_column_name ( $columns ) {
	$columns['item_id'] = "アイテムID";
	return $columns;
}
add_filter( 'manage_items_columns', 'add_column_name' );

さらに、カスタム投稿では、日付を表示する必要が無いという場合。次のようにunsetで削除できます。

次の例は、カスタム投稿が items のときには、dateを削除、ついでに投稿でコメントを非表示にしたいとき。

function add_column_name ( $columns ) {
	global $post;
	if (get_post_type( $post ) == 'items'){
		$columns['item_id'] = "アイテムID";
		unset($columns['date']);
	}
	unset($columns['tags']);
	return $columns;
}
add_filter( 'manage_posts_columns', 'add_column_name' );

ここまでで、一覧に項目が表示されるようになるはずです。

カスタムフィールドの値を一覧に表示させる

続いて、カスタムフィールドの値を表示させるようにします。

投稿、カスタム投稿では、manage_posts_custom_column を使います。
固定ページでは、manage_pages_custom_column を使います。

次の例では、固定ページ、投稿、カスタム投稿すべてに対応します。

//item_idの項目に値を表示
function add_column_value ($column_name, $post_ID) {
	if( $column_name == 'item_id' ) {
		echo get_post_meta($post_ID, 'item_id', true);
		//echo get_post_meta($post_ID, 'wpcf-item_id', true);//カスタムフィールドの作成に、プラグインの「Types」をつかている場合は、wpcf-をつける
	}
}
add_filter( 'manage_pages_custom_column', 'add_column_value', 10, 2 );
add_filter( 'manage_posts_custom_column', 'add_column_value', 10, 2 );

通常、投稿は投稿の日付順、固定ページとカスタム投稿はタイトル順 で並べられて表示されます。
そうではなくて、カスタムフィールドの値順で並べたい場合もあります。そんなときは、pre_get_posts で、is_admin で分岐させて並べ替えます。

表示された一覧を、item_id の順番で表示させたい場合、

//カスタム投稿itemsの一覧を、カスタムフィールドitem_idの値順に並べ替え
function set_post_types_admin_order( $wp_query ) {
	if (is_admin()) {
		$post_type = $wp_query->query['post_type'];
		if ( $post_type == 'items' ) {
			$wp_query->set('meta_key', 'item_id');
			$wp_query->set('orderby', 'meta_value');
			$wp_query->set('order', 'ASC');
		}
	}
}
add_filter( 'pre_get_posts', 'set_post_types_admin_order' );

[まとめ]管理画面で、カスタム投稿の一覧にカスタムフィールドの値を表示させて、その値順に並べ替える

以上、まとめますと、こんな感じになります。

//カスタム投稿にカスタムフィールドの項目を追加
function add_column_name ( $columns ) {
	$columns['item_id'] = "アイテムID";
	unset($columns['date']);
	return $columns;
}
add_filter( 'manage_items_columns', 'add_column_name' );

//カスタムフィールドitem_idの項目に値を表示
function add_column_value ($column_name, $post_ID) {
	if( $column_name == 'item_id' ) {
		echo get_post_meta($post_ID, 'item_id', true);
	}
}
add_filter( 'manage_posts_custom_column', 'add_column_value', 10, 2 );

//カスタム投稿itemsの一覧を、カスタムフィールドitem_idの値順に並べ替え
function set_post_types_admin_order( $wp_query ) {
  if (is_admin()) {
	$post_type = $wp_query->query['post_type'];
	if ( $post_type == 'items' ) {
	  $wp_query->set('meta_key', 'item_id');
	  $wp_query->set('orderby', 'meta_value');
	  $wp_query->set('order', 'ASC');
	}
  }
}
add_filter( 'pre_get_posts', 'set_post_types_admin_order' );

[トラブル解決]カスタム投稿一覧で、値が表示されない

カスタム投稿一覧に、項目の追加はできたけれど、なぜか値が表示されない、というトラブルに悩まされました。

カスタム投稿やカスタムフィールドを管理するのに、Typesを使っていたのですが、他のプラグインを全部無効にしてみたり、別のカスタム投稿で試したりと苦闘の末、Types自身の、カスタム投稿の設定で、「階層」にチェックをつけていたことが原因のようでした。

これは、カスタム投稿の hierarchical に該当する設定で、投稿そのものに親子関係をもたせられるようにする、というやつです。
仮にTypesを使わずにカスタム投稿をつくって試すと、hierarchical をtrueにしても問題ないので、Types固有の現象かもしれません。

いずれにしても、今回の事案では意味もなくチェックをつけてしまっていたようで、いらなのでチェックを外すと、すんなりと解決しました。

同じように、Types使ってて、カスタム投稿一覧にカスタムフィールドが表示されずに困ったら、設定を疑ってみてください。

それにしても、たったこれだけに、半日を費やしてしまいました。。。
TypesやAdvance Coutom Fields を使うと、カスタム投稿やカスタムフィールドの管理が楽な反面、トラブル発生時に手こずるというアルアルですね。

 

nakaike