【WordPress】固定ページに公開された記事がある投稿者のみ一覧表示してみる

# はじめに

この記事は、wordpress上の固定ページに、公開された記事がある投稿者のみを一覧表示するリンクページを
いろいろなサイトを参考に作ってみた際のメモです。

**【主なステップ】**
1. 投稿者一覧を表示する
2. 表示された投稿者一覧を投稿記事数が多い順に並び変える
3. 投稿0件のユーザーを表示しないようにする

# 早速やってみる

## 1. 投稿者一覧を表示する

>参考：
>・プラグイン不要！固定ページで投稿者の一覧リストを表示させる
>　https://bge.jp/page-writer-archive/

### 1-1. page.pnpをコピーして、投稿者一覧ページ専用の固定ページテンプレートを作る

大元さんに従い、新しい方はpage-writer.phpとしました。

### 1-2. page-writer.phpの先頭にテンプレートとして認識させるための定義を書く

```page-writer.php
<?php
/*
 * Template Name:ライター一覧
 */
?>
```

ここまで順調。

### 1-3. 投稿者一覧表示用のコードを書く
page-writer.php内の`<?php the_content(); ?>`と書かれた箇所を見つけて、一覧呼び出し用コードを上書き…したところエラー。
いろいろ調べつつ、下記2行・3か所を修正したら解決しました。
（さらっと書いたけどここに1時間くらいかかってる）

①1行目
`array('orderby'=>ID,'order'=>ASC)`
⇒`array('orderby'=>'ID','order'=>'ASC')`

②下から5行目
`get_bloginfo('url')`
⇒`get_bloginfo('url')`

動いたコードがこちら。

```page-writer.php
<?php $users =get_users( array('orderby'=>'ID','order'=>'ASC') );
	echo '<div class="writers">';
	foreach($users as $user):
	    $uid = $user->ID;
	    $userData = get_userdata($uid);
	    echo '<div class="writer-profile">';
	        echo '<figure class="eyecatch">';
	            echo get_avatar( $uid ,300 );
	        echo '</figure>';
	        echo '<div class="profiletxt">';
	            echo '<p class="name">'.$user->display_name.'</p>';
	            echo '<div class="description">'.$userData->user_description.'</div>';
	            echo '<div class="button"><a href="'.get_bloginfo('url').'/?author='.$uid.'">'.$user->display_name.'の記事一覧</a></div>';
	        echo '</div>';
	    echo '</div>';
	endforeach;
echo '</div>'; ?>
```

>参考：
>・wordpress私的マニュアル > get_users
>　https://elearn.jp/wpman/function/get_users.html

### 1-4. paget-writer.php表示用の固定ページを作成

「固定ページ」→「新規追加」から新しいページを作成。
「ページ属性」→「テンプレート」で1-2で指定したテンプレート名を指定。
今回は「ライター一覧」。

### 1-5. 固定ページを保存して完成！

この段階でCSSで表示を整えちゃいました。


## 2. 表示された投稿者一覧を投稿記事数が多い順に並び変える

>参考：
>・wordpress Codex 日本語版 > 関数リファレンス/WP Query
>　https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query

```page-writer.php
<?php $users =get_users( array('orderby'=>'post_count','order'=>'DESC') );
	echo '<div class="writers">';
	foreach($users as $user):
	    $uid = $user->ID;
	    $userData = get_userdata($uid);
	    echo '<div class="writer-profile">';
	        echo '<figure class="eyecatch">';
	            echo get_avatar( $uid ,300 );
	        echo '</figure>';
	        echo '<div class="profiletxt">';
	            echo '<p class="name">'.$user->display_name.'</p>';
	            echo '<div class="description">'.$userData->user_description.'</div>';
	            echo '<div class="button"><a href="'.get_bloginfo('url').'/?author='.$uid.'">'.$user->display_name.'の記事一覧</a></div>';
	        echo '</div>';
	    echo '</div>';
	endforeach;
echo '</div>'; ?>
```

1行目の`array('orderby'=>'ID','order'=>'ASC')`を`array('orderby'=>'post_count','order'=>'DESC')`に書き換え。
しかしこれだと記事投稿数0のユーザーも表示される。


## 3. 投稿0件のユーザーを表示しないようにする

>参考：
>・WordPressで指定ユーザーごとの投稿数を取得する
>　https://hacknote.jp/archives/6755/

### 3-1. functions.phpにユーザーIDを指定すると、そのユーザーの投稿数を返してくれる関数を追加する

```functions.php
function count_user_posttype($userid,$posttype) {
    global $wpdb;
    $where = get_posts_by_author_sql($posttype, true, $userid,true);
    $count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" );
    return $count;
}
```

### 3-2. page-writer.phpのループ内で、ユーザーの投稿数を取得できるようにする

```page-writer.php
<?php $users =get_users( array('orderby'=>'post_count','order'=>'DESC') );
	echo '<div class="writers">';
	foreach($users as $user):
	    $uid = $user->ID;
	    $userData = get_userdata($uid);
	    $uPost = count_user_posttype($uid,"post");	//ここを追加！
	    echo '<div class="writer-profile">';
	        echo '<figure class="eyecatch">';
	            echo get_avatar( $uid ,300 );
	        echo '</figure>';
	        echo '<div class="profiletxt">';
	            echo '<p class="name">'.$user->display_name.'</p>';
	            echo '<div class="description">'.$userData->user_description.'</div>';
	            echo '<div class="button"><a href="'.get_bloginfo('url').'/?author='.$uid.'">'.$user->display_name.'の記事一覧</a></div>';
	        echo '</div>';
	    echo '</div>';
	endforeach;
echo '</div>'; ?>
```

これで変数$uPostに投稿数が格納される。

### 3-3. if文で投稿数1以上を表示するように条件分岐
```page-writer.php
<?php $users =get_users( array('orderby'=>'post_count','order'=>'DESC') );
	echo '<div class="writers">';
	foreach($users as $user):
	    $uid = $user->ID;
	    $userData = get_userdata($uid);
	    $uPost = count_user_posttype($uid,"post");
	    if ($uPost > 0) :							//ここと
	        echo '<div class="writer-profile">';
	            echo '<figure class="eyecatch">';
	                echo get_avatar( $uid ,300 );
	            echo '</figure>';
	            echo '<div class="profiletxt">';
	                echo '<p class="name">'.$user->display_name.'</p>';
	                echo '<div class="description">'.$userData->user_description.'</div>';
	                echo '<div class="button"><a href="'.get_bloginfo('url').'/?author='.$uid.'">'.$user->display_name.'の記事一覧</a></div>';
	            echo '</div>';
	        echo '</div>';
	    endif;										//ここを追加！
	endforeach;
echo '</div>'; ?>
```

これで完成！！
苦労したけど、思ったより色々な見せ方ができそうでワクワクするな～。
次はもっと時間短縮するぞ。


# 参考サイトまとめ

最後に参考にしたサイトさんたちの一覧をもう一度。
ありがとうございました！:bow:

・プラグイン不要！固定ページで投稿者の一覧リストを表示させる
　https://bge.jp/page-writer-archive/
・wordpress私的マニュアル > get_users
　https://elearn.jp/wpman/function/get_users.html
・wordpress Codex 日本語版 > 関数リファレンス/WP Query
　https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query
・WordPressで指定ユーザーごとの投稿数を取得する
　https://hacknote.jp/archives/6755/