今回は、アーカイブ一覧ページである archive.php を作成します。
archive.php は、様々な種類の一覧ページを表示してくれます。
カスタムタクソノミー別、カテゴリ別、タグ別、作成者別、
日付別(年別、月別、日別)、カスタム投稿タイプ別と、
それぞれに極端なレイアウトの差を付けなければ、
archive.php で全て事足ります。
前回までの記事で、index.php、header.php、footer.php、
sidebar.php (sidebar-left.php / sidebar-right.php) を作成しました。
⇒ まだご覧になって頂けていない方は
カテゴリページ 「テンプレート作成のススメ」 からどうぞ。
これらを 流用 / 活用 して archive.php を作成していきます。
index.php には投稿記事の一覧を表示するようにしていますので、
これを流用して違う部分だけを修正していけばよさそうですね。
単純な記事一覧を表示している index.php と
様々な区分けで記事一覧を表示する archive.php とで
実装を変更しなくてはいけない箇所を少し整理してみます。
ブログの全ての リクエスト(ページアクセス) の間口 となる index.php では、
当初、HTML タイトルを固定で 「ブログ名」 にしていました。
archive.php では、カスタムタクソノミー別、カテゴリ別、タグ別、
作成者別、日付別(年別、月別、日別)、カスタム投稿タイプ別と
様々な一覧ページを表示することになりますので、
ページ種別ごとに HTML タイトルは変えたいですね。
これは、前々回の記事 「HTMLタイトルを切り替える」 で仕込み済みです v(。・・。)
HTML タイトルと同様、index.php では、メインコンテンツ内に表示している
タイトルは固定で 「ブログ名」 にしています。
archive.php では、カスタムタクソノミー別であればタクソノミー名、
カテゴリ別であればカテゴリ名、タグ別であればタグ名といったように、
ページ種別ごとにその内容をタイトルとして表示したいですね。
index.php の場合、ブログの間口となるだけですし、実際のところは
ちゃんと優先度の高いテンプレートを作ったあかつきには、
それらのテンプレートに処理を割り振るだけになってしまいますので、
実はページネーションは全く考えてません (汗)
カテゴリや日付別等の一覧ページの場合、記事が多くなってくると、
ちゃんとページ遷移できるよう、ページネーションを実装した方がいいですね。
こちらは、前回の記事 「一覧ページネーション を表示する」 で
ページ番号によるページネーションを表示する関数は準備済みです v(。・・。)
相違箇所はこの3つです。
既に、HTML タイトルの切り替えは header.php に既に仕込み済みですので、
今回の具体的な作業は、index.php を流用して archive.php を起こし、
ページ種別ごとにメインコンテンツ内のタイトル表示を変更するようにし、
ページネーションを表示する部分を組み込むといった作業になります。
index.php をコピーして archive.php にリネームし、これをベースとします。
<?php get_header(); ?> <!-- 一覧表示部分ここから --> <h2 class="archive-title"><?php bloginfo('name'); ?></h2> <?php if (have_posts()) : while (have_posts()) : the_post(); ?> <div class="entry hentry"> <h3 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3> <div class="entry-box"> <span class="entry-date"> 公開:<time class="published" datetime="<?php the_time('c'); ?>"><?php the_time(get_option('date_format')); ?></time> </span> <br /><?php the_category(', '); ?><?php the_tags('', ', '); ?> </div> <p class="entry-excerpt"><?php echo mb_substr(get_the_excerpt(), 0, 40); ?>...</p> <p class="entry-more"><a href="<?php the_permalink() ?>">続きを見る</a></p> </div> <?php endwhile; else : ?> <p>記事がありません</p> <?php endif; ?> <!-- 一覧表示部分ここまで --> <?php get_footer(); ?>
ハイライト表示している部分が変更対象となります。
<?php get_header(); ?> <!-- 一覧表示部分ここから --> <h2 class="archive-title"> <?php if (is_category()) { single_cat_title(); } elseif (is_tag()) { single_tag_title(); } elseif (is_tax()) { single_term_title(); } elseif (is_day()) { echo "日別アーカイブ:" . get_the_time('Y年m月d日'); } elseif (is_month()) { echo "月別アーカイブ:" . get_the_time('Y年m月'); } elseif (is_year()) { echo "年別アーカイブ:" . get_the_time('Y年'); } elseif (is_author()) { echo "投稿者アーカイブ:" . esc_html(get_queried_object()->display_name); } else { echo "ブログアーカイブ"; } ?> </h2> <?php if (have_posts()) : while (have_posts()) : the_post(); ?> <div class="entry hentry"> <h3 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3> <div class="entry-box"> <span class="entry-date"> 公開:<time class="published" datetime="<?php the_time('c'); ?>"><?php the_time(get_option('date_format')); ?></time> </span> <br /><?php the_category(', '); ?><?php the_tags('', ', '); ?> </div> <p class="entry-excerpt"><?php echo mb_substr(get_the_excerpt(), 0, 40); ?>...</p> <p class="entry-more"><a href="<?php the_permalink() ?>">続きを見る</a></p> </div> <?php endwhile; else : ?> <p>記事がありません</p> <?php endif; ?> <?php if (have_posts() && function_exists("pagination")) { // 一覧ページネーション pagination($wp_query->max_num_pages); } ?> <!-- 一覧表示部分ここまで --> <?php get_footer(); ?>
5行目から23行目までが、メインコンテンツ内のタイトルを
ページ種別ごとに設定する処理になります。
is_category はカテゴリ別ページ、is_tag はタグ別ページ、
is_tax はカスタムタクソノミー別ページ、is_day は日付別(日別)ページ、
is_month は日付別(月別)ページ、is_year は日付別(年別)ページ、
is_author は作成者別ページの場合に true となります。
これらを判定材料にページ種別を判断し、それぞれの種別に応じた
タイトルを出力します。
single_cat_title は現在ページのカテゴリ名を、
single_tag_title は現在ページのタグ名を、
single_term_title は現在ページのタクソノミー名を
出力 (パラメータの指定によっては取得) してくれる関数です。
それぞれパラメータ指定構造は同じで、第一パラメータに文字列を
指定すると、名称の前にパラメータで指定した文字列を連結します。
第二パラメータに false を指定すると、名称を出力するのではなく
取得して返却してくれます。 ※デフォルト : true
get_the_time は、投稿日時を取得する関数で、
第一パラメータで指定したフォーマットで整形してくれますので、
日別、月別、年別とそれぞれでフォーマットを変えているわけです。
ここでは日本語フォーマット固定で整形していますが、WordPress 管理画面の
[設定 - 一般] で設定する「日付のフォーマット」の設定を取得 / 加工して、
これに準拠したフォーマットを組み立てて、それを利用する方が
きれい (あるべき姿) でしょうね。
get_queried_object は、表示対象となるページ種別ごとに、
その種別内容の情報をオブジェクトで返します。
ここでは、作成者 (投稿者) 別ページの場合に、
display_name で投稿ユーザーのブログ上の表示名を取得しています。
表示名に HTML タグや特殊文字が含まれている場合も想定し、
esc_html でエスケープしています。
カテゴリ別でもタグ別でも、カスタムタクソノミー別でも日付別ページでも
なかった場合、救済策として 「ブログアーカイブ」を固定出力しています。
さて、40行目から45行目までがページネーションの組み込み部分です。
41行目の have_posts では記事があるかどうかを、
function_exists (PHP関数) では自作関数が存在するかどうかを判定し、
43行目で自作関数を呼び出して、一覧ページネーションを表示しています。
($wp_query->max_num_pages パラメータは指定しなくても構いません)
一覧ページネーションを出力している自作関数の具体的な処理内容は、
「一覧ページネーション を表示する」 を参照のこと。
ここでは、関数の組み込み作業だけですから、どうってことないですね。
HTML タイトルの切り替えやページネーションの表示は、
前準備の方が大変だったかもしれませんね (笑)
ひとまず、これでアーカイブページの作成は終了です。
次はどのテンプレートにしようかなぁ。