万が一、当サイトで重大な問題を発見した際などは、フォーラムや WordSlack #docs チャンネルでお知らせください。</p>
カテゴリーテンプレート
目次
はじめに
訪問者があなたのブログのカテゴリーのいずれかをクリックすると、特定のカテゴリーの投稿が時系列に沿って (新しい投稿が上に、古い投稿が下に) 一覧表示されます。表示方法にはいろいろな選択肢があります。全文を表示するか、抜粋のみにするか、また追加情報 (タイトル、著者、投稿日、最終更新など)を表示するかなどです。テーマによって表示方法は異なりますし、それらを変更したいこともあるでしょう。
本記事では、訪問者がブログのカテゴリーページを訪問したときの動作を変更する方法を解説します。テーマおよびテンプレートファイルの使い方も含まれます。テンプレートファイルについてよく知らない場合は、「テーマの使い方」と「テンプレート入門」をまず読む方が良いかもしれません。
カテゴリーアーカイブへのパーマリンクはパーマリンク設定でコントロールします。
使われるテンプレートファイル
カテゴリーページを訪問したときの表示を変更するには、まず、テーマファイルのどれが使われるかを理解する必要があります。テンプレート階層と呼ばれています。
カテゴリーの場合、階層は比較的単純です。例えば、問題のカテゴリーのスラッグが news で、ID が 6 だとします。テンプレート階層は、テーマディレクトリ内に、以下のリストで最初に見つかったテンプレートファイルを使用するように指定します。
- category-slug.php
- category-6.php
- category.php
- archive.php
- index.php
つまり、(category-news.php のような) category-slug.php が存在しなければ、WordPress は category-6.php を探します。以下同様です。
ID が 6 のカテゴリーの表示方法を現在の表示から(そして、他のカテゴリーページの表示と異なるように)変更したい場合、category-6.php ファイルを作成してください。カテゴリーアーカイブを他のアーカイブ(日付アーカイブや著者アーカイブ等)と異なる表示にしたい場合は、category.php ファイルを作成/変更します。 すべてのアーカイブページの表示を変更したい場合は、archive.php ファイルを作成/変更します。index.php ファイルを変更すると、ブログ全体に影響します。
新しいファイルを作成する必要があるときは、次の階層のファイルをコピーするのが良いでしょう。例えば、カテゴリー 6 に特別な表示をしたい場合は、category.php ファイルをコピーすることから始めます。category.php が存在しなければ archive.php を使います。
例
カテゴリーページの見栄えを編集するには、テーマディレクトリのどのテンプレートファイルを編集すれば良いかについて、理解できたことでしょう。では例を見てみましょう。これらの例で「テンプレートファイルを編集する」という文言は、上のセクションで選択したファイルを編集することを意味します。
カテゴリーページにテキストを追加する
投稿の上に固定テキスト
カテゴリーページの投稿一覧の前に、固定テキストを表示する場合を考えてみましょう。ここで「固定」は、どのような記事が表示される場合でも、どのカテゴリーが表示される場合でも、テキストが変化しないことを意味します。 やり方: The_Loop セクションの上に、以下のコードを挿入します。
<p> This is some text that will display at the top of the Category page. </p>
カテゴリーによって異なるテキスト
もう少し複雑なものとして、訪問者の閲覧するカテゴリーページによって、異なるテキストを表示する場合を考えてみます。category.php ファイルに、デフォルトのテキストを追加し、特定のテキストを必要とするカテゴリー各々に category-#.php ファイルを作成します。
この方法は、テーマディレクトリにたくさんのファイルを作成します。ループの外側に以下のコードを挿入することで、たくさんのファイルを作成することが避けられます。
<?php if (is_category('Category A')) : ?> <p>カテゴリー A の説明テキスト。</p> <?php elseif (is_category('Category B')) : ?> <p>カテゴリー B の説明テキスト。</p> <?php else : ?> <p>その他のアーカイブページの説明となるデフォルトテキスト。空でも良い。</p> <?php endif; ?>
このコードは以下のことを行います。カテゴリー A を表示しているか調べ、そうであれば最初のテキストを表示する。そうでなければカテゴリー B を表示しているか調べ、表示している場合は「カテゴリー B の説明テキスト。」 を出力する。もしカテゴリー A でもカテゴリー B でもない場合はデフォルトテキストを表示する。
アーカイブの最初のページにだけテキストを表示する
もし、カテゴリー内に1ページに表示する投稿数 (ブログの管理パネルで設定可能) 以上の投稿がある場合は、カテゴリーアーカイブは複数のページに分割されます。アーカイブの最初のページにだけ固定テキストを表示したい場合や、2ページ目以降で他のテキストを表示したい場合もあるでしょう。
この場合は、PHP if 文を使用して、WordPress 変数 $paged の値を調べます ($paged はページ番号です。最初のページは1、次のページは2、など)。複雑に思えるかもしれませんが、思ったほどではありません。ループに以下を追加するだけです。
<?php if ( $paged < 2 ) { ?> <p>Text for first page of Category archive.</p> <?php } else { ?> <p>Text for subsequent pages of Category. Can be left out.</p> <?php } ?>
カテゴリー名
カテゴリー名をページ上部に表示することもできます。テンプレートに記述されていることもありますが、そうでない場合は、ループの上に以下を追加します。
<p>Category: <?php single_cat_title(); ?></p>
記事の表示方法を編集する
抜粋か、記事全体か
カテゴリーページのサイズを減らしたいことがあるでしょう。個々の投稿の記事全文を表示するのではなく、抜粋を表示することができます。この場合、テンプレートのループ内の テンプレートタグ/the_content() を探しだし、the_excerpt() に置き換えてください。たいていは PHP タグの内部にあります。
<?php the_excerpt(); ?> and <?php the_content(); ?>
逆に、現在は抜粋を表示しているが、記事全文を表示したい場合は、the_excerpt を the_content に置き換えてください。
記事へのリンクを画像にする
おもしろいことに、カテゴリーアーカイブページでは、記事の代わりに、記事へのリンク画像を表示する、といったこともできます。記事の抜粋セクションに、画像を置きます。1 つの記事にたいして以下を行います。
- 記事編集画面で画像をアップロードする。
- ビジュアルエディタから HTML エディタへ変更する。
- 「アップロード/挿入」で画像を挿入する。フルサイズの画像か確認する。
- 挿入された HTML img タグをコピーし、記事編集画面の「抜粋」に貼り付ける。
- コンテンツを書いたら(コンテンツから画像は取り除いて良い)、記事を公開する。
さらに、テンプレートを修正する必要があります。次のようなトリックを使います。the_excerpt_rss() テンプレートタグは抜粋に段落タグを追加しません。これを利用して img を HTML に挿入し、リンクにすることができます。the_content の代わりに、以下のように記述します。
<a href="<?php the_permalink() ?>"> <?php the_excerpt_rss(); ?> </a>
警告: 抜粋に、テキストではなく img タグを挿入することになるので、RSS フィードに影響する可能性があります。これを行う場合は、RSS フィードには、抜粋ではなく記事全文を表示するように設定したほうが良いでしょう。
読者に表示するカテゴリーを制限する
以下のコードを用いると、アーカイブや他のページで表示するカテゴリーを制限することができます。
<?php query_posts('cat=1&showposts='.get_option('posts_per_page')); ?>
ループの前に置いてください。 query_posts() 関数のパラメータについては、query posts のページをご覧ください。 コードの get_option('posts_per_page') は、ブログ設定で指定した表示記事数です。
このコードは、カテゴリーを分離したい場合に役立つでしょう。複数のアーカイブを作ることができます。例えば、以下のようにします。
<?php if (have_posts()) : ?> <?php if (is_month()) {query_posts('year='.get_the_time('Y').'&monthnum='.get_the_time('m').'&author_name=admin&cat=1&showposts='.get_option('posts_per_page')); ?> <!-- Do stuff... -> <?php } ?> <?php while (have_posts()) : the_post(); ?> <!-- post's contents --> <?php endwhile; ?> <?php endif; ?>
関連情報
テンプレート階層: カテゴリーテンプレート, タグテンプレート, タクソノミーテンプレート, ページテンプレート, 投稿タイプテンプレート, 投稿者テンプレート, 日付テンプレート, 検索テンプレート, 404 テンプレート, 添付ファイルテンプレート, ループテンプレート /en
資料
- Support Forum discussion of Category-based theme - 日時の代わりに、カテゴリーで記事を管理するテーマの作成方法 (訳注:リンク先はかなり古い --Mizuno 2009年8月25日 (火) 10:09 (UTC))
- テンプレート - テーマおよびテンプレートに関連する資料一覧