カテゴリーに属する記事を一覧表示するcategory.phpを作る [WordPressテーマ作成の手順13]
各カテゴリーに属する記事を一覧表示するテンプレート「category.php」を作ります。
いわゆるアーカイブページってヤツ。そのカテゴリー用ね。
今後同じフォーマットを使用して、タグ用の一覧や、サーチ結果ページのテンプレートも作るので、今回の「category.php」を1つ作ればラク。コピーして使い回します。
手順は、WordPressのテーマ作成8で作った「home.php」をコピーして「category.php」という名前に変更。
「home.php」のループは最新記事用になっているので、普通のWordPressループ変更。
[抜粋セット]の「each_exrpt_post.pnp」はそのまんま流用できるのでラク♪
さらにプラグインでページャー(ページナビ)をつけて、わかりやすくします。
スポンサーリンク
home.phpをコピーしてcategory.phpを作る
WordPressのテーマ作成8で作った「home.php」をコピーして「category.php」という名前に変更。
このcategory.phpという名のファイルがあれば、WordPressは「カテゴリー別一覧」表示用テンプレートとして使用する。
アーカイブ用のarchive.phpでもいいんだけどさ
category.phpで表示するカテゴリー別一覧ページは、アーカイブ(archive)と呼ばれる「一覧ページ」の1つ。
WordPressのアーカイブには、
カテゴリー別、タグ別、日付別、著者別、カスタム分類別などがある。
これらを全部「archive.php」という名のテンプレートで表示することもできる。
デザインフォーマットを変えたい場合などには、
それぞれに「archive.php」より優先度の高いテンプレート名があるので、それを利用する。
- category.php(カテゴリー別アーカイブページ用)
- tag.php(タグ別アーカイブページ用)
- date.php(日付別アーカイブページ用)
- author.php(著者別アーカイブページ用)
- taxonomy.php(カスタム分類別アーカイブページ用)
本ブログでは、カテゴリー別とタグ別は、タイトル部分の色などを変えたかったので、archive.phpではなく、個別のテンプレート(category.phpとtag.php)に分けることにした。
カテゴリー一覧の表示用のテンプレートについて
WordPressはcategory.phpがあれば、コレを使ってカテゴリー一覧を表示する。これが無ければarchive.php、それも無ければindex.phpが使われる。
カテゴリーのスラッグやIDを指定したテンプレートを作れば、category.phpより優先され、特定のカテゴリーだけに特定のテンプレートを使うことができる。
「category-スラッグ.php」「category-5.php(数字がID)」といった具合で「-(ハイフン)」でスラッグやIDをつないで指定。
例えば、category-special.php というテンプレートを作っておけば、スラッグを「special」と指定したカテゴリーは、category.phpがあってもこのテンプレートで表示される。
また、IDが5なカテゴリーなら、category-5.php というテンプレートが適用される。
スラッグのほうがIDより優先度は高い。
*カテゴリーのIDとは
管理画面の各カテゴリーの編集画面のアドレスバーで、「tag_ID=」で確認できる。
例えば、「http://○○○.com/wp-admin/edit-tags.php?action=edit&taxonomy=category&tag_ID=5&post_type=post」だったら、IDは5。
テンプレートの種類と優先順位についてはこちら:
WordPress「テンプレート」の優先順位 | 超初心者のサーバー移転とドメイン移管&ついでにWordPressも!
category.phpの編集
カテゴリー名を表示する部分を作る
category.phpを作ったら、まずは「カテゴリー名」を出力するタイトル部分を足します。
本ブログではソースはこのように。
<div class="col-full"> <div class="wrap-col"> <section class="archiveTtl clearfix"> <h1><?php single_cat_title(); ?></h1> <p><img src="<?php bloginfo('template_url');?>/images/icon_cat_wht.png"/>category archives</p> </section> </div> </div>
*上記ソースの div.col-full, div.wrap-col は、本ブログのグリッドシステムによるものです。
テンプレートタグ「single_cat_title()」でカテゴリー名を表示できます。(4行目)
これは、タグ名も表示するので、tag.phpでもそのまんま使います。
参考サイト:テンプレートタグ/single cat title-WordPress Codex 日本語版
5行目には、img要素でアイコンを置き「category archives」と文言を入れてるだけ。飾りです。
タイトル部分はsection.archiveTtlで囲んで(3行目)、このクラスを使ってCSSで背景色などを指定している。
ループは普通のWordPressループにする
次に、記事の一覧部分を編集。
home.phpでは「get_posts」を使って最新記事を一覧表示しているが、
category.phpでは、投稿(single.php)や固定ページ(page.php)で使用したWordPressループを使う。これだと素直にカテゴリーごとの記事一覧を表示してくれるので。
WordPressのループは、該当する記事があれば、あるだけ表示するという繰り返し処理をする。
投稿(single.php)・固定ページ(page.php)では、該当する記事は1コなので、ループを使っても1回しか繰り返さない。
今回のcategory.phpでは、ユーザが選んだカテゴリーに該当する記事をあるだけ全部表示してくれる。
ループってオモシロイわー。
ループの基本形についてはコチラ:投稿用テンプレートsingle.phpを作る(WordPressループの使い方)[WordPressテーマ作成の手順9] | *Web Design 覚え書き*
本ブログではこのように。
<?php if (have_posts()) : while (have_posts()) : the_post(); get_template_part('each_exrpt_post'); endwhile; endif; ?>
5行目の get_template_part(‘each_exrpt_post’); は、パーツテンプレート「each_exrpt_post.php」を呼び出している。
これは home.phpの時に作った「抜粋セット」をまんま流用。
この後作る、タグ別一覧(tag.php)、サーチ結果一覧(search.php)も同じフォーマットなので、この「抜粋セット(each_exrpt_post.php)」は全部に流用。
このように1コテンプレ作ったら流用で済ませられるのもWordPressの便利なところ。
表示件数を設定する
WordPressは、1ページに表示する記事の件数を設定できる。デフォルトは10件。
これ、投稿や固定ページは1ページに1記事がデフォなので、アーカイブページのこと。
これを、サイトレイアウトに合わせて設定しなおす。(10件でイイなら変更不要)
WordPressの「管理画面>設定>表示設定」で「1ページに表示する最大投稿数」を変更。
本ブログでは[抜粋セット]を1行3個並ばせたいので、3の倍数で指定。とりあえず6にした。
ページャーを表示して一覧ページを使いやすく
ページャー(ページナビ)があると一覧ページがわかりやすい。
ここでは「Prime Strategy Page Navi」というプラグインを使用。
「ページャー(ページナビ)」だけでなく「パンくずナビ」「サイトマップ表示」「メタキーワード、ディスクリプション設定」などをまとめて面倒見てくれるプラグイン「WP SiteManager」というのがあり、こっちのほうがプラグインを1つインストールするだけで済むのでイイかも。
ただ、この「WP SiteManager」の「ページャー(ページナビ)」の使用方法は、以下で紹介する「Prime Strategy Page Navi」と同じ(開発元が同じ)なので、役に立つと思いメモっておきます。
プラグイン「Prime Strategy Page Navi」を有効化
WP管理画面>プラグイン>新規追加で「Prime Strategy Page Navi」を検索してインストール。または、wordpress.orgから直接ダウンロードしてFTPでアップロード。その後「有効化」をクリック。
ページャーを表示させる
category.phpのループ内の「endwhile;」の後に、このプラグイン固有のタグ「page_navi()」を追加して、ページャーを表示。
<?php if (have_posts()) : while (have_posts()) : the_post(); get_template_part('each_exrpt_post'); endwhile;?> <!--------------PageNavi---------------> <div class="row col-full"> <div class="wrap-col"> <?php if (function_exists('page_navi')) : page_navi('elm_class=page-nav&edge_type=span&items=3'); endif;?> </div> </div> <?php endif; ?>
*上記ソースの div.col-full, div.wrap-col は、本ブログのグリッドシステムによるものです。
12行目の「if (function_exists(‘page_navi’)) :」で、プラグインが有効な場合のみ表示。
13行目の「page_navi()」で、パラメータを使ってページャーの詳細を設定できる。
ページャーそのものは<ul>で出力される。
「page_navi()」の引数で指定するパラメータは以下のモノがあるそうです。
(赤字が今回使っているパラメータ)
- items
- 表示する前後ナビゲーションの数。現表示ページを含むため、前後の表示数を揃えたい場合は奇数にする。デフォルトは11(前に5コ、後に5コ)でけっこう多い。画面幅が小さいデバイス(スマホとか)での表示を考えると、items=3 くらいがちょうど良いかも。
- edge_type
- 1ページ目と最終ページのときに、「前後ページへのリンク(「<」と「>」)」や「最初・最終ページへのリンク(「«」と「»」)」の表示方法を指定する。
none==非表示。span==リンクなしで表示。link==リンク付きで表示。デフォルトはnone - show_adjacent
- 前後ページへのリンクを表示するかどうかのBoolean値。デフォルトはtrue(表示)
- prev_label
- 前ページリンクのリンクテキスト。デフォルトは「<(<)」
- next_label
- 次ページリンクのリンクテキスト。デフォルトは「>(>)」
- show_boundary
- 最初と最後のページへのリンクを表示するかどうかのBoolean値。デフォルトはtrue(表示)
- first_label
- 最初のページへのリンクテキスト。デフォルトは「«(«)」
- last_label
- 最後のページへのリンクテキスト。デフォルトは「»(»)」
- show_num
- 現ページナンバーと全ページ数の表示をするかどうかのBoolean値。デフォルトはfalse(非表示)
- num_position
- 現ページナンバーと全ページ数の表示位置。デフォルトはbefore(前)。後に表示したい場合はafterを指定
- num_format
- 現ページナンバーと全ページ数の表示フォーマット。デフォルトは、<span>数字/数字</span>(nn/mm)
- navi_element
- ページナビを囲む要素。divかnavを指定可能。デフォルトは空(要素なし)
- elm_class
- ページナビを囲む要素のclass属性。囲む要素がない場合は、ページナビのul要素のclass属性。デフォルトはpage_navi
- elm_id
- ページナビを囲む要素のclass属性。囲む要素がない場合は、ページナビのul要素のid属性。デフォルトは「無し」
- li_class
- ページナビの全liに付くclass属性。デフォルトは「無し」
- current_class
- 現ページのliに指定されるクラス名。デフォルトは current
- current_format
- 現ページの表示フォーマット。デフォルトは <span>数字</span>
- class_prefix
- classの接頭辞。ページナビで出力されるclass全てに追加される。デフォルトは「無し」
- indent
- タブインデント数。デフォルトは0
- echo
- ページナビの出力を行うかどうかのBoolean値。デフォルトは true(出力する)。
false や 0 を指定するとPHPの値として返す。
CSSでページャーを整える
ここでブラウザプレビューすると、ページャーのHTMLはこのように出力されている。
(3ページまで表示される数の記事をダミー記事を作ってテストした。カテゴリー名は「wordpress」)
<!--------------PageNavi---------------> <div class="row col-full"> <div class="wrap-col"> <ul class="page-nav"> <li class="first"><span>«</span></li> <li class="previous"><span><</span></li> <li class="current"><span>1</span></li> <li class="after delta-1"><a href="http://○○○.jp/category/wordpress/page/2">2</a></li> <li class="after delta-2 tail"><a href="http://○○○.jp/category/wordpress/page/3">3</a></li> <li class="next"><a href="http://○○○.jp/category/wordpress/page/2">></a></li> <li class="last"><a href="http://○○○.jp/category/wordpress/page/3">»</a></li> </ul> </div> </div>
*上記ソースの div.col-full, div.wrap-col は、本ブログのグリッドシステムによるものです。
このようにブラウザでHTMLソースを見ると「page_navi()」のパラメータの作用も理解できる。
そしてこのHTMLソースでの class属性や span, a を使って、CSSで整える。
本ブログではこのように。
ul.page-nav { text-align:center; font-weight:bold; margin:30px 0;} ul.page-nav li {display:inline;} ul.page-nav li a { border: 2px solid rgba(255,255,255,0.8); border-radius:10px;} ul.page-nav li a:hover { text-decoration:none; border: 2px solid #fff; box-shadow: 0 0 20px #fff inset;} ul.page-nav li a:active {top:1px;}/*push image*/ ul.page-nav li.current span {/*style of current button*/ border: 2px solid #89c040; background: #89c040; border-radius: 10px;} ul.page-nav li.first span, ul.page-nav li.previous span, ul.page-nav li.next span, ul.page-nav li.last span, ul.page-nav li.page_nums span {/*no link buttons*/ border: 2px solid rgba(255,255,255,0.5); color: rgba(255,255,255,0.5); border-radius: 10px;} ul.page-nav li a, ul.page-nav li.current span, ul.page-nav li.first span, ul.page-nav li.previous span, ul.page-nav li.after span, ul.page-nav li.next span, ul.page-nav li.last span, ul.page-nav li.page_nums span { padding: 0.5em 0.8em; position:relative;}
Comments
-
WordPressのカテゴリの表示をカスタマイズするための情報を探していて、たどり着きました。カテゴリに関するphpファイル名の優先度があることなど分かりやすい説明されているので大変参考になりました。
お礼のコメントをさせていただきました。
すごく内容の書き方などが、すごくわかりやすく、wordpressで躓いてた箇所がどんどん解決されました。
そして、サイトのデザインもすごく好きなデザインで参考にさせてもらってます。
ありがとうございました。