1
0

More than 1 year has passed since last update.

Wordpressでカスタム投稿の新着順にユーザー一覧を作成する

Last updated at Posted at 2021-08-29

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_multisortpostdate順にソートしてやれば、投稿日順にソートされたユーザー一覧配列の出来上がりです。
あとはこの配列を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)としてやれば、記事に登録されたアイキャッチ画像を取得することができます。

やってみたら意外と簡単にできたました。

もし同じようなことをしたい人がいたら、参考にしてくれたら嬉しいです。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0