【WordPress】ユーザー属性を取得する方法|esc_html()での安全な出力

WordPressでユーザー属性を取得することは、カスタマイズやユーザー管理において非常に有用です。この記事では、ユーザー属性を取得する基本的な方法と、安全に出力するための注意点を紹介します。

この記事でわかること

  • get_userdata()/wp_get_current_user()でのユーザー情報取得
  • get_user_meta()でのカスタムフィールド取得
  • 管理画面での表示で特に注意すべきXSSリスク
スポンサーリンク

get_userdata()関数を使用する

get_userdata()関数を使用すると、指定したユーザーIDに関連するすべての情報を取得することができます。この関数はユーザーオブジェクトを返し、その中にユーザー属性が含まれています。

指定したユーザーの情報を取得して表示
$user_id = 1; // 取得したいユーザーのID
$user_info = get_userdata( $user_id );

echo 'ユーザー名: ' . esc_html( $user_info->user_login ) . '<br>';
echo 'メールアドレス: ' . esc_html( $user_info->user_email ) . '<br>';
echo '表示名: ' . esc_html( $user_info->display_name );
display_nameはユーザー自身が編集できる値
display_nameはユーザーがプロフィール画面から自由に変更できる項目です。必ずesc_html()で出力してください。エスケープを忘れると、悪意のあるユーザーが表示名に<script>タグ等を仕込んだ場合にXSSの原因になります。

wp_get_current_user()関数を使用する

現在ログインしているユーザーの属性を取得したい場合は、wp_get_current_user()関数を使用します。この関数は、現在のユーザーに関する情報を含むWP_Userオブジェクトを返します。

現在ログイン中のユーザー情報を取得して表示
$current_user = wp_get_current_user();

echo '現在のユーザー名: ' . esc_html( $current_user->user_login ) . '<br>';
echo 'メールアドレス: ' . esc_html( $current_user->user_email ) . '<br>';
echo '表示名: ' . esc_html( $current_user->display_name );

ユーザーのカスタムフィールドを取得する

ユーザーに対して追加のカスタムフィールドを持たせている場合、get_user_meta()関数を使用してその値を取得することができます。

ユーザーのカスタムフィールドを取得して表示
$user_id = 1; // 取得したいユーザーのID
$custom_field_value = get_user_meta( $user_id, 'custom_field_key', true );

echo 'カスタムフィールドの値: ' . esc_html( $custom_field_value );

管理画面でのユーザー属性の表示

WordPressの管理画面でユーザー属性を表示させる方法もあります。例えば、ユーザーリストにカスタムカラムを追加して特定の属性を表示することができます。

functions.php:ユーザー一覧にカスタムカラムを追加
add_filter( 'manage_users_columns', 'custom_user_columns' );
function custom_user_columns( $columns ) {
    $columns['custom_column'] = 'カスタム項目';
    return $columns;
}

add_action( 'manage_users_custom_column', 'custom_user_columns_data', 10, 3 );
function custom_user_columns_data( $value, $column_name, $user_id ) {
    if ( 'custom_column' === $column_name ) {
        return esc_html( get_user_meta( $user_id, 'custom_field_key', true ) );
    }
    return $value;
}
管理画面での未エスケープ出力はより深刻なリスクになる
このcustom_user_columns_data()の戻り値は、管理画面のユーザー一覧テーブルに直接出力されます。カスタムフィールドの値は、権限次第でユーザー自身が編集できてしまうことがあります。もしesc_html()を付けずに出力すると、低権限のユーザーがこのフィールドに<script>タグを仕込んでおくだけで、管理者がユーザー一覧を開いた瞬間に管理者のブラウザでスクリプトが実行されてしまいます。これは低権限ユーザーから管理者権限への昇格につながりかねない、格納型XSSの典型例です。フロントエンドでの未エスケープ出力よりも、管理画面という高権限コンテキストでの出力の方が実害が大きいため、特に注意してください。

よくある質問(FAQ)

QWordPressの全ユーザーリストを取得するコードは?
Aget_users()で全ユーザーの配列を取得できます。各ユーザーはWP_Userオブジェクトで、ID、user_login、user_email、display_nameなどのプロパティがあります。
Q特定のロールのユーザーのみを取得するには?
Aget_users(array(‘role’ => ‘author’))でauthorロールのユーザーのみを取得できます。複数ロールはrole__inに配列で指定します。
Qユーザー情報からアバター画像を表示するには?
Aget_avatar($user->ID, 96)でユーザーのアバター画像タグを取得できます。第2引数はサイズ(ピクセル)です。この関数はWordPressコア側で既に安全なHTMLを返すため、追加のエスケープは不要です。Gravatarに登録していないユーザーにはデフォルト画像が表示されます。

まとめ

  • 基本:get_userdata()/wp_get_current_user()/get_user_meta()で取得
  • 必須:出力は必ずesc_html()でエスケープする
  • 特に注意:管理画面への出力は、ユーザー編集可能な値のXSSリスクがフロントエンドより深刻になり得る

ユーザーの情報を自由に操作・カスタマイズできる一方で、出力箇所のエスケープは必ず徹底してください。