管理画面の投稿一覧にカスタムフィールド項目を追加

投稿記事にカスタムフィールドを設定しているとき、一覧表示の時にもその値を表示したいと思う時ありますよね。また、その値でソートできればとても便利かなと思います。
そこでソートできるカラムを追加したいと思います。

カラムを追加

以下の例は’plan’と’venue’というカスタムフィールドのカラムを追加します。
function add_posts_columns_name($columns) {
    $columns[‘plan'] = '予定日';
    $columns[‘venue'] = '会場';
    return $columns;
}
add_filter( 'manage_posts_columns', 'add_posts_columns_name' );
function add_column($column_name, $post_id) {
    if ($column_name == 'plan') {
        $plan = get_post_meta($post_id, 'plan', true);     //dateカスタムフィールドから値を取得
    }
    if ($column_name == 'venue') {
        $venue = get_post_meta($post_id, 'venue', true);     //venueカスタムフィールドから値を取得
    }
    if (isset($plan) && $plan) {
        echo attribute_escape($plan);        //予定日を表示
    } elseif (isset($venue) && $venue) {
        echo attribute_escape($venue);     //会場を表示
    } else {
        echo ‘なし';     //フィールドに値がなければ’なし'を表示
    }
}
add_action( 'manage_posts_custom_column', 'add_column', 10, 2 );

そのカラムにソート機能を入れたい場合

function custom_sortable_columns($sortable_column) {
    $sortable_column['plan'] = 'plan';
    $sortable_column['venue'] = 'venue';
    return $sortable_column;
}
function custom_orderby_columns( $vars ) {
    if (isset($vars['orderby']) && 'plan' == $vars['orderby']) { //予定日をソートできるようにする
        $vars = array_merge($vars, array(
            'meta_key' => 'plan',
            'orderby' => 'meta_value',
            ‘meta_type’ => ‘date’, //値が日付なのでdate型でキャスト
        ));
    }
    if (isset($vars['orderby']) && 'venue' == $vars['orderby']) { //会場をソートできるようにする
        $vars = array_merge($vars, array(
            'meta_key' => 'venue',
            'orderby' => 'meta_value',
            ‘meta_type’ => ‘char’, //値が文字列なのでchar型でキャスト
        ));
    }
    return $vars;
}
add_filter( 'manage_edit-post_sortable_columns', ‘custom_sortable_columns’ );
add_filter( 'request', 'custom_orderby_columns' );

これで管理画面の投稿一覧に表示されソートもできるようになります。 デフォルトだとカスタムフィールドの値のソートが値によっては正しくソートされないので、値に応じて特定の型にキャストします。

ちなみに、固定ページの一覧に同じことをしたければ、
add_filter( 'manage_pages_columns', 'add_posts_columns_name' );
add_action( 'manage_pages_custom_column', 'add_column', 10, 2 );
add_filter( ‘manage_edit-page_sortable_columns', 'custom_sortable_columns');
でフィルターすれば実装できます。
また、表示したくないカラムを非表示にすることもできます。
以下の例は作成者のカラムを非表示にしています。
function custom_columns($columns) {
        unset($columns['author']);
        return $columns;
}
add_filter( 'manage_posts_columns', 'custom_columns' );
作成者以外のカラムでは例えば以下のようなのもあります。
unset($columns['title']);               //タイトル
unset($columns['categories']);    //カテゴリー
unset($columns['tags']);              //タグ