管理画面で、投稿や固定ページ、カスタム投稿の一覧には、タイトルや投稿者などの項目が並んでいますが、そこにカスタムフィールドを表示させたい場合があります。
今回、ちょっと手こずったところもあったので、それも合せてまとめ。
まず、管理画面の一覧でカラムを表示させたい場合、
固定ページでは、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 を使うと、カスタム投稿やカスタムフィールドの管理が楽な反面、トラブル発生時に手こずるというアルアルですね。