こんにちは。金沢です。
Web解析ツールで当ホームページの被検索キーワードを眺めていると、「seo 金沢」や「デザイン作成会社 金沢」などといったものがありましたが、私どもは石川県金沢市と全く関係ございません。紛らわしくて申し訳ございません。
さて、今回はWordPressの管理画面をカスタマイズする方法の1つを紹介させて頂きます。
WordPress管理画面の「投稿」や「固定ページ」の一覧画面には、タイトルや公開日時、作者名などがリストの項目として表示されます。この一覧に任意の項目を追加する方法を説明させていただきます。
WP_List_Tableとその派生クラス
一覧を生成する関数は「WP_List_Table」というクラスにまとめられており、「wp-admin/includes/class-wp-list-table.php」にソースがあります。一覧の種類ごとに派生クラス(class ○○ extends △△と書くやつ)が用意されており、「class-wp-list-table.php」と同じディレクトリに各ソースファイルがあります。
ファイル名 | 出力先 |
---|---|
class-wp-posts-list-table.php | 投稿一覧、固定ページ一覧、カスタム投稿一覧 |
class-wp-medias-list-table.php | メディアライブラリ |
class-wp-comments-list-table.php | コメント一覧 |
class-wp-themes-list-table.php | 外観 -> テーマ一覧 |
class-wp-theme-install-list-table.php | 外観 -> テーマ ->新規追加 |
class-wp-plugins-list-table.php | インストール済みプラグイン |
class-wp-plugin-list-table.php | プラグイン新規追加 |
class-wp-users-list-table.php | ユーザー一覧 |
class-wp-ms-site-list-table.php | (*)サイト一覧 |
class-wp-ms-themes-list-table.php | (*)テーマ一覧 |
class-wp-ms-users-list-table.php | (*)ユーザー一覧 |
(*): マルチサイトの親サイト管理画面でのみ有効
フィルターフック「manage_posts_columns」など
まず、項目を追加するスペースを作る必要があります。一覧は表で構成されております。ソース上では、表の列が連想配列で表現されております。見出しのテキストが、列の識別用のIDとなる文字列をキーとし、配列に格納されています。
この配列は、フィルターフックでカスタマイズすることができます。フィルター名は一覧の種類ごとに異なり、「manage_posts_columns」や「manage_medias_columns」などといった形になります。基本的には、ソースファイル「class-wp-□□-list-table.php」に書かれている派生クラスに「manage_□□_columns」というフィルターフックが存在するようです。但し、「class-wp-posts-list-table.php」にあるこのようなフィルターフックは、if文で投稿一覧か固定ページかで条件分岐されており、「manage_posts_columns」か「manage_pages_columns」のどちらかが有効になります。更にその後ろに「manage_{$post_type}_columns」というカスタム投稿用のフィルターフックも控えております。目的に合ったフィルター名を用いましょう。
引数は配列の「$columns」だけで、下記のようにカスタマイズします。
function online_manage_columns( $columns ) { $columns['test'] = 'テスト'; return $columns; } add_filter( 'manage_posts_columns', 'online_manage_columns' );
例文は非常に単純ですが、追加するテキストをdivタグで囲ってスタイルを付けたり、「$columns」の並び順を変えたりするなどをして調整も行えます。
アクションフック「manage_posts_custom_columns」など
あとは、追加した項目ごとの表示をさせる仕組みを作ります。一覧の中身を生成する関数は1列ごとに呼び出され、「$columns」をforeach文でキーと要素を取り出してループさせています。そのループ内に、オリジナルの項目を追加できるアクションフックが存在します。「manage_□□_columns」と同じように「manage_□□_custom_columns」という名前のアクションフックです。項目1つの表示位置は、投稿IDと「$columns」で指定したキーにより決まりますので、アクションフックには少なくとも2つの引数が渡されます。以下に例を示します。「$columns」の指定も含めて、テストが上手くできたものを全て示します。
// テストの列を追加 function online_manage_columns( $columns ) { $columns['test'] = 'テスト'; return $columns; } // 投稿IDを表示 function online_manage_custom_column_2args( $column_name, $post_id ) { if ( 'test' == $column_name ) echo 'ID: ' . $post_id; } // ユーザーIDを表示 function online_manage_custom_column_3args( $blank, $column_name, $user_id ) { if ( 'test' == $column_name ) return 'ID: ' . $post_id; } // プラグインファイル名を表示 function online_manage_custom_column_plugin( $column_name, $plugin_file, $plugin_data ) { if ( 'test' == $column_name ) echo 'file: ' . $plugin_file; } // 投稿一覧にフック add_filter( 'manage_posts_columns', 'online_manage_columns' ); add_action( 'manage_posts_custom_column', 'online_manage_custom_column_2args', 10, 2 ); // 固定ページ一覧にフック add_filter( 'manage_pages_columns', 'online_manage_columns' ); add_action( 'manage_pages_custom_column', 'online_manage_custom_column_2args', 10, 2 ); // メディアライブラリにフック add_filter( 'manage_media_columns', 'online_manage_columns' ); add_action( 'manage_media_custom_column', 'online_manage_custom_column_2args', 10, 2 ); // ユーザー一覧にフック add_filter( 'manage_users_columns', 'online_manage_columns' ); add_action( 'manage_users_custom_column', 'online_manage_custom_column_3args', 10, 3 ); // インストール済みプラグイン一覧にフック add_filter( 'manage_plugins_columns', 'online_manage_columns' ); add_action( 'manage_plugins_custom_column', 'online_manage_custom_column_plugin', 10, 3 );
「$column_name」で渡される文字列が、foreachループの現在の要素のキー、すなわち現在の列の識別用文字列となっておりますので、if文でカスタマイズしたい列かどうかを条件分岐しましょう。カスタマイズ項目が多い場合はswitch文を用いるのもありです。デフォルトの「タイトル」や「作者名」などはswitch文を使っていました。
今回の例では投稿一覧と固定ページ一覧、メディアライブラリは投稿IDを表示しています。ユーザー一覧はユーザーIDを、インストール済みプラグインの一覧では「wp-content/plugins」ディレクトリ以下のファイルパスを表示しています。
ユーザー一覧のアクションフックでは、「$blank」という空の文字列が引数として渡されています。これにより、投稿一覧などと同じコールバック関数を用いることができなくなっていました。引数が3つの「online_manage_custom_column_3args」関数を定義しなおし、「add_action」関数の4つ目の引数(コールバック関数に渡す引数の数を指定できる。初期値は「1」)を「3」に変えてやればちゃんとできました。「add_action」の4つ目の引数の意味をこれまで知りませんでしたので、少しハマってしまいましたけどね。ここでは更に、出力が「echo」ではなく「return」で戻さないといけないことにも注意してください。
プラグインにはID番号という概念がありませんので、重複することのない「ディレクトリ + ファイル名」が引数に渡されています。また、もう1つの引数「$plugin_data」は配列です。バージョン情報やディスクリプションなど、プラグインに関する色々な情報が格納されています。
コメント一覧では確認ができませんでした。やり方が違ったのでしょうか? テーマ一覧では表示オプションには出てきましたが、実際の一覧には変化がないように見えました。これらはまだまだ調査が必要ですね。へるぷみー。
まとめ
投稿IDが取り出せれば、そこから関係するものは何でも引っ張ってこれますので何でも表示できます。よく見かけるのは投稿一覧にサムネイル画像を表示するものですね。検索すればたくさん出てきますが、「posts」以外の一覧でもカスタマイズできることが発見でしたので、知っていただきたいと思い今回の記事にまとめてみました。何に使えるのか、いまいち思いつかないものもありますが、凄い発想を持った方が訪れないとも限りません。あずかり知らぬところで支え、支えられているのがインターネットの醍醐味なのかもしれませんね。ご精読、ありがとうございました。
金沢
難しいけど、読みやすい^o^