WordPressの管理画面でユーザー一覧をカスタマイズしようと着手したところ、予想以上に手間取りましたので情報としてまとめておきます。
項目の追加や削除は簡単にできますが、既存の項目と同じように、昇順・降順の並べ替え機能をつけなければあまり実用的とはいえません。
ネットに転がっている世界中の情報を見て回りましたがどれも断片的であったり機能しなかったりで、何度も試しては眠りかかりました…。
WordPress管理画面のユーザー一覧をカスタマイズ
- 使用しているテーマのfunctions.phpに追記します。
- 全部で5つのフックを使います。
その中の1つpre_get_usersはあまり利用されていないのか、情報が乏しくWordPress Codexにも載っていませんでした。
このフックはpre_get_postsのユーザー版といった感じで、WP_User_Queryでユーザーリストが生成される前に呼び出されます。 - 関数名は「fn_フック名」に統一してあります。
ユーザー一覧に表示する列をカスタマイズ
function fn_manage_users_columns($columns) {
//// 表示させたい見出し(項目)を変更する ////
// 見出しの削除
unset($columns['name'], $columns['role'], $columns['posts']);
// 見出しの追加
$columns['columns_name'] = '氏名';
$columns['columns_tel'] = '電話番号';
return $columns;
}
add_filter('manage_users_columns', 'fn_manage_users_columns');
- フィルターフックmanage_users_columnsを使います。
- 次の「ユーザー一覧に表示させる内容」とセットで使わないと見出しだけしか表示されません。
- 上記の例ではunset行で既存の列「名前・権限グループ・投稿」3つを削除しています。
- 電話番号という項目を追加していますが、Events Managerプラグインを導入しているため、プロフィールに電話番号欄が追加されており、それを表示させるためです。
素のWordPressには、電話番号という項目はありませんので、分かりやすいように該当部分に色を付けてあります。
不要であれば削除してください。 - 見出しの追加に使っている文字列「columns_name」「columns_tel」は任意の文字列です。(以降の関数で使いますので、変更する場合にはそちらも合わせてください。)
- 「氏名」「電話番号」はユーザー一覧の列見出しとして表示させたい文字列です。
デフォルトでユーザー一覧に表示される列項目
username | ユーザー名 これを削除すると編集ボタン類も表示されなくなる |
name | 名前 名+半角スペース+姓が表示 |
メールアドレス 唯一、空白が無くユニークな文字列 |
|
role | 権限グループ |
posts | 投稿 |
ユーザー一覧に内容を表示させる
function fn_manage_users_custom_column($dummy, $column, $user_id) {
//// 表示させる内容 ////
if ($column == 'columns_tel') {
// プラグイン「Events Manager」で挿入される電話番号を表示
$user_info = get_userdata($user_id);
return $user_info->dbem_phone;
}
if ($column == 'columns_name') {
// 姓と名を連結して表示
$user_info = get_userdata($user_id);
$user_name = $user_info->last_name . ' ' . $user_info->first_name;
return $user_name;
}
}
add_filter('manage_users_custom_column', 'fn_manage_users_custom_column', 10, 3);
- フィルターフックmanage_users_custom_columnを使います。
- 背景色がついている行はEvents Managerプラグインで(dbem_phoneというメタキーが)追加される電話番号の処理部分です。
不要であれば削除してください。 - 追加した列名で処理を振り分け、表示させたいユーザーのメタデータを取得しています。
get_userdataで取得できる主なメタデータ
ID | ユーザーID |
user_login | ユーザー名 |
user_pass | ハッシュ化されたパスワード |
user_nicename | ニックネーム |
user_email | メールアドレス |
user_url | URL |
user_registered | 登録日 |
display_name | 表示名 |
first_name | 名 |
last_name | 姓 |
nickname | ニックネーム |
description | プロフィール情報 |
wp_capabilities | シリアライズされたユーザー権限 |
admin_color | 管理画面の配色 |
closedpostboxes_page | 配列 |
primary_blog | マルチサイト時のプライマリーブログ |
rich_editing | ビジュアルエディターの使用 |
source_domain | マルチサイト時に使用 |
追加した列をソート可能にする
function fn_manage_users_sortable_columns($columns) {
//// 追加した列をソート可能にする ////
$columns['columns_name'] = 'columns_name';
$columns['columns_tel'] = 'columns_tel';
return $columns;
}
add_filter('manage_users_sortable_columns', 'fn_manage_users_sortable_columns');
- フィルターフックmanage_users_sortable_columnsを使います。
- 背景色がついている行はEvents Managerプラグインで追加される電話番号の処理部分です。
不要であれば削除してください。 - 「WordPressユーザー一覧のソート」と検索すると国内外問わずこのフックは情報が豊富でした。
しかしこれだけを追加しても、列見出しがクエリー付きリンクになるだけで機能しません。次の「ソートの方法を指定する」でクエリーを処理します。
ソートの方法を指定する
function fn_pre_get_users($query) {
//// ソートの方法を指定する ////
if(! is_admin()) return; // 管理画面から以外は処理をしない
if($orderby = $query->get('orderby')) {
switch($orderby) {
case 'columns_name':
$query->set('meta_key', 'last_name');
$query->set('orderby', 'meta_value');
$query->set('order', $query->get('order'));
break;
case 'columns_tel':
$query->set('meta_key', 'dbem_phone');
$query->set('orderby', 'meta_value');
$query->set('order', $query->get('order'));
break;
}
}
}
add_action('pre_get_users', 'fn_pre_get_users');
- アクションフックpre_get_usersを使います。
- 背景色がついている行はEvents Managerプラグインで(dbem_phoneというメタキーが)追加される電話番号の処理部分です。
不要であれば削除してください。 - 「ユーザーリストの並び替え」と考えるとピンと来ませんでしたが、表示順を指定して出力し直しています。
カスタマイズで追加した列名(columns_name等)は振り分け処理として使い、メタキーではありません。
また列見出しのリンク先URLに「?orderby=email」とパラメータが付きますが、キーと値がごちゃ混ぜになっているため理解に苦しみました。
-
meta_keyの値 並び替えをさせたいメタキーを指定
(例:last_name)orderbyの値 meta_valueを指定
(数値の場合にはmeta_value_num)この部分で嵌り、一見ソートされたように見えても、ユーザー名でソートされているだけという現象に悩まされました。
デフォルトでは新しい順に表示させる(おまけ)
function fn_pre_user_query($query) {
//// デフォルトでは新しい順に表示させる ////
global $pagenow;
if (is_admin() && $pagenow === 'users.php' && ! isset($_GET['orderby'])) {
$query->query_orderby = 'ORDER BY user_registered DESC';
}
}
add_action('pre_user_query', 'fn_pre_user_query');
- アクションフックpre_user_queryを使います。
- 登録の新しい順に表示させる関数です。
古い順に表示させたい場合にはDESCをASCにします。
$query->query_orderby = 'ORDER BY user_registered ASC';
WordPress管理画面のユーザー一覧をカスタマイズする方法要約
列に任意の項目を追加するには
以下のフックをペアで使う。
- manage_users_columns
- manage_users_custom_column
追加した項目をソート可能にするには
以下のフックをペアで使う。
- manage_users_sortable_columns
- pre_get_users
デフォルトの並び順を変えるには
以下のフックを使う。
- pre_user_query
WordPress管理画面のユーザー一覧をカスタマイズするコピペ用ソース
- 使用しているテーマのfunctions.phpに追記します。
- 上述したように、この例ではEvents Managerというプラグインで追加される電話番号を列に追加しているため、同プラグインを使っていない環境では電話番号の項目が空欄になります。
不要であれば背景色のついている行を削除してください。
function fn_manage_users_columns($columns) {
//// 表示させたい見出し(項目)を変更する ////
// 見出しの削除
unset($columns['name'], $columns['role'], $columns['posts']);
// 見出しの追加
$columns['columns_name'] = '氏名';
$columns['columns_tel'] = '電話番号';
return $columns;
}
function fn_manage_users_custom_column($dummy, $column, $user_id) {
//// 表示させる内容 ////
if ($column == 'columns_tel') {
// プラグイン「Events Manager」で挿入される電話番号を表示
$user_info = get_userdata($user_id);
return $user_info->dbem_phone;
}
if ($column == 'columns_name') {
// 姓と名を連結して表示
$user_info = get_userdata($user_id);
$user_name = $user_info->last_name . ' ' . $user_info->first_name;
return $user_name;
}
}
function fn_manage_users_sortable_columns($columns) {
//// 追加した列をソート可能にする ////
$columns['columns_name'] = 'columns_name';
$columns['columns_tel'] = 'columns_tel';
return $columns;
}
function fn_pre_get_users($query) {
//// ソートの方法を指定する ////
if(! is_admin()) return; // 管理画面から以外は処理をしない
if($orderby = $query->get('orderby')) {
switch($orderby) {
case 'columns_name':
$query->set('meta_key', 'last_name');
$query->set('orderby', 'meta_value');
$query->set('order', $query->get('order'));
break;
case 'columns_tel':
$query->set('meta_key', 'dbem_phone');
$query->set('orderby', 'meta_value');
$query->set('order', $query->get('order'));
break;
}
}
}
function fn_pre_user_query($query) {
//// デフォルトでは新しい順に表示させる ////
global $pagenow;
if (is_admin() && $pagenow === 'users.php' && ! isset($_GET['orderby'])) {
$query->query_orderby = 'ORDER BY user_registered DESC';
}
}
add_filter('manage_users_columns', 'fn_manage_users_columns');
add_filter('manage_users_custom_column', 'fn_manage_users_custom_column', 10, 3);
add_filter('manage_users_sortable_columns', 'fn_manage_users_sortable_columns');
add_action('pre_get_users', 'fn_pre_get_users');
add_action('pre_user_query', 'fn_pre_user_query');