IT実践

WordPress管理画面のユーザー一覧をソート可能な任意の項目にする

  • このエントリーをはてなブックマークに追加
  • LINEで送る

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 名前
名+半角スペース+姓が表示
email メールアドレス
唯一、空白が無くユニークな文字列
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を使います。
  • 登録の新しい順に表示させる関数です。
    古い順に表示させたい場合にはDESCASCにします。
$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');

どうかこの記事へリンクを張ってください。

当コンテンツは、必要な情報がすぐに見つかるように広告をなるべく載せない方針でやっております。

僅かな広告でサイトを運営していくために、少しでも多くのアクセス数を必要としています。
当サイトの記事がもしお役に立ちましたら、記事の紹介やリンクをぜひお願いします。

※特にアフィリエイト広告は提灯記事になってしまいがちで、情報としての信憑性を欠くために掲載しません。

Webサイトをご紹介ください

関連記事

コメントを残す

*