
投稿ページの表示をするテンプレートファイル single.php。
サイトによっては投稿によって表示レイアウトやスタイルを変えたりすることもあると思います。
そんな時にはsingle-〇〇.php といったファイルを作り、single.phpにはどのページでどのファイルを読み込むか条件分岐をかけて、それぞれ別のファイルを読み込むようにしています。
この条件分岐がうまく動作してくれなかったことがあったので、その対応についてのメモです。
ハマってしまったこと
通常の「投稿」に対してと、それ以外の複数の「カスタム投稿」のテンプレートファイルを分けて作りたかったので、「single-post.php」と「single-other.php」というファイルを作りました。
それを single.php でそれぞれのページで使うように、条件分岐を設定。
<?php
if (is_singular()) {
include(TEMPLATEPATH.'/single-other.php');
} else {
include(TEMPLATEPATH.'/single-post.php');
}
?>
このようにすれば、カスタム投稿の投稿ページでは single-other.phpが表示され、通常の投稿ページの場合はsingle-post.phpが表示されると思っていました。
しかし、どの投稿ページでも single-post.php しか読み込まれません。
条件分岐がうまくいっていないのかと思って、記述を逆にしてみましたが、それでも single-post.php の内容しか表示されません。
読み込むファイル名順があった
WordPressにはテンプレートファイルの読み込みの順序やページが決まっています。これを理解していなかったためハマってしまいました。
引用 : Template Hierarchy | Theme Developer Handbook | WordPress Developer Resources
single-post.php というファイル名は、single.php より先に読み込まれる仕様だったんです。
single.php が読み込まれなければ、条件分岐も読まれないので single-other.php は表示されません。
私がうまく表示できなかった原因は「ファイル名」。single-post.php を single-default.php というファイル名に変更したらうまく表示されました。
single.php のファイルの作り方
WordPressのthemeファイルの管理は作る人によって変わると思いますが、同じようなファイルの作り方をしている方の参考になれば幸いです。
一種類しか投稿タイプがなく、一つのテンプレートで十分スタイル変更できるならsingle.phpに直接内容を記述してもいいですし、各投稿それぞれでファイルを分けるならファイル名をURLに合わせることで、わざわざ single.php で条件分岐をかけなくても自動的に読み込まれます。
うまくいかないことがあったら、WordPressの仕様などを見直すと解決策が見つかるかもしれません。