はじめに
この記事は、wordpress上の固定ページに、公開された記事がある投稿者のみを一覧表示するリンクページを
いろいろなサイトを参考に作ってみた際のメモです。
【主なステップ】
- 投稿者一覧を表示する
- 表示された投稿者一覧を投稿記事数が多い順に並び変える
- 投稿0件のユーザーを表示しないようにする
早速やってみる
1. 投稿者一覧を表示する
参考:
・プラグイン不要!固定ページで投稿者の一覧リストを表示させる
https://bge.jp/page-writer-archive/
1-1. page.pnpをコピーして、投稿者一覧ページ専用の固定ページテンプレートを作る
大元さんに従い、新しい方はpage-writer.phpとしました。
1-2. 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')
動いたコードがこちら。
<?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
<?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を指定すると、そのユーザーの投稿数を返してくれる関数を追加する
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のループ内で、ユーザーの投稿数を取得できるようにする
<?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以上を表示するように条件分岐
<?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>'; ?>
これで完成!!
苦労したけど、思ったより色々な見せ方ができそうでワクワクするな~。
次はもっと時間短縮するぞ。
参考サイトまとめ
最後に参考にしたサイトさんたちの一覧をもう一度。
ありがとうございました!
・プラグイン不要!固定ページで投稿者の一覧リストを表示させる
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/