WordPressのカスタマイズをしていて、管理画面の投稿一覧の使い勝手も向上させたい!と思う時ってありますよね。
ポイントとなる項目を一覧で見ることができるだけで、かなり管理画面が便利になりますが、それにソート機能や絞り込み機能をつけることができると、なお良いですよね。
そこでこの記事ではWordPressの管理画面をより便利にするタクソノミーやカスタムフィールドの列を追加する方法について、基本の書き方の説明と、実装例を記載しています。
【例】タクソノミーを投稿一覧に表示して、絞り込み機能をつける
【例】カスタムフィールドを投稿一覧に表示して、ソート機能をつける
【例】IDをタクソノミー一覧に表示して、ソート機能をつける
基本の書き方
まず、管理画面の投稿一覧またはタクソノミー一覧に対して、以下のそれぞれの基本の書き方について説明します。
1.列を追加する
2.内容を表示する
3.ソート機能をつける
4.絞り込み機能をつける
初期状態
1.列を追加する
列を追加するのは以下のコードだけなのでシンプルです。
「my_column_name」は他と被らないものにする必要があります。
1 2 3 4 5 | function my_add_columns($columns) { $columns['my_column_name'] = '列名'; return $columns; } add_filter( 'manage_edit-{カスタム投稿タイプ}_columns', 'my_add_columns' ); |
2.内容を表示する
内容を表示するのは、「カスタム投稿一覧」の時と、「タクソノミー一覧」の時では少し違いますので、注意が必要です。
カスタム投稿一覧の時
ここでは、カスタムフィールド「comment_group」の値を表示しようとしています。
「my_column_name」は上記で指定したものと同じ名前にする必要があります。
1 2 3 4 5 6 7 8 9 10 11 | function my_add_columns_content($column_name, $post_id) { if( $column_name == 'my_column_name' ) { $metas = get_post_meta($post_id); $stitle = $metas['comment_group'][0]; } if ( isset($stitle) && $stitle ) { echo esc_attr($stitle); } } add_action( 'manage_{カスタム投稿タイプ}_posts_custom_column', 'my_add_columns_content', 10, 2 ); |
「my_add_columns_content」の第二引数「$post_id」には投稿IDが入ってきますので、それを使っていろんな値をとることができます。
タクソノミー一覧の時
タクソノミーIDを表示させる、という内容です。
1 2 3 4 5 6 7 8 9 10 | function my_add_columns_content_taxonomy($arg_1, $column_name, $term_id) { if( $column_name == 'my_column_name' ) { $stitle = $term_id; } if ( isset($stitle) && $stitle ) { echo esc_attr($stitle); } } add_action( 'manage_{タクソノミー}_custom_column', 'my_add_columns_content_taxonomy', 10, 3 ); |
タクソノミー一覧の場合は第三引数にタクソノミーIDが入ってきます。
「add_action」の指定のときに、「…, 10, 3 );」という風に第三引数まで取るように指定するのを忘れずに。
3.ソート機能をつける
投稿の基本項目(ID, slugなど)ならソート機能をつけるのは簡単です。以下のコードだけでOKです。
1 2 3 4 5 | function my_add_sort($columns){ $columns['my_column_name'] = 'ID'; return $columns; } add_filter( 'manage_edit-{カスタム投稿タイプ}_sortable_columns', 'my_add_sort'); |
「… = ‘ID’;」の部分は、WP_Queryのソートで用いることのできる指定ならOKです(関数リファレンス参照)。
カスタムフィールドの値などによるソートを行う場合は、もう少し複雑です。
カスタムフィールドのどの項目でソートするのかを明示しないといけません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function my_add_sort($columns){ $columns['my_column_name'] = 'my_sort_name'; return $columns; } function my_add_sort_by_meta( $query ) { if ( $query->is_main_query() && ( $orderby = $query->get( 'orderby' ) ) ) { switch( $orderby ) { case 'my_sort_name': $query->set( 'meta_key', 'comment_group' ); $query->set( 'orderby', 'meta_value_num' ); break; } } } add_filter( 'manage_edit-{カスタム投稿タイプ}_sortable_columns', 'my_add_sort'); add_action( 'pre_get_posts', 'my_add_sort_by_meta', 1 ); |
カスタムフィールド「comment_group」の数でソートする、というケースです。
4.絞り込み機能をつける
さきほどは、ソート機能をつけるやり方について説明しましたが、実は、一覧にタクソノミーを表示させる場合、ソートができません。
なぜなら、関数リファレンスのソートの説明を見ると分かりますが、タクソノミーでソートする記述方法がそもそもないからです。
ですから、タクソノミーには「ソート機能」ではなく「絞り込み機能」をつけてやります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | function my_add_filter() { global $post_type; if ( '{カスタム投稿タイプ}' == $post_type ) { ?> <select name="{タクソノミー}"> <option value="">タクソノミー指定なし</option> <?php $terms = get_terms('{タクソノミー}'); foreach ($terms as $term) { ?> <option value="<?php echo $term->slug; ?>" <?php if ( $_GET['{タクソノミー}'] == $term->slug ) { print 'selected'; } ?>><?php echo $term->name; ?></option> <?php } ?> </select> <?php } } add_action( 'restrict_manage_posts', 'my_add_filter' ); |
コメント数はカスタムフィールドなのでソート機能を、タクソノミーには絞り込み機能をつけた
以上を踏まえた実装例を以下で記載します。何かの参考にしていただければ幸いです。
【例】タクソノミーを投稿一覧に表示して、絞り込み機能をつける
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | function my_manage_posts_columns_faq_category($columns) { $columns['faq_category'] = "カテゴリー"; return $columns; } function my_add_column_faq_category($column_name, $post_id) { if( $column_name == 'faq_category' ) { $tax = wp_get_object_terms($post_id, 'faq_category'); $stitle = $tax[0]->name; } if ( isset($stitle) && $stitle ) { echo esc_attr($stitle); } } function my_add_post_taxonomy_restrict_filter() { global $post_type; if ( 'faq' == $post_type ) { ?> <select name="faq_category"> <option value="">カテゴリー指定なし</option> <?php $terms = get_terms('faq_category'); foreach ($terms as $term) { ?> <option value="<?php echo $term->slug; ?>" <?php if ( $_GET['faq_category'] == $term->slug ) { print 'selected'; } ?>><?php echo $term->name; ?></option> <?php } ?> </select> <?php } } add_filter( 'manage_edit-faq_columns', 'my_manage_posts_columns_faq_category' ); add_action( 'manage_faq_posts_custom_column', 'my_add_column_faq_category', 10, 2 ); add_action( 'restrict_manage_posts', 'my_add_post_taxonomy_restrict_filter' ); |
【例】カスタムフィールドを投稿一覧に表示して、ソート機能をつける
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | function my_manage_posts_columns_results_display($columns) { $columns['display_check'] = "表示"; return $columns; } function my_add_column_results_display($column_name, $post_id) { if( $column_name == 'display_check' ) { $metas = get_post_meta($post_id); $stitle = $metas['display_check'][0] == 'true' ? '表示する' : '表示しない'; } if ( isset($stitle) && $stitle ) { echo esc_attr($stitle); } } function my_manage_edit_results_display_sortable_columns($columns){ $columns['display_check'] = 'display_check'; return $columns; } function my_manage_edit_results_display_sortable_columns_order( $query ) { if ( $query->is_main_query() && ( $orderby = $query->get( 'orderby' ) ) ) { switch( $orderby ) { case 'display_check': $query->set( 'meta_key', 'display_check' ); $query->set( 'orderby', 'meta_value' ); break; } } } add_filter( 'manage_edit-results_columns', 'my_manage_posts_columns_results_display' ); add_action( 'manage_results_posts_custom_column', 'my_add_column_results_display', 10, 2 ); add_filter( 'manage_edit-results_sortable_columns', 'my_manage_edit_results_display_sortable_columns'); add_action( 'pre_get_posts', 'my_manage_edit_results_display_sortable_columns_order', 1 ); |
【例】IDをタクソノミー一覧に表示して、ソート機能をつける
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | function my_manage_posts_columns_category_term_id($columns) { $columns['term_id'] = "ID"; return $columns; } function my_add_column_category_term_id($args_1, $column_name, $term_id) { if( $column_name == 'term_id' ) { $stitle = $term_id; } if ( isset($stitle) && $stitle ) { echo esc_attr($stitle); } } function my_manage_edit_category_term_id_sortable_columns($columns){ $columns['term_id'] = 'ID'; return $columns; } add_filter( 'manage_edit-category_columns', 'my_manage_posts_columns_category_term_id' ); add_action( 'manage_category_custom_column', 'my_add_column_category_term_id', 10, 3 ); add_filter( 'manage_edit-category_sortable_columns', 'my_manage_edit_category_term_id_sortable_columns'); |
南本貴之