WordPress
シングルページで複数のデザインを変えたい時のテンプレートファイル

シングルページで複数のデザインを変えたい時のテンプレートファイル

 
僕よりもはるかにスキルの高い方から、スカイプで「single.php」でスラッグ毎にデザインを変えたいが、どうしてる?」的な質問が来ました。

まず人の話を基本よく聞かない私は、まずスラッグとカテゴリーを混同したりして、頭の中で、「え、single-slug.phpでいけるんとちゃうん」と、単純に思ってしまったので、そのまま返してしまったのですが、動かないと。

wordpress様を過信していたので、ハイフンの後になんでもつければ、優先順位でwp様が勝手に判断してくれるだろうという、なんて楽天的な発想のオレ。

ということで、調べてみると…

まず、個別記事を表示するsingle.phpでは、カテゴリーを指定するテンプレート階層はありません。カテゴリーならcategory-slug.phpとして、カテゴリーに付随するslug別にテンプレートファイルを用意できますが、シングルではslugを用意することは稀だからでしょう。

なんとなく読んでいたスカイプの会話が終わってから、「え、シングルのスラッグ!?」と気が付き、「そう言われればどうやるんだろう」とやってみたのをメモしておきます。

 

まず、カテゴリー別に個別記事のデザインを変える場合

single.phpのテンプレート階層の順番
  1. single-{post_type}.php
    ※3.0以降
  2. single.php
  3. index.php

上記を見ると、single-{post_type}.phpということで、{post_type}の部分はポストタイプです。

カテゴリーなどを指定するものではないので、single.phpではハイフンの後にカテゴリーなどを指定できないということになります。

カテゴリーごとに single.php を変更したい場合は、条件分岐を使用して、別のテンプレートファイルを読み込みます。

 

single-post.phpを作成して分岐

<?php
if (in_category(hoge)) {
   /* カテゴリスラッグ hoge の場合 */
   include(TEMPLATEPATH . '/single-hoge.php');
}
elseif (in_category(fuga)) {
     /* カテゴリスラッグ fuga の場合 */
   include(TEMPLATEPATH . '/single-fuga.php');
}
else {
   /* 他のカテゴリの投稿 */
   include(TEMPLATEPATH . '/single.php');
}
?>

上の例では、single.phpはそのままに、single-post.phpを作成して、hoge, fuga, その他のシングルページ全部と振り分けています。

 

ではスラッグではどうか

こちらはis_singleを使用して、任意のスラッグを指定して分岐します。

 

シングルページをスラッグで分岐

<?php
if (is_single('foo')) {
   /* カテゴリスラッグ photo */
   include(TEMPLATEPATH . '/single-foo.php');
}
elseif (is_single('bar')) {
   /* カテゴリスラッグ photo */
   include(TEMPLATEPATH . '/single-bar.php');
}
else {
   /* 他のカテゴリの投稿 */
   include(TEMPLATEPATH . '/single.php');
}
?>

is_singleのパラメーターは、

  • 記事ID
  • 記事タイトル
  • 記事スラッグ

と適用できるので、スラッグを指定した場合は、そのスラッグで条件分岐することができます。

※複数の場合は配列で。

個別のシングルページを分岐することがあまりなかったので、勉強になりました。感謝です!!!