なぜこれらをひとまとまりと考えているのかというと、同じような作業工程で作ることができてしまうからです。WordPress のテーマの作成やカスタマイズの経験があれば、それほど難しくないわけです。ここまでテーマを作成してきて「これ以上はもうムリ」と思っているかもしれませんが、もうひとふんばりでユーザーがより使いやすいテーマを提供することができます。
実はなくても大丈夫
正直なところ、category.php・date.php・search.php・tag.php といった PHP ファイルがなくてもテーマは動作してしまいます。例えば、フォルダのなかに次のファイルしか存在しないテーマを思い浮かべてください。
- comments.php
- footer.php
- header.php
- index.php
- page.php
- sidebar.php
- single.php
これはテーマが動作するために必要な最低限のファイルなのですが、このテーマでサイドバーにある「カテゴリー」のリンクをクリックしてみてください。すると表示できてしまうはずです。
ユーザーはこのページを表示する前に、自分でどのような操作をしたのかわかっているはずので、category.php・date.php・search.php・tag.php といった PHP ファイルがなくても大丈夫ではあります。ただ、ユーザービリティの向上のためにはあったほうがよいです。
テーマを作成し、余裕があったらぜひチャレンジしてみてください。
archive.phpでもいいのだけど
WordPress のサイドバーで日付ごとに記事を分類しているものを「アーカイブ」と呼んでいるので、アーカイブとは日付を意味するものと考えてしまうかもしれません。そう、私のように。
実は、WordPress における「アーカイブ」とは本来「ページの一覧」という意味があります。さらに、ページの一覧には目的別に次のような PHP ファイルを割り当てることもできます。
- category.php:カテゴリー別のページ一覧
- tag.php:タグ別のページ一覧
- date.php:日付別のページ一覧
- author.php:著者別のページ一覧
- taxonomy.php:カスタム分類別のページ一覧
上記の5つのファイルは archive.php で置き換えることが可能です。ただし、その場合には分類ごとに表示を切り替えるなどの細かなカスタマイズはできなくなります。手を抜きたかったら archive.php だけ置いて、あとは使いまわせばいいわけですね。
なので、デフォルトではサイドバーにおける日付による分類は「アーカイブ」と呼んでいますが、「日付」とかになっていなければおかしいんです。最初に「アーカイブ」と名付けた WordPress さんサイドが悪い。
今回はカテゴリー、タグ、検索結果、アーカイブ(ここでは日付のこと)ごとに表示を切り替えたいので、archive.php を使いまわさずにそれぞれに対応する PHP ファイルを作成していきます。
くどいですが日付別で分類したページの一覧を表示したいので、archive.php ではなく date.php を作成する点に注意してください。
WordPress にはテンプレート階層と呼ばれる PHP ファイルを呼び出す優先順位があります。例えば、カテゴリーごとにページの一覧を表示する場合、category.php があればこれを使い、なければ archive.php、それもなければ index.php が使われることになります。最低限の PHP ファイルがテーマフォルダに存在すればテーマが動作してしまうのはこのためです。
category.php
ブログ記事の一覧が表示されるトップページとの違いは、ページ一覧の上に「カテゴリー:○○○」と表示されるようになるだけです。
なので、index.php さえ作ってあれば、ほとんど修正する必要もありません。6行目を追加しただけです。
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 | <?php get_header(); ?> <div class="content"> <?php if (have_posts()) : ?> <h1>カテゴリー:<?php single_cat_title(); ?></h1> <?php while (have_posts()) : the_post(); ?> <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>> <h2><a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a></h2> <div class="post-meta"> <span class="post-date"><?php echo get_the_date(); ?></span> <span class="category">カテゴリー : <?php the_category(', ') ?></span> <span class="comment-num"><?php comments_popup_link('コメント : 0', 'コメント : 1', 'コメント : %'); ?></span> </div> <?php the_content('…[続きを読む]'); ?> </div> <?php endwhile; if(function_exists('wp_page_numbers')) : wp_page_numbers(); endif; else : ?> <h1>記事はありません</h1> <p>お探しの記事は見つかりませんでした。</p> <?php endif; ?> </div> <?php get_sidebar(); ?> <?php get_footer(); ?> |
記事数が多かった場合にはページネーションが表示されるようになっていますが、プラグインの「WP Page Numbers」を使って実現しています。25行目ですね。
1ページごとに何件の記事を表示するかを設定するには、管理画面で「設定」→「表示設定」と移動し、「1ページに表示する最大投稿数」に件数を入力すれば変更できます。最後に「変更を保存」ボタンを押して設定を完了してください。
tag.php
ページ一覧の上に「タグ:○○○」と表示されるようになります。
category.php さえ作っておけば tag.php は超カンタンなのです。category.php のソースコードをコピーして tag.php と名前を付けて保存、6行目を次の一行と入れ替えるだけです。
1 | <h1>タグ:<?php single_cat_title(); ?></h1> |
date.php
ページ一覧の上に「アーカイブ:○年○月」と表示されるようになります。
アーカイブ(日付ね)別の一覧表示も簡単です。tag.php と同様にソースコードをコピーして date.php で保存し、6行目を次の一行と入れ替えてください。
1 | <h1>アーカイブ:<?php echo get_the_date('Y年n月'); ?></h1> |
search.php
ページ一覧の上に「○○○」の検索結果:○件と表示されるようになります。
検索結果の一覧表示ですが、こちらは少し設定を加える必要があります。category.php の6行目を次の一行と入れ替えるまでは同じです。
1 | <h1>「<?php the_search_query(); ?>」の検索結果 : <?php echo $wp_query->found_posts; ?>件</h1> |
ここで終わりにしてもいいのですが、検索結果に固定ページなどが引っ掛かるのが少しわずらわしいかもしれません。そこで、function.php に次のソースコードを追加します。
1 2 3 4 5 6 | function filter_search($query) { if (!is_admin() && $query->is_main_query() && $query->is_search()) { $query->set('post_type', 'post'); } } add_action('pre_get_posts', 'filter_search'); |
このように設定すれば、検索結果にはブログ記事だけが表示されるようになります。
index.phpを分岐させることもできる
今回は分類ごとに PHP ファイルを作成してきましたが、index.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 | <?php get_header(); ?> <div class="content"> <?php if (have_posts()) : if(is_category()): ?> <h1>カテゴリー:<?php single_cat_title(); ?></h1> <?php elseif(is_tag()): ?> <h1>タグ:<?php single_cat_title(); ?></h1> <?php elseif(is_date()): ?> <h1>アーカイブ:<?php echo get_the_date('Y年n月'); ?></h1> <?php elseif(is_search()): ?> <h1><?php the_search_query(); ?>の検索結果 : <?php echo $wp_query->found_posts; ?>件</h1> <?php endif; while (have_posts()) : the_post(); ?> <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>> <h2><a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a></h2> <div class="post-meta"> <span class="post-date"><?php echo get_the_date(); ?></span> <span class="category">カテゴリー : <?php the_category(', ') ?></span> <span class="comment-num"><?php comments_popup_link('コメント : 0', 'コメント : 1', 'コメント : %'); ?></span> </div> <?php the_content('…[続きを読む]'); ?> </div> <?php endwhile; if(function_exists('wp_page_numbers')) : wp_page_numbers(); endif; else : ?> <h1>記事はありません</h1> <p>お探しの記事は見つかりませんでした。</p> <?php endif; ?> </div> <?php get_sidebar(); ?> <?php get_footer(); ?> |
例として当ブログの index.php を丸ごと掲示してしまいましたが、要は6~14行目をいつも使っているテーマの index.php にコピー&ペーストし、if 文で分類ごとに出力される HTML を分岐させればよいです。ブログのトップページであればなにも表示されません。
私は分類ごとにファイルを切り替える方式が好きなので複数の PHP ファイルを作成しましたが、冗長に感じるようであればこちらをお試しください。
Comment