WordPress Snippet

ワードプレスをカスタマイズしよう

💡 WordPress 5.2 privacy-policy.php 追加

  • Tab Area

Ver4.3以降

Ver4.3以前

WordPress Template_Hierarchy

テンプレートヒエラルキ( テンプレート階層 )とは

テンプレートヒエラルキ( テンプレート階層 )は、テンプレート名をあらかじめ決められルールに従って命名した時、
ページの表示タイプによって、テンプレートが自動的に割り当てられる機能をいいます。

アーカイブを表示する時には、archive.phpがあれば、archive.phpを使用する。適用すべきテンプレートがなければ、index.phpを使用する適用順
月次アーカイブを表示する場合に、date.phpがあれば、それを利用し、なければ archive.php それもなければ、index.phpを使用するという適用順

テンプレートは、ファイル名以外に特別なコメントなどは、必要としません。

テンプレートヒエラルキ(階層)に示されたファイル名は、テーマの他の目的のファイル名としては使用できません。

カスタムテンプレート

固定ページを表示する場合、page-id.php page-slug.phpで、特定のページの場合に特別なテンプレートを適用することが出来ますが、
テンプレートを変更するという手段は、他にもあります。(ヒエラルキの、$custom.phpに相当する部分)

テンプレート階層(ヒエラルキ)のテンプレートは、自動的にあるシチュエーションに対してテンプレートを適用しますが、カスタムテンプレート(固定ページテンプレート)は 編集画面でのユーザーの選択によって適用されます

 

固定ページテンプレートの編集画面内にある、ページ属性メタボックス内のテンプレートを選択する事でテンプレートが適用されます

 

このテンプレートは、それが固定ページテンプレートである事をWordPressが認識可能にするために、
特殊なコメントをテンプレートに記述します。
(ファイル名の命名規則はありませんが、テンプレートヒエラルキによるテンプレート名と同一名称ではいけません。)

 

以下のように、Template Name: テンプレート名 というコメントを記述する事で、WordPressは、このファイルが固定ページテンプレートであると認識し、メタボックスに選択肢が表示されます。

/**
 * Template Name: Full Width Page
 *
 * @package WordPress
 * @subpackage Twenty_Fourteen
 * @since Twenty Fourteen 1.0
 */

この固定ページテンプレートは、拡張子がphpであること以外に特別な記述のルールはありません。
( このテンプレート名も、テンプレート階層(ヒエラルキ)のテンプレート名と異なる必要があります )

 

このテンプレートは、htmlに限らず、適切なヘッダーをつけていれば、画像を直接描画したり、xmlでも、jsonでも自由に出力可能です。

テンプレートパートファイル

これ以外にも、テンプレートパートファイルと呼ばれるテンプレートが存在します。

代表的なのは、header.php footer.phpといった、テンプレートのある部分を構成するようなテンプレートです。

テンプレートパートファイルも、phpファイルであること以外に、特別なコメントなどは必要ありません。

テンプレートパートファイルも、WordPressの関数を用いることで、ヒエラルキ(階層)を持たせることが出来ます。

get_template_part('content','a');

この関数は、テンプレート階層に示されたテンプレートや、固定ページテンプレートに記述されるページの一部分を構成する(テンプレートパートファイル)を挿入するために使われる代表的な関数ですが、

この関数は、チャイルドテーマに記述された場合は、チャイルドテーマ内に、content-a.phpテンプレートが存在すれば、content-a.phpを挿入し、存在しなければ、content.phpを探し、どちらも存在しなければ、親テーマの、content-a.php、content.phpを探し挿入します。

このように、階層的にテンプレートを走査します。

 

テンプレートパートファイルのフォールバックテンプレート

では、header.php,footer.php等、表示に重大な影響を持つテンプレートパートファイルが存在しない場合に、WordPressはどんな挙動を示すのでしょうか?

例えば、header.phpが存在しない場合は、htmlのhead 要素は書き出すことが出来なくなるはずですが、
実際には、代替のヘッダーが表示されます。

代替ヘッダーは、wp-includes/theme-compatにある、header.phpが、フォールバックテンプレートパートファイルとして機能します。

WordPressは、comments-popup.php,comments.php,footer.php,header.php,sidebar.phpのフォールバック機能を持っています。

 

まとめ

テーマのテンプレートは、○○が無かったら ▽▽で、といった形で適用されます。

テンプレート階層(テンプレートヒエラルキ)は、

index.phpしか持たないようなテーマであっても、テンプレート名を命名規則に従って、追加するだけで、
必要な部分の表示を変更できるという事であり、
WEBサイトを構築するうえで極めて柔軟なカスタマイズを行う事を可能にするものです。

一方で、テンプレート階層に示された命名パターンは、テーマ内の他の用途で使用してはいけないファイル名のパターンであるとも言えます。

補足

テンプレートを挿入する場合に、PHP の include()や他の関数を利用してインクルードする事が推奨されない理由の一つに、テンプレート階層に対応しないという事があります。

WordPressの関数内部では、これらのPHP関数が使用されているわけですが、大抵の場合、なれ久しんだPHPを便宜的に利用するという事により、いつの間にか、(大抵問題が起きるまで気づかないまま)テンプレート階層に対応できない環境が出来上がってしまうのは、望ましくありません。

他にも、include()を使った場合は、読み込み元で定義された変数も利用できますが、get_template_part()では、読み込み元の変数が利用できない等、安易なPHP関数の直接利用は、変数汚染の可能性も含みます