投稿者の一覧表示

2024.06.13

WordPressに登録したユーザー情報を取得して一覧で表示をします。
案件で実装が必要なことはあまりなかったですが、それゆえに…たまに実装するとハマります。
なので念の為、メモ。

このWP画面で登録したユーザーを表示します。

ユーザー情報の一覧を取得

まずはユーザー情報を取得する必要があります。
get_users()でユーザ情報のデータをごっそり取得してそれぞれユーザーごとの情報を表示します。下記はよく使いそうな取得コードです。

個別のユーザーページへのリンクもあります。

<?php
// ユーザー情報を取得
$users = get_users();
?>
<ul class="lt">
<?php foreach ( $users as $user ) : ?>
    <?php
    // ユーザー情報を取得
    $user_name = $user->user_login;
    $user_email = $user->user_email;
    $display_name = $user->display_name;
    $user_id = $user->ID;
    // ユーザーページへのURLを取得
    $user_url = get_author_posts_url( $user_id );
    // ユーザーログイン名を取得
    $username = $user->user_login;
    ?>
    <li>
        ユーザーID: <?php echo esc_html( $user_id ); ?><br>
        ユーザー名: <?php echo esc_html( $user_name ); ?><br>
        ログイン名: <?php echo esc_html( $username ); ?><br>
        メールアドレス: <?php echo esc_html( $user_email ); ?><br>
        表示名: <?php echo esc_html( $display_name ); ?><br>
        ユーザーページ: <a href="<?php echo esc_url( $user_url ); ?>">プロフィールページ</a>
    </li>
<?php endforeach; ?>
</ul>

個別のユーザーのリンクは下記のようなURLになります。authorの後にユーザーのログイン名となります。
このURLに対応するWordPressのテンプレートファイルは「author.php」になります

https://ドメイン名/author/ユーザーのログインの名前/

またACF(アドバンスカスタムフィールド)を使ってユーザー管理画面で登録した情報も表示ができます。
ただし、通常のACFの表示方法とは異なっています。第2引数に下記のようなユーザーIDを指定する必要です。

<?php echo the_field('userInfo_knaji', 'user_' . $userID);?>

記事投稿数の多い順にユーザーを表示する

これも滅多に使うことはない…と思います。
検索しても近いコードがなかったため、ChatGPTに聞いたりして何とか作りました。
記事数が多かったりユーザーが多いと処理が重くなる可能性があります。

ロジックとしては単純なものになります。
①ユーザーごとの全ての記事数を取得。
②取得記事数が多い順(降順)でユーザーを並び替えます。
③後はこの順番でユーザー一覧を表示する。
以上です。

コードの全体はこちらになります。
ユーザー情報を表示する部分の「the_field」や「get_field」はカスタムフィールドでの表示なので必要のないものです。ふりがなや自己紹介テキストなどは使う可能性もあるかと思い、ついでに載せています。


<?php

 //ステップ1: ユーザーごとのカスタム投稿タイプの投稿数を取得
  function get_user_post_count_by_custom_types($user_id, $post_types) {
   $total_count = 0;
   foreach ($post_types as $post_type) {
     $args = array(
       'author'        => $user_id,
       'post_type'     => $post_type,
       'post_status'   => 'publish',
       'posts_per_page'=> -1  // すべての投稿を取得
     );
     $query = new WP_Query($args);
     $total_count += $query->found_posts;
   }
   return $total_count;
  }

  //ステップ2: ユーザーを取得し、カスタム投稿タイプの投稿数に基づいて配列をソート
  $users = get_users();
  $post_types = ['blog', 'news']; 
  foreach ($users as $user) {
   //post_countというカスタムプロパテーを追加し、ここに記事数を各ユーザーの記事数を格納
   $user->post_count = get_user_post_count_by_custom_types($user->ID, $post_types);//ユーザーごとの投稿数を取得
  }
  //降順にソート。
  usort($users, function ($a, $b) {
   return $b->post_count - $a->post_count;
  });

 ?>
<!-- ステップ3: ユーザーを表示 -->
<?php foreach ( $users as $user ): ?>
 <div class="person">
  <ul class="lt">
   <?php $userID = $user->ID; ?>
   <li>投稿者の名前(デフォルト機能):<?php echo $user->display_name; ?></li>
   <li>ユーザーID:<?php echo $userID;?></li>
   <li>書いた記事数:<?php echo esc_html($user->post_count); ?></li>
   <li><a href="<?php echo home_url(); ?>/author/<?php echo $user->display_name; ?>"><?php echo $user->display_name; ?>の記事一覧</a></li>
   <li>ACFで入力名前:<?php echo the_field('userInfo_knaji', 'user_' . $userID);?></li>
   <li>ACFで入力ひらがな:<?php echo the_field('userInfo_hiragana', 'user_' . $userID);?></li>
   <li>ACFで自己紹介:<?php  the_field('userInfo_introduce', 'user_' . $userID); ?></li>
   <li>
    <div class="image">
     <?php //echo get_avatar( get_the_author_id() ); ?>
     <?php if(get_field('userinfo_image', 'user_' . $userID )): ?>
      <img src="<?php $image = get_field('userinfo_image', 'user_' . $userID); echo $image['url'];?>" alt="ACFで登録したユーザー画像">
     <?php endif; ?>
    </div>
   </li>
   <li><?php  the_field('userInfo_link1', 'user_' . $userID); ?></li>
  </ul>
 </div>
<?php endforeach; ?>

それでは個別に解説します。

ユーザーごとの全ての記事数を取得

下記部分でユーザーごとの記事数を取得する関数を作っています。
処理としてはpostタイプごとに記事数を取得し、繰り返し足していくことで合計数を出します。

  function get_user_post_count_by_custom_types($user_id, $post_types) {
   $total_count = 0;
   foreach ($post_types as $post_type) {
     $args = array(
       'author'        => $user_id,
       'post_type'     => $post_type,
       'post_status'   => 'publish',
       'posts_per_page'=> -1  // すべての投稿を取得
     );
     $query = new WP_Query($args);
     $total_count += $query->found_posts;
   }
   return $total_count;
  }

取得記事数が多い順(降順)でユーザーを並び替え

次にこの関数を使ってユーザーの並び替えを記事数を基準に降順で並び替えます。
これで記事数が多いものが最初になります。
取得したい投稿タイプを指定にしてるのは取得する投稿タイプをカスタマイズできるようにするためです。


  $users = get_users();//ユーザー情報の取得
  $post_types = ['blog', 'news']; //取得したい投稿タイプを指定。

  foreach ($users as $user) {
   //post_countというカスタムプロパテーを追加し、ここに記事数を各ユーザーの記事数を格納
   $user->post_count = get_user_post_count_by_custom_types($user->ID, $post_types);//ユーザーごとの投稿数を取得
  }
  //降順にソート。
  usort($users, function ($a, $b) {
   return $b->post_count - $a->post_count;
  });

ここまで並び替えが完了しました!

ユーザー一覧を表示

後は並び替えしたデータ(users変数)を一つずつ表示するだけです。

<?php foreach ( $users as $user ): ?>
 <div class="person">
  <ul class="lt">
   <?php $userID = $user->ID; ?>
   //略
  </ul>
 </div>
<?php endforeach; ?>

記事投稿日が最新のユーザーから順番に表示する

こちらも実装のコードは上記のものと似た内容で作りました。

ロジックはこちら。
①ユーザーごとに全ての記事をチェックし、最新の投稿日付を取得
②投稿日の新しいユーザー順に並び替え
③並び替えした順番でユーザーを表示
以上になります。

コードの全体図はこちらです。
先ほどと同じようにカスタムフィールドの表示記述がありますので必要な場合は利用していただければと思います。

<?php
 // ステップ1: ユーザーごとの最新投稿日を取得
 function get_user_last_post_date($user_id, $post_types) {
  $latest_date = '0000-00-00 00:00:00';
  foreach ($post_types as $post_type) {
   $args = array(
    'author'        => $user_id,
    'post_type'     => $post_type,
    'post_status'   => 'publish',
    'posts_per_page'=> 1,  // 最新の1件のみ取得
    'orderby'       => 'date',
    'order'         => 'DESC'
   );
   $query = new WP_Query($args);
   if($query->have_posts()) {
    $query->the_post();
    $date = get_the_date('Y-m-d H:i:s');
    if ($date > $latest_date) {
     $latest_date = $date;
    }
   }
  }
  wp_reset_postdata();
  return $latest_date;
 }

 // ステップ2: ユーザーを取得し、最新の投稿日に基づいて配列をソート
 $users = get_users();
 $post_types = ['blog', 'news'];

 foreach ($users as $user) {
  //last_post_dateというカスタムプロパテーを追加し、ここに投稿日を格納
  $user->last_post_date = get_user_last_post_date($user->ID, $post_types);
 }

 usort($users, function ($a, $b) {
  return strcmp($b->last_post_date, $a->last_post_date);
 });

 ?>
 <!-- ステップ3: ユーザーを表示 -->
 <?php foreach ( $users as $user ): ?>
 <?php if ($user->last_post_date != '0000-00-00 00:00:00'): ?> <!-- 投稿がある場合のみ表示 -->
  <div class="person">
  <ul class="lt">
   <?php $userID = $user->ID; ?>
   <li>投稿者の名前(デフォルト機能):<?php echo $user->display_name; ?></li>
   <li>ユーザーID:<?php echo $userID;?></li>
   <li><a href="<?php echo home_url(); ?>/author/<?php echo $user->display_name; ?>"><?php echo $user->display_name; ?>の記事一覧</a></li>
   <li>記事の最新投稿日:<?php echo esc_html($user->last_post_date); ?></li> <!-- 最新の投稿日を表示 -->
   <li>ACFで入力名前:<?php echo the_field('userInfo_knaji', 'user_' . $userID);?></li>
   <li>ACFで入力ひらがな:<?php echo the_field('userInfo_hiragana', 'user_' . $userID);?></li>
   <li>ACFで自己紹介:<?php  the_field('userInfo_introduce', 'user_' . $userID); ?></li>
   <li>
   <div class="image">
    <?php if(get_field('userinfo_image', 'user_' . $userID )): ?>
    <img src="<?php $image = get_field('userinfo_image', 'user_' . $userID); echo $image['url'];?>" alt="ユーザー画像">
    <?php endif; ?>
   </div>
   </li>
   <li><?php  the_field('userInfo_link1', 'user_' . $userID); ?></li>
  </ul>
  </div>
 <?php endif; ?>
 <?php endforeach; ?>

それでは個別に内容を書いていきます。

ユーザーごとに全ての記事をチェックし、最新の投稿日付を取得

まず、最新の投稿日付を取得する関数を作ります。
この関数の処理内容は各投稿タイプの最新記事を取得し$latest_dateに格納。これを繰り返し行い最新の投稿日を取得します。

$latest_date変数は一番新しい投稿日を格納する変数です。初期値が’0000-00-00 00:00:00’と指定している理由は、「ユーザー登録はしているけど記事を投稿していない」場合の対策です。初期値のままのユーザーは表示がされません。

 function get_user_last_post_date($user_id, $post_types) {
  $latest_date = '0000-00-00 00:00:00';
  foreach ($post_types as $post_type) {
   $args = array(
    'author'        => $user_id,
    'post_type'     => $post_type,
    'post_status'   => 'publish',
    'posts_per_page'=> 1,  // 最新の1件のみ取得
    'orderby'       => 'date',
    'order'         => 'DESC'
   );
   $query = new WP_Query($args);
   if($query->have_posts()) {
    $query->the_post();
    $date = get_the_date('Y-m-d H:i:s');
    if ($date > $latest_date) {
     $latest_date = $date;
    }
   }
  }
  wp_reset_postdata();
  return $latest_date;
 }

投稿日の新しいユーザー順に並び替え

次にこの関数を使って並び替えをします。strcmpを使ってuserを日付の最新のもの順に並び替えます。

 // ステップ2: ユーザーを取得し、最新の投稿日に基づいて配列をソート
 $users = get_users();
 $post_types = ['blog', 'news'];

 foreach ($users as $user) {
  //last_post_dateというカスタムプロパテーを追加し、ここに投稿日を格納
  $user->last_post_date = get_user_last_post_date($user->ID, $post_types);
 }

 usort($users, function ($a, $b) {
  return strcmp($b->last_post_date, $a->last_post_date);
 });

並び替えした順番でユーザーを表示

後はforeachで表示をするだけですね。
前述したように「$last_post_date」の値が「0000-00-00 00:00:00」初期値のユーザーは表示しません。

 <?php foreach ( $users as $user ): ?>
 <?php if ($user->last_post_date != '0000-00-00 00:00:00'): ?> <!-- 投稿がある場合のみ表示 -->
  <div class="person">
  <ul class="lt">
   <?php $userID = $user->ID; ?>
   //略
  </ul>
  </div>
 <?php endif; ?>
 <?php endforeach; ?>

以上になります。

totop Page Top