get_users
を使えば、ユーザーの一覧を取得できます。
関数リファレンス/get users
ユーザーID、登録日でソートすることはできけど、カスタム投稿の新着順にソートするできないみたい。
検索してみても、同じようなことをしてるサイトが見つからなかったけど、やってみたらできたので、それのメモ。
完成形
まずは完成形を。
<?php
$userlist = []; // 最終的に出力するユーザー一覧の配列
// ユーザーを取得
$args = [
'orderby' => 'ID',
'order' => 'ASC',
];
$users = get_users($args);
foreach ($users as $user){
$uid = $user->ID;
$usernicename = $user->user_nicename;
// ユーザーに紐付く最新記事の取得
$args = [
'orderby' => 'post_date',
'order' => 'DESC',
'post_type' => 'photos', // カスタム投稿タイプを指定。例としてphotos
'author' => $uid,
'numberposts' => 1,
];
$mypost = get_posts($args);
if (!$mypost) { // 投稿がないユーザーは除外
continue;
}
$postid = $mypost[0]->ID;
$postdate = $mypost[0]->post_date;
$userlist[] = [
'usernicename' => $usernicename,
'displayName' => $user->display_name,
'postdate' => $postdate,
];
};
// ユーザーを投稿の新着順にソート
array_multisort(array_column($userlist, 'postdate'), SORT_DESC, $userlist);
foreach ($userlist as $post) : ?>
<li>
<a href="<?= get_bloginfo("url") . '/user/' . $post['usernicename'] ?>">
<p class="name"><?= $post['displayName'] ?></p>
</a>
</li>
<?php endforeach ?>
一応解説します。
ユーザー取得
ここでユーザー一覧を取得します。
最終的に投稿日順に並び替えるので、ソート順はなんでもいいのですが、ここではIDの昇順で取得。
// ユーザーを取得
$args = [
'orderby' => 'ID',
'order' => 'ASC',
];
$users = get_users($arga);
ユーザーごとに新着記事を取得
取得したユーザー一覧をforeach
で回します。
その中でユーザーが投稿したカスタム投稿の最新記事を取得し、$mypost
に格納します。
また、記事の投稿がないユーザーは表示したくないので、if (!$mypost)
で スキップしてます。
// ユーザーに紐付く最新記事の取得
$args = [
'orderby' => 'post_date',
'order' => 'DESC',
'post_type' => 'photos', // カスタム投稿タイプを指定。例としてphotos
'author' => $uid,
'numberposts' => 1,
];
$mypost = get_posts($args);
if (!$mypost) { // 投稿がないユーザーはスキップ
continue;
}
投稿日を取得して配列に格納する
取得した最新記事からpost_date
を取り出し、$userlist
に格納する
ここまでできたらもう一息です。
$postdate = $myposts[0]->post_date;
$userlist[] = [
'usernicename' => $usernicename,
'displayName' => $user->display_name,
'postdate' => $postdate,
];
カスタム投稿の新着順でソート
array_multisort
でpostdate
順にソートしてやれば、投稿日順にソートされたユーザー一覧配列の出来上がりです。
あとはこの配列をforeach
で出力してやれば、完成です。
array_multisort(array_column($userlist, 'postdate'), SORT_DESC, $userlist);
foreach ($userlist as $post) : ?>
<li>
<a href="<?= get_bloginfo("url") . '/user/' . $post['usernicename'] ?>">
<p class="name"><?= $post['displayName'] ?></p>
</a>
</li>
<?php endforeach ?>
最後に
これで取得したユーザー一覧をカスタム投稿の新着順に並べることができました。
ちなみに、get_the_post_thumbnail_url($mypost[0]->ID)
としてやれば、記事に登録されたアイキャッチ画像を取得することができます。
やってみたら意外と簡単にできたました。
もし同じようなことをしたい人がいたら、参考にしてくれたら嬉しいです。