「WordPressのユーザー一覧ページを作る」の記事の続きです。
「メンバーが多いのでページ送りをしたい」という旨のご質問コメントをいただいたので、実装してみました。お使いのWPのバージョンやテーマが違う場合は、適宜、読み替えて参考にしてください。
前提
- WP3.6のTwenty Twelveおよび、そのクローン
- テンプレート「page-authors.php」を作成し、themeディレクトリ内の「page-templates」ディレクトリにアップロード
- ユーザー一覧用に固定ページを1つ作成。テンプレートには「page-authors.php」を指定
実装後の表示は「メンバー紹介」になります。
ちなみに、「パソコン倶楽部」のユーザー管理画面には、各自の学習履歴やSNS情報が入力できるように、functions.phpに改造を施してあるので、それらの情報も表示する仕組みも実装しています。
詳しくは「WordPressのプロフィール欄を拡張してTwitterやFaceBookページへのリンクを追加しました」をお読みください。
page-authors.php
まず、全文を表示して、その後で解説します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
<?php /** * Template Name: Users Page Template * ユーザー一覧ページを固定ページで展開する為のテンプレート。 * ダッシュボードで、この固定ページのテンプレートを指定すること。 * * @clubringo.com */ get_header(); ?> <div id="primary" class="site-content"> <div id="content" role="main"> <?php while ( have_posts() ) : the_post(); ?> <?php /*------------- 固定ページの本文を出力。 --------------------*/ get_template_part( 'content', 'page' ); ?> <?php /*------------- ユーザー数の取得と設定 --------------------*/ $total_users = count_users(); $total_users = $total_users['total_users']; $paged = get_query_var('paged'); $number = 10; // 1ページに表示したいユーザー数 $args = array( 'orderby'=>'post_count', 'order'=>'DESC', 'offset' => $paged ? ( ($paged - 1) * $number) : 0, 'number' => $number,); $users = get_users( $args ); /*------------- ユーザー情報の出力 --------------------*/ echo '<ul class="users paged-'.$paged.'">'; foreach($users as $user): $uid = $user->ID; $userData = get_userdata($uid); $user_post_count = count_user_posts($uid); echo '<li class="author-info">'; echo '<div class="author-avatar">'; echo get_avatar( $uid ,100 ); echo '</div>'; echo '<div class="author-description">'; echo '<h2>'; echo '<span class="nickname">'.$user->display_name.'</span><span class="post_count">投稿数:'.$user_post_count.'</span></h2>'; echo '<p>'.$userData->user_description.'</p>'; /*------------- functions.phpをカスタマイズして、ユーザー情報に追加したカスタムフィールドを出力 --------------------*/ $cr_study = get_user_meta( $uid , 'school' , true ); $cr_job = get_user_meta( $uid , 'job' , true ); $author_SNS = array(); $author_SNS_html = ''; $twitter = get_user_meta( $uid , 'twitter' , true ); $facebook = get_user_meta( $uid , 'facebook' , true ); if ( $twitter ) : $author_SNS[] = '<a class="brandico-twitter-bird" href="https://twitter.com/' . $twitter .'" target="_blank" title="Twitter"></a>'; endif; if ( $facebook ) : $author_SNS[] = '<a class="brandico-facebook" href="https://www.facebook.com/' . $facebook .'" target="_blank" title="FaceBook"></a>'; endif; if( count($author_SNS) > 0 ): $author_SNS_html = '<p class="author_contact_by">SNS : '; foreach ($author_SNS as $sns): $author_SNS_html .= $sns; endforeach; $author_SNS_html .= '</p>'; endif; ?> <div class="add_profs"> <p class="cr_study">学習履歴: <em><?php echo $cr_study;?></em></p> <p class="cr_job">職業: <em><?php echo $cr_job;?></em></p> <?php echo $author_SNS_html ;?> </div> <?php /*------------- ここまで --------------------*/ echo '<div class="author-link">'; if( count_user_posts($uid) > 0 ): echo '<a class="userposts" href="'.get_bloginfo(url).'/?author='.$uid.'">'.$user->display_name.'の全ての投稿を見る</a>'; else : echo '<span class="userposts noposts">'.$user->display_name.'の投稿は、まだありません。</span>'; endif; echo '</div>'; echo '</div>'; echo '</li>'; endforeach; echo '</ul>'; /*------------- ページ送りを出力 --------------------*/ if($total_users > $number){ $pl_args = array( 'base' => add_query_arg('paged','%#%'), 'format' => '', 'total' => ceil($total_users / $number), 'current' => max(1, $paged), ); // for ".../page/n" if($GLOBALS['wp_rewrite']->using_permalinks()) $pl_args['base'] = user_trailingslashit(trailingslashit(get_pagenum_link(1)).'page/%#%/', 'paged'); echo paginate_links($pl_args); } /*------------- コメント欄を出力したいときは、以下のコメントアウトをとる --------------------*/ //comments_template( '', true ); ?> <?php endwhile; // end of the loop. ?> </div><!-- #content --> </div><!-- #primary --> <?php get_sidebar(); ?> <?php get_footer(); ?> |
解説
通常、固定ページには、ページ送りの機能がついていませんので、それを実装してあげる必要があります。
ユーザー数の取得と設定
1 2 3 4 5 6 7 |
/*------------- ユーザー数の取得と設定 --------------------*/ $total_users = count_users(); $total_users = $total_users['total_users']; $paged = get_query_var('paged'); $number = 10; // 1ページに表示したいユーザー数 |
count_users関数(en)でかえってきた配列の ‘total_users’ キーの値に、ユーザー数が入っているので、これを $total_users 変数に入れておき、1ページあたりの表示数 $number と組み合わせて、ページ送りに利用します。
$paged変数については後述します。
ユーザー情報の取得
1 2 3 4 5 6 |
$args = array( 'orderby'=>'post_count', 'order'=>'DESC', 'offset' => $paged ? ( ($paged - 1) * $number) : 0, 'number' => $number,); $users = get_users( $args ); |
取得したい条件を入れて、get_users関数を呼びます。
‘offset’の部分が肝心です。1ページ目に10件出力する場合、2ページ目は11件目から取得してあげる必要があります。
get_query_var関数を引数 ‘paged’ で呼ぶと、「ページング時のページ番号」が取得できます。ただし、1ページ目が0で、2ページ目は2,3ページ目が3(以降、ページ数と同じ)になります。1ページ目だけ0なので、注意が必要です。
そこで、$pagedが1以上(2ページ目以降)であれば ‘offset’ を($paged – 1) * $number とし、0 の場合(1ページ目)は 0 になるように三項分岐しています。
ユーザー情報の出力
ここは省略します。好きなように出力してください。
ページ送りの実装
ページ送りの仕組みは、こちらを参考にしました。が、そのままだと数字がズレるので、以下のように改造しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/*------------- ページ送りを出力 --------------------*/ if($total_users > $number){ $pl_args = array( 'base' => add_query_arg('paged','%#%'), 'format' => '', 'total' => ceil($total_users / $number), 'current' => max(1, $paged), ); // for ".../page/n" if($GLOBALS['wp_rewrite']->;using_permalinks()) $pl_args['base'] = user_trailingslashit(trailingslashit(get_pagenum_link(1)).'page/%#%/', 'paged'); echo paginate_links($pl_args); } |
参考リンク先では、‘total’ => floor($total_users / $number) となっていましたが、これだと、最後のページへのリンクが出ません。
なので、‘total’ => ceil($total_users / $number) としました。これで paginate_links関数 を呼べば大丈夫です。
if($GLOBALS[….の部分は、パーマリンクの設定にあわせて、リンクurlの末尾にスラッシュを付けたりしてますが、コピペで問題ありません。
それでは良いWordPressライフを!