WEBOPIXEL

WordPressのsingleテンプレートをカテゴリ別に切り替える

Posted: 2010.07.09 / Category: WordPress / Tag: 

通常のブログではなかなかやらないかもしれませんが、コーポレートサイトをWordpressで運用する場合、お知らせページや制作実績などページ別にデザインを変えたい場合があったりします。
そこで、カテゴリーごとに割り振られたIDを取得し、条件分岐でテンプレートを切り替えてみます。

Sponsored Link

カテゴリーIDを調べる

まずは分岐させたいカテゴリーのIDを調べておく必要があります。
このカテゴリーIDですが通常ブログを運営するうえであまり必要ないせいか、少しわかりづらかったりします。

管理画面で「投稿」→「カテゴリー」でカテゴリー編集画面を表示します。
取得するカテゴリー名をクリックまたは、マウスオーバーしてリンク先のアドレスの末尾を確認してください。

/wp-admin/categories.php?action=edit&cat_ID=3

ID=3となってます。これがカテゴリーIDです。
もちろん選択したカテゴリーによっては4だったり5だったりします。

調べた後であれですが、カテゴリーの分岐にはIDの他にもカテゴリースラッグが使えます。
カテゴリースラッグは編集画面に表示されてますのでわかりやすいですね。
また自分で決めることができますのでこちらを使用する方が良いかもしれません。

カテゴリーID&スラッグ

今回は例として下記の設定で行います。

スラッグ=news  ID=3
スタッグ=works ID=4

各singleテンプレートファイルの作成

準備として各カテゴリー別にsingleページ用のテンプレートファイルを作成します。
「news.php」「works.php」とそれ以外のカテゴリー用に「base.php」を用意しました。
ただ普通にルートフォルダに置くとカテゴリが増加したときメンテナンスが大変なので、「single」というフォルダを作成し、その中に保存します。

single/news.php

			<?php get_header(); ?>
			<h1>お知らせ</h1>
			<?php get_footer(); ?>
		

single/works.php

			<?php get_header(); ?>
			<h1>制作事例</h1>
			<?php get_footer(); ?>
		

single/base.php

			<?php get_header(); ?>
			<h1>その以外のページ</h1>
			<?php get_footer(); ?>
		

メインのsingleテンプレートファイルの作成

シングルページを指定したとき最初に読まれるテンプレートです。
これはテンプレートフォルダのルートに「single.php」で保存します。
ここで条件分岐を行い目的のテンプレートファイルをインクルードしてしまおうという寸法です。

single.php

		if ( in_category('3') ) {
			include(TEMPLATEPATH . '/single/news.php');
		} else if ( in_category('4') ) {
			include(TEMPLATEPATH . '/single/works.php');
		} else {
			include(TEMPLATEPATH . '/single/base.php');
		}
	

「 in_category(カテゴリーID or カテゴリースラッグ)」で現在のカテゴリーと比較します。
引数は3、4になってますが、前述のとおりカテゴリースラッグ(news、works)でもいけます。

スタイルシートの分岐

テンプレートが違うのにスタイルシートが同じってことないじゃないですか?
なのでheader.php内でスタイルシートもカテゴリーごとに切り替えてみます。

header.php

		<?php if( in_category('3') ): ?>
		<link href="<?php bloginfo('template_directory'); ?>/css/news.css" rel="stylesheet" type="text/css" media="all" />
		<?php elseif( in_category('4') ): ?>
		<link href="<?php bloginfo('template_directory'); ?>/css/works.css" rel="stylesheet" type="text/css" media="all" />
		<?php endif; ?>
	

といってもほとんど同じですね。
インクルードがスタイルシートの読み込みになっただけです。

追記:カテゴリースラッグで分岐しましょう

カテゴリーIDだとローカル環境とサーバー環境で制御が難しいので基本的にスラッグで分岐させた方がいいですね。

header.php

if (in_category('news')) {
    include(TEMPLATEPATH.'/single/news.php');
} elseif(in_category('works')) {
    include(TEMPLATEPATH.'/single/works.php');
} else {
    include(TEMPLATEPATH.'/single-default.php');
}