is_single()とis_singular()の条件のちょっとした勘違いと、各テンプレート条件を付ける際の個人的な決定版
ちょっとしくった。
is_single()とis_singular()が単純に単一投稿・カスタム投稿タイプの条件だと勘違いしていたせいで、たとえそれがどっちだとしてもis_single()の条件に問答無用で通ってしまうと気付いてしまったアラサーの春。
結論から言うと、is_single()とis_singular()で条件を分けても単一投稿・カスタム投稿タイプの判定は効かない。
それなりの規模のサイトなんか最近はその場限りの対価を取ってのオーダーメイドサイト制作そのものに疑問を感じてごにょってるし、やるとしても多岐の投稿を扱うならマルチブログでいいやん…と思っていたせいで、割と基礎的なところに悶えることになってしまった。
で、これを受けて、is_single()とis_singular()で単一投稿・カスタム投稿タイプを正確に判定しつつの、テンプレートの条件をfunctions.phpに記述するときの個人的な決定版を作成した。あくまで個人的なね。
で、まずはis_single()とis_singular()について。
これはCodexさん曰く、
is_single() 添付ファイルや固定ページを除く個別の投稿を表示しているかどうかをチェックします。 is_singular() 個別の投稿を表示中であるかチェックします。
とのことだ。
書いてあるそのまんまで、is_single()はたとえ単一投稿(post_type=’post’)だろうが、カスタム投稿タイプだろうが同じ条件を通る。ただし、固定ページや添付ファイルのテンプレートは例外。
is_singular()はこれらを含めて全てとのこと。
つまり、単純に以下のようにしても、それが単一投稿かカスタム投稿は区別できない。
if ( is_single() ) {
// 単一投稿?
} elseif ( is_single() ) {
// カスタム投稿タイプ?
}
で、こいつを正確に単一投稿とカスタム投稿で、プラス、添付ファイル・固定ページを切り分けるためには、ほんのちょこっとだけ工夫が必要。
単一投稿の投稿タイプが初期設定として常にpostであることを利用して以下のように行う。
if ( is_page() ) {
// 固定ページテンプレートの条件
} elseif ( is_attachment() ) {
// 添付ファイルテンプレートの条件
} elseif ( is_single() && is_singular( 'post' ) ) {
// 標準の単一投稿テンプレートの条件
} elseif ( is_single() || is_singular() ) {
// 他投稿タイプ(カスタム投稿タイプ含む)のテンプレートの条件
}
これで、広い意味での投稿タイプはそれぞれ正確に分けられる。
少し条件が無駄に付いているような気もするが、個人的な感覚の問題でそれが何の条件を示しているかわかりやすくしたいがため。
で、これに合わせて、他アーカイブとか含めて各テンプレート条件を付けるとfunctions.phpに記述するときにはこんな感じの決定版ができる。
if ( is_front_page() ) {
if ( is_page() ) {
// フロントテンプレートに固定ページを設定した際の条件
} else {
// 通常のフロントテンプレートの条件
}
} elseif ( is_page() ) {
// 固定ページテンプレートの条件
} elseif ( is_attachment() ) {
// 添付ファイルテンプレートの条件
} elseif ( is_single() && is_singular( 'post' ) ) {
// 標準の単一投稿テンプレートの条件
} elseif ( is_single() || is_singular() ) {
// 他投稿タイプ(カスタム投稿タイプ含む)のテンプレートの条件
} elseif ( is_category() ) {
// カテゴリテンプレートの条件
} elseif ( is_tag() ) {
// タグテンプレートの条件
} elseif ( is_tax() ) {
// カスタムタクソノミー(∽カスタムターム)テンプレートの条件
} elseif ( is_date() ) {
if ( is_year() ) {
// 年別アーカイブテンプレートの条件
} elseif ( is_month() ) {
// 月別アーカイブテンプレートの条件
} elseif ( is_day() ) {
// 日別アーカイブテンプレートの条件
}
} elseif ( is_search() ) {
// 検索テンプレートの条件
} elseif ( is_404() ) {
// 404テンプレートの条件
} elseif ( is_author() ) {
// 投稿者テンプレートの条件
} elseif ( is_archive() ) {
// 以外アーカイブテンプレートの条件
} else {
// その他
}
やはり、4月だからか初心に返るときが多いこの頃。
というか、正直オーダーメイドサイトだけ作っていても、WordPressやその他でなんやかんや作るための技術って全然伸びねーんだなと思う。
上も配布用のテーマを作っているときに気付いた内容だが、本当に基礎の部分だし。
で、「てめぇ何様だ!クソコーダーのくせに生意気だ!ハイクを読め、カイシャクしてやる!」と思われるかも知れないけど。
オーダーメイドのサイトだけを作る・・・言わばサワリだけのものづくりをいくつか数をこなした時点でヒトは「自分はなんでもできる!」と考えてしまいがち。
でも、それははっきり言って(自分への戒めの意味もあるけど)ただの慢心。
ものづくりに関わる上で、たとえそれが浅かろうが深かろうが、「自分はなんでもできる!」と思った瞬間に、ものづくりをやる人間としてはおしまい。
消極的すぎるのもアレだけど、「なんでもできる!」と思うのは、あらゆる道を極めた、天の道を行き総てを司るヒトだけに許されるセリフ。
たったひとつでもできないことがあるのであれば、それを欠片たりとも思ったり言ったりする資格はない。そして、ノーバディーズ・パーフェクト。
俺は既にアラサーなので(できる限り精進はするけど)手遅れかもしれないが、WordPressに限らず何かものづくりを始めようとしている若い世代の人はオープンに公開できるモノをひとつでも作り出してみてもいいかもしれない。見えないものが見えるようになる。
