LoginSignup
3
1

More than 3 years have passed since last update.

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

Posted at

はじめに

この記事は、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/

3
1
0

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
3
1