2026年10月1日
2026年10月1日
WordPressのユーザー一覧ページにカスタムカラムを追加する手順|表示・並べ替え・幅の調整
管理画面の「ユーザー」一覧に独自の列を足すには、manage_users_columns フィルターで列を登録し、manage_users_custom_column フィルターで各セルの中身を返します。並べ替えに対応させるなら manage_users_sortable_columns と pre_get_users を組み合わせます。この記事では、登録日・電話番号・最終ログイン日時の列を例に、追加から並べ替え、表示の調整、つまずきやすい点までを説明します。
使うフックと役割
| フック | 種類 | 役割 |
|---|---|---|
manage_users_columns |
フィルター | 列の一覧(キーと見出し)を変更する |
manage_users_custom_column |
フィルター | 独自列のセルに表示する HTML を返す |
manage_users_sortable_columns |
フィルター | 見出しをクリックして並べ替えられる列を登録する |
pre_get_users |
アクション | 一覧のユーザー取得クエリを並べ替え用に調整する |
投稿一覧の manage_posts_custom_column はアクション(echo で出力)ですが、ユーザー一覧の manage_users_custom_column はフィルターで、文字列を return します。投稿一覧のコードを流用して echo すると、表の外や先頭に値がずれて表示されるので注意してください。
コードは子テーマか mu-plugin(wp-content/mu-plugins/ に置く PHP ファイル)に書きます。作業前にバックアップを取り、ステージング環境で確認してから本番に反映してください。
手順1:列を登録する
列は連想配列で渡されます。キーが内部名、値が見出しです。単に末尾に足すこともできますが、ここでは「メール」列の直後に差し込みます。
add_filter( 'manage_users_columns', function ( $columns ) {
$new = array();
foreach ( $columns as $key => $label ) {
$new[ $key ] = $label;
if ( 'email' === $key ) {
$new['ucc_registered'] = '登録日';
$new['ucc_phone'] = '電話番号';
$new['ucc_last_login'] = '最終ログイン';
}
}
return $new;
} );
既定の列のキーは username、name、email、role、posts などです。不要な列を消したいときは unset( $columns['posts'] ); のように取り除けます。独自列のキーには ucc_ のような接頭辞を付け、ほかのプラグインの列と重ならないようにします。
手順2:セルの中身を返す
add_filter( 'manage_users_custom_column', function ( $output, $column_name, $user_id ) {
switch ( $column_name ) {
case 'ucc_registered':
$user = get_userdata( $user_id );
return $user ? esc_html( wp_date( 'Y-m-d', strtotime( $user->user_registered ) ) ) : '';
case 'ucc_phone':
$phone = get_user_meta( $user_id, 'phone', true );
return $phone ? esc_html( $phone ) : '—';
case 'ucc_last_login':
$ts = (int) get_user_meta( $user_id, 'ucc_last_login', true );
return $ts ? esc_html( wp_date( 'Y-m-d H:i', $ts ) ) : '記録なし';
}
return $output; // ほかのプラグインの列はそのまま返す
}, 10, 3 );
ポイントは3つです。
- **自分の列以外は
$outputをそのまま返す**。空文字を返すと、ほかのプラグインが足した列が空になります - 出力は毎回エスケープする。ユーザーメタはユーザー自身が入力した値のことがあり、エスケープを忘れると管理画面でのクロスサイトスクリプティングにつながります
- **
user_registeredは UTC で保存されている**。strtotime()で UNIX 時刻にしてからwp_date()を通すと、サイトのタイムゾーン設定に合わせた表示になります
電話番号のメタキー phone は例です。実際にはプロフィール画面の独自項目やプラグインが保存しているキー名に合わせてください。キー名が分からないときは、WP-CLI の wp user meta list <ユーザーID> で確認できます。
手順3:最終ログイン日時を記録する
最終ログイン日時は WordPress の標準では保存されないため、ログイン時に記録します。
add_action( 'wp_login', function ( $user_login, $user ) {
update_user_meta( $user->ID, 'ucc_last_login', time() );
}, 10, 2 );
記録はこのコードを入れた後のログインからです。既存ユーザーは「記録なし」と表示されるので、運用の説明に一言添えておくと混乱が減ります。ログイン日時は利用状況を表す個人データでもあるため、目的と保存期間をプライバシーポリシーに書いておくのが望ましいです。
手順4:並べ替えに対応させる
見出しをクリックして並べ替えるには、まず並べ替え可能な列として登録します。配列の値は、URL の orderby パラメーターに入る文字列です。
add_filter( 'manage_users_sortable_columns', function ( $columns ) {
$columns['ucc_registered'] = 'registered'; // コアが扱える並べ替えキー
$columns['ucc_last_login'] = 'ucc_last_login'; // 独自キー(次のコードで処理)
return $columns;
} );
登録日は WP_User_Query が標準で registered による並べ替えに対応しているので、これだけで動きます。最終ログインはユーザーメタなので、取得クエリを調整します。
add_action( 'pre_get_users', function ( WP_User_Query $query ) {
if ( ! is_admin() || 'ucc_last_login' !== $query->get( 'orderby' ) ) {
return;
}
$screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
if ( ! $screen || 'users' !== $screen->id ) {
return;
}
// 記録の無いユーザーも一覧から消えないよう、NOT EXISTS と OR でつなぐ
$query->set( 'meta_query', array(
'relation' => 'OR',
'ucc_last_login_clause' => array(
'key' => 'ucc_last_login',
'type' => 'NUMERIC',
),
array(
'key' => 'ucc_last_login',
'compare' => 'NOT EXISTS',
),
) );
$query->set( 'orderby', 'ucc_last_login_clause' );
} );
単純に meta_key と orderby => meta_value_num を指定する書き方もよく見かけますが、その場合はメタが存在しないユーザーが一覧から消えます。並べ替えた途端にユーザー数が減ったように見えたら、この現象を疑ってください。上の例のように名前付きの条件を作り、その名前で並べ替えると、記録の無いユーザーも残せます。
pre_get_users はフロント側や REST API など、ほかの場面のユーザー取得でも実行されます。is_admin() と画面 ID で対象を絞っておくと、意図しないクエリの書き換えを防げます。
手順5:列の幅を整える
列が増えると表が窮屈になります。ユーザー一覧の画面だけに CSS を足します。
add_action( 'admin_enqueue_scripts', function ( $hook_suffix ) {
if ( 'users.php' !== $hook_suffix ) {
return;
}
wp_register_style( 'ucc-users-columns', false );
wp_enqueue_style( 'ucc-users-columns' );
wp_add_inline_style( 'ucc-users-columns',
'.fixed .column-ucc_registered, .fixed .column-ucc_last_login { width: 9em; }
.fixed .column-ucc_phone { width: 10em; }'
);
} );
各セルには column-{列のキー} というクラスが付くので、それを使って幅を指定します。表示する列は、画面右上の「表示オプション」から利用者ごとに切り替えられます。
つまずきやすい点
- 値が表の外や一番上に出る:
manage_users_custom_columnでechoしている。returnに直す - ほかのプラグインの列が空になった:自分の列以外で
$outputを返していない - 並べ替えるとユーザーが減る:メタの無いユーザーが除外されている。上の
NOT EXISTSの形にする - ユーザー数が多いと一覧が重い:セルごとに重いクエリを発行していないか見直す。投稿タイプ別の投稿数のように集計が必要な値は、
count_many_users_posts()でまとめて取るか、ログイン時や保存時に計算してメタに保存しておく - マルチサイトのネットワーク管理画面に出ない:ネットワークのユーザー一覧は列の登録に
wpmu_users_columnsフィルターを使う
画面の表記や既定の列の構成は WordPress のバージョンで変わることがあります。この記事は執筆時点の構成で説明しています(2026年10月現在)。
まとめ
- 列の登録は
manage_users_columns、セルの中身はmanage_users_custom_column(フィルターなのでreturn)で行う - 自分の列以外は
$outputを返し、出力は毎回エスケープする - 登録日は
registeredで並べ替えられ、ユーザーメタはpre_get_usersでクエリを調整する - メタでの並べ替えは、記録の無いユーザーが消えないよう
NOT EXISTSを含めた条件にする - 幅の調整は
users.phpの画面だけに CSS を読み込み、コードは子テーマか mu-plugin に置く