カテゴリーに属する記事を一覧表示するcategory.phpを作る [WordPressテーマ作成の手順13]

各カテゴリーに属する記事を一覧表示するテンプレート「category.php」を作ります。
いわゆるアーカイブページってヤツ。そのカテゴリー用ね。
今後同じフォーマットを使用して、タグ用の一覧や、サーチ結果ページのテンプレートも作るので、今回の「category.php」を1つ作ればラク。コピーして使い回します。

手順は、WordPressのテーマ作成8で作った「home.php」をコピーして「category.php」という名前に変更。
「home.php」のループは最新記事用になっているので、普通のWordPressループ変更。
[抜粋セット]の「each_exrpt_post.pnp」はそのまんま流用できるのでラク♪
さらにプラグインでページャー(ページナビ)をつけて、わかりやすくします。

本日のINDEX

スポンサーリンク

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
前ページリンクのリンクテキスト。デフォルトは「&lt;(<)」
next_label
次ページリンクのリンクテキスト。デフォルトは「&gt;(>)」
show_boundary
最初と最後のページへのリンクを表示するかどうかのBoolean値。デフォルトはtrue(表示)
first_label
最初のページへのリンクテキスト。デフォルトは「&laquo;(«)」
last_label
最後のページへのリンクテキスト。デフォルトは「&raquo;(»)」
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>&laquo;</span></li>
    <li class="previous"><span>&lt;</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">&gt;</a></li>
    <li class="last"><a href="http://○○○.jp/category/wordpress/page/3">&raquo;</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;}
Share on FacebookTweet about this on TwitterShare on Google+

関連記事

WordPressの Embedカードのリンクを別ウィンドウで開く(PCのみ。スマホ・タブレットはそのまま)

WordPressの Embedカード(ブログカード)のリンクは、デフォルトでは同ウィンドウで開くようになっていますが、これを別ウィンドウ(別タブ)で開くように [記事を読む]

WordPressの Embedカードのスタイルを編集する方法2つ

前回の記事で、WordPress 4.5 の Embedカード(ブログカード)の「テンプレートの構成」や「HTML要素のクラス名」などを調べました。これを元に、 [記事を読む]

WordPress4.5で Embedカードの PHPファイルの構造がだいぶ変わったみたい

前回から WordPressの Embedカード(ブログカード)について調べたことをメモっています。 今回は Embedカードの PHPファイルの構造について [記事を読む]

Leave a Comment

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。

^