いいとこすぎて移住しちゃいました / LAMP壱岐
いいとこすぎて移住しちゃいました / LAMP壱岐
2018.05.18
#38
バックエンドへの道

WordPressで「ユーザー一覧」を表示するページを作成しよう!

エリカ

こんにちは、エリカです。

WordPressには、ユーザーの一覧を表示するページがテンプレートとしてまだ用意されていません。しかし、意外と必要になることがあります。例えば、こんなページですね。

ユーザー一覧を表示するWebページの例:LIGメンバーページ

 

今回は、久しぶりにWordPressの話です。

機能要件

  • ユーザーの一覧を表示したい。
  • カスタムフィールドの内容で、並び順を変更したい。
  • ユーザーが多い場合は、ページ分割したい。

ページの準備

適当に固定ページを作成します。 そして、例えば、authorsというスラッグを指定します。 こうすると、page-authors.phpという名前のテンプレートファイルがあれば、それが読み込まれるようになります。

テンプレートファイルの作成

メインループは、固定ページになっていますので、直接ユーザーのリストを取得するようにします。ユーザーのリストを取得するには、get_users($args)を使いましょう。

ユーザー抽出条件の指定

$argsには、どのようにユーザーのリストを抽出するかを指定できます。 ここでは、カスタムフィールドの内容で並び替えを行いたいと思います。

ユーザー用のカスタムフィールドに、custom_user_meta_order_numberというキー名で並び順が入力されているものとします。その場合は、以下のようになります。

 

$args = array(
    'meta_query' => array(
        'custom_user_meta_order_number' => array(
            'key' => 'custom_user_meta_order_number'
            'type' => 'NUMERIC',
        ),
    ),
    'orderby' => array(
        'custom_user_meta_order_number' => 'asc',
    ),
);

 

まず、meta_queryで結合するカスタムフィールドのキー名を指定します。並び順の値を数値として扱ってほしいので、typeNUMERICを指定しています。また添え字にも、custom_user_meta_order_numberを指定しています。こうすることにより、この条件で結合したカスタムフィールドの値をソートの基準にすることが可能になります。

 

さらに複数の条件を設定することもできます。

例えば、custom_user_meta_order_number2というキー名のカスタムフィールドも並び替えの条件に加える場合は、以下のようになります。

 

$args = array(
    'meta_query' => array(
        'custom_user_meta_order_number' => array(
            'key' => 'custom_user_meta_order_number'
            'type' => 'NUMERIC',
        ),
        'custom_user_meta_order_number2' => array(
            'key' => 'custom_user_meta_order_number2'
            'type' => 'NUMERIC',
        ),
    ),
    'orderby' => array(
        'custom_user_meta_order_number' => 'asc',
        'custom_user_meta_order_number2' => 'asc',
    ),
);

 

こうすることにより、custom_user_meta_order_numberの値が同じなら、custom_user_meta_order_number2の値により並び順が決定されるようになります。

ユーザーが抽出されない問題への対応

前述のように、カスタムフィールドを並び順の基準にしたいだけとはいえ、条件に含める場合には、ユーザーが必ずそのカスタムフィールドの値を持っていなければなりません。

例えば、カスタムフィールドを後から追加した場合は、それまでに作成されていたユーザーはそのカスタムフィールドの値をまだ持っているので条件から外れてしまうのです。

これは、条件をもう一つ追加することで回避できます。

 

$args = array(
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'custom_user_meta_order_number',
            'compare' => 'NOT EXISTS',
        ),
        array(
            'custom_user_meta_order_number' => array(
                'key' => 'custom_user_meta_order_number'
                'type' => 'NUMERIC',
            ),
            'custom_user_meta_order_number2' => array(
                'key' => 'custom_user_meta_order_number2'
                'type' => 'NUMERIC',
            ),
        ),
    ),
    'orderby' => array(
        'custom_user_meta_order_number' => 'asc',
        'custom_user_meta_order_number2' => 'asc',
    ),
);

 

これにより、指定したカスタムフィールドが存在しない場合も条件に含まれるようになります。そして、この条件で get_users($args)を実行すれば、ユーザー情報のリストを指定した順番で取得することができます。

しかし、ページ分割を行う場合は、このままでは問題があります。

ページ分割を行う場合

get_users($args)で、ユーザーのリストを取得することができました。 しかし、このままではページ分割をする場合に必要な、全体の件数(ページ数)が取得できません。

そこで、get_users()が内部で利用している WP_User_Queryを直接扱います。$argsは、ページ分割をしない場合と同じものになります。

 

$user_query = new WP_User_Query( $args );
$user_query->total_users; // 全体のユーザー数
$user_query->results; // get_users() の結果と同じもの

 

これで、全体のユーザー数がわかるので、ページ分割の条件をコントロールすることができるようになります。例えば、ユーザーを1ページにつき10件ずつ表示する場合は、条件に以下のように追加します。

 

$user_per_page = 10; // 1ページにつき表示するユーザー数
$paged = get_query_var( 'page', 1 ); // URLに指定されてくるページ数
$paged = $paged > 1 ? $paged : 1;

$args = array(
    'number' => $user_per_page,
    'paged' => $paged,
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'custom_user_meta_order_number',
            'compare' => 'NOT EXISTS',
        ),
        array(
            'custom_user_meta_order_number' => array(
                'key' => 'custom_user_meta_order_number'
                'type' => 'NUMERIC',
            ),
            'custom_user_meta_order_number2' => array(
                'key' => 'custom_user_meta_order_number2'
                'type' => 'NUMERIC',
            ),
        ),
    ),
    'orderby' => array(
        'custom_user_meta_order_number' => 'asc',
        'custom_user_meta_order_number2' => 'asc',
    ),
);

 

これで、オフセットと取得する件数を調整することができるようになりました。

あとは、現在のページ数と、全てのユーザー数(ページ数)から、前後のリンクや、ページネーションを作成していきましょう。

まとめ

いかがでしたか? 投稿を扱うのとほとんど同じで、とっても簡単です。
ぜひ参考にしてみてくださいね!