テンプレート階層
TOPICS
翻訳元記事はこちらです。
前述したように、テンプレートファイルはモジュール化された再利用可能なファイルで、WordPressサイトのウェブページを生成するために使用されます。
テンプレートファイルの中には(ヘッダーやフッターのテンプレートなど)、サイトのすべてのページで使用されるものもあれば、特定の条件でのみ使用されるものもあります。
この記事では、WordPress が個々のページで使用するテンプレートファイルを決定する方法を説明します。既存のWordPressテーマをカスタマイズしたい場合、どのテンプレートファイルを編集する必要があるかを決めるのに役立ちます。
また、条件付きタグを使用して、特定のページに読み込まれるテンプレートを制御することもできます。
テンプレートファイル階層
概要
WordPressは、ページを表示する際に、どのテンプレートまたはテンプレートのセットを使用するかを決定するために、クエリストリングを使用します。
クエリストリングは、ウェブサイトの各部分へのリンクに含まれる情報です。最初の「?」の後に来るもので、「&」で区切られたいくつかのパラメーターが含まれている場合があります。
簡単に言うと、WordPress はテンプレート階層を検索して、一致するテンプレートファイルを見つけるまで検索します。以下は、どのテンプレートファイルを使用するかを決定する方法です。
- すべてのクエリストリングをクエリタイプにマッチさせ、リクエストされたページを決定します。 (例えば、検索ページ、カテゴリページなど)
- テンプレート階層で決定された順序でテンプレートを選択します。
- 現在のテーマのディレクトリ内の特定の名前のテンプレートファイルを探し、階層で指定された、最初に一致するテンプレートファイルを使用します。
基本的なindex.phpのテンプレートファイルを除いて、特定のテンプレートファイルを実装するかどうかを選択することができます。
WordPress が一致する名前のテンプレートファイルを見つけられなかった場合、階層内の次のファイルにスキップします。
WordPressで一致するテンプレートファイルが見つからない場合は、テーマのindex.phpファイルが使用されます。
例
あなたのブログが http://example.com/blog/
にあり、訪問者が http://example.com/blog/category/your-cat/
のようなカテゴリページへのリンクをクリックした場合、WordPress は現在のテーマのディレクトリにあるテンプレートファイルの中からカテゴリの ID に一致するものを探して、正しいページを生成します。具体的には、WordPress は次のような手順を踏んでいます。
- 現在のテーマのディレクトリ内で、カテゴリのスラッグに一致するテンプレートファイルを探します。カテゴリのスラッグが「unicorns」の場合、WordPress は
category-unicorns.php
という名前のテンプレートファイルを探します。 category-unicorns.php
が見つからず、カテゴリのIDが4の場合、WordPressはcategory-4.php
という名前のテンプレートファイルを探します。category-4.php
がない場合、WordPressは一般的なカテゴリテンプレートファイルであるcategory.php
を探します。category.php
が存在しない場合、WordPressは一般的なアーカイブテンプレートであるarchive.php
を探します。archive.php
が存在しない場合、WordPressはメインテーマのテンプレートファイルであるindex.php
にフォールバックしてしまいます。
図でまとめたもの
下図は、WordPressのテンプレート階層に基づいてWordPressページを生成するために、どのテンプレートファイルが呼び出されるかを示しています。
詳細のサイトはこちらです。
テンプレート階層の詳細
テンプレート階層は図として理解しやすいですが、以下のセクションでは、WordPress がいくつかのクエリタイプに対してテンプレートファイルを呼び出す順番を説明します。
ホームページの表示
WordPressはデフォルトでは、あなたのサイトのホームページに最新のブログ記事を表示するように設定されています。このページはブログ記事インデックスと呼ばれています。
また、ブログ記事を別の静的ページに表示するように設定することもできます。フロントページとして使用している場合でも、別の静的ページとして使用している場合でも、ブログ記事インデックスのレンダリングには、テンプレートファイル「home.php」が使用されます。home.php
が存在しない場合、WordPressはindex.php
を使用します。
- home.php
- index.php
front-page.php
が存在する場合は、home.php
テンプレートを上書きします。
フロントページの表示
front-page.php
テンプレートファイルは、あなたのサイトのフロントページをレンダリングするために使用され、フロントページがブログ記事インデックスを表示するか、静的ページを表示するかに関わらず、使用されます。
フロントページテンプレートはブログ記事インデックス(home.php
)テンプレートよりも優先されます。front-page.php
ファイルが存在しない場合、WordPressは「設定」→「表示」の設定に応じて、home.php
かpage.php
ファイルのどちらかを使用します。
どちらのファイルも存在しない場合は、index.php
ファイルを使用します。
front-page.php
– 設定→表示設定の「ホームページの表示」で設定した「最新の投稿」と「固定ページ」の両方に使用します。home.php
– WordPress がfront-page.php
を見つけられず、「ホームページの表示」に「最新の投稿」が設定されている場合、home.php
を探します。
さらに、「ホームページの表示」で「投稿ページ」が設定されている場合、WordPress はこのファイルを探します。page.php
– 「ホームページの表示」で「ホームページ」が設定されている場合。index.php
– 「ホームページの表示」で「最新の投稿」が設定されていてもhome.php
が存在しない場合や、「ホームページ」が設定されていてもpage.php
が存在しない場合。
ご覧のように、WordPressがルートを進むかには多くのルールがあります。WordPressがどのような表示をするかを判断するには、上のチャートを使うのがベストです。
プライバシーポリシーの表示
privacy-policy.php
テンプレートファイルは、サイトのプライバシーポリシーページをレンダリングするために使用されます。
プライバシーポリシーページテンプレートは、静的ページ (page.php
) テンプレートよりも優先されます。privacy-policy.php
ファイルが存在しない場合、WordPress は利用可能なテンプレートに応じて page.php
または singular.php
ファイルを使用します。どちらのファイルも存在しない場合は、index.php
ファイルを使用します。
privacy-policy.php
– 設定→プライバシーの「プライバシーポリシーページを選択」で設定したプライバシーポリシーのページで使用します。- カスタムテンプレートファイル – ページに割り当てられたページテンプレート。
get_page_templates()
を参照してください。 page-{slug}.php
– ページのスラッグがprivacy
の場合、WordPressはpage-privacy.php
を使用します。page-{id}.php
– ページIDが6の場合、WordPressはpage-6.php
を使用します。- page.php
- singular.php
- index.php
個別投稿
個別投稿のテンプレートファイルを使って、個別投稿をレンダリングします。WordPress は以下の条件分岐でテンプレートを選択します。
single-{post-type}-{slug}.php
– まず、WordPressは特定の記事のテンプレートを探します。例えば、投稿タイプがproduct
で投稿スラッグがdmc-12
の場合は、single-product-dmc-12.php
を探します。(WordPress4.4以降)single-{post-type}.php
– ポストタイプがproduct
の場合、WordPressはsingle-product.php
を探します。single.php
– WordPressはその後、single.php
にフォールバックします。singular.php
– その後、singular.php
にフォールバックします。index.php
– 最後に、WordPressは最終的にindex.php
にフォールバックします。
固定ページ
静的なページ(固定ページタイプ)をレンダリングするために使用されるテンプレートファイルです。他の投稿タイプとは異なり、固定ページはWordPressにとって特別なものであり、以下の条件分岐となります。
- カスタムテンプレートファイル – ページに割り当てられたページテンプレート。
get_page_templates()
を参照してください。 page-{slug}.php
– ページのスラッグがrecent-news
の場合、WordPressはpage-recent-news.php
を使用します。page-{id}.php
– ページIDが6の場合、WordPressはpage-6.php
を使用します。- page.php
- singular.php
- index.php
カテゴリー
カテゴリーアーカイブのインデックスページのレンダリングは、WordPressでは以下の条件分岐となります。
category-{slug}.php
– カテゴリのスラッグがnews
の場合、WordPress はcategory-news.php
を探します。category-{id}.php
– カテゴリのIDが6の場合、WordPressはcategory-6.php
を探します。- category.php
- archive.php
- index.php
タグ
タグアーカイブのインデックスページを表示するには、WordPressでは以下の条件分岐となります。
tag-{slug}.php
– タグのスラッグがsometag
の場合、WordPress はtag-sometag.php
を探します。tag-{id}.php
– タグのIDが6の場合、WordPressはtag-6.php
を探します。- tag.php
- archive.php
- index.php
カスタムタクソノミー
カスタムタクソノミーは若干異なるテンプレートファイルパスを使用します。
taxonomy-{taxonomy}-{term}.php
– タクソノミーがsometax
、タクソノミーのタームがsometerm
の場合、WordPressはtaxonomy-sometax-someterm.php
を探します。
投稿フォーマットの場合は、タクソノミーが「post_format」、タームが「post-format-{format}」となります。
つまりリンク投稿フォーマットの場合はtaxonomy-post_format-postformat-link.php
です。taxonomy-{taxonomy}.php
– タクソノミーがsometax
だった場合、WordPressはtaxonomy-sometax.php
を探します。- taxonomy.php
- archive.php
- index.php
カスタム投稿タイプ
カスタム投稿タイプは、適切なアーカイブインデックスページをレンダリングするために以下の条件分岐となります。
archive-{post_type}.php
– カスタム投稿タイプがproduct
の場合、WordPressはarchive-product.php
を探します。- archive.php
- index.php
個別投稿タイプのテンプレートのレンダリングについては、上記の個別投稿の項を参照してください。
著者の表示
上記の例に基づいて、著者アーカイブのインデックスページをレンダリングすることは、かなり説明的です。
author-{nicename}.php
– 作者の名前がmatt
の場合、WordPress はauthor-matt.php
を探します。author-{id}.php
– 作者のIDが6だった場合、WordPressはauthor-6.php
を探します。- author.php
- archive.php
- index.php
日付
日付ベースのアーカイブインデックスページは、期待通りにレンダリングされます。
- date.php
- archive.php
- index.php
検索結果
検索結果は、他のテンプレートタイプと同じパターンで表示されます。
- search.php
- index.php
404(Not Found)
同様に、404テンプレートファイルもこの順番で呼び出されます。
- 404.php
- index.php
添付ファイル
添付ファイルページ(添付ファイル投稿タイプ)のレンダリングには、以下の条件分岐が使用されます。
{MIME-type}.php
– 任意の MIME タイプ。 (例:image.php
,video.php
,pdf.php
)
テキスト/プレーンの場合は、順番に以下のパスが使用されます。
1. text-plain.php
2. plain.php
3. text.php- attachment.php
single-attachment-{slug}.php
– 例えば、添付ファイルのスラッグがholiday
の場合、WordPress はsingle-attachment-holiday.php
を探します。- single-attachment.php
- single.php
- singular.php
- index.php
埋め込み
埋め込みテンプレートファイルは、埋め込み中の投稿をレンダリングするために使用されます。4.5以降、WordPressでは以下の条件分岐を使用しています。
embed-{post-type}-{post_format}.php
– まず、WordPress は特定の投稿のテンプレートを探します。例えば、投稿タイプがpost
で音声形式の場合、WordPress はembed-post-audio.php
を探します。embed-{post-type}.php
– 投稿タイプがproduct
の場合、WordPressはembed-product.php
を探します。embed.php
– WordPressはその後、embed.php
にフォールバックします。- 最後に、WordPressは最終的に独自の
wp-includes/them-compat/embed.php
テンプレートにフォールバックします。
非アスキー文字処理
WordPress 4.7 以降、テンプレート名に非 ASCII 文字を含む動的な部分は、実際にはエンコードされていない形式とエンコードされた形式の両方を、この順にサポートしています。どちらを使用するかを選択することができます。
ここでは、IDが6の「Hello World 😀」というページのページテンプレート階層です。
- page-hello-world-😀.php
- page-hello-world-%f0%9f%98%80.php
- page-6.php
- page.php
- singular.php
投稿スラッグ、ターム名、作者のニックネームにも同じ動作が適用されます。
フィルターの階層
WordPressのテンプレートシステムでは、階層をフィルタリングすることができます。
これは、階層の特定のポイントに何かを挿入したり変更したりすることができることを意味します。
フィルタ(get_query_template() 関数にあります)は以下のフィルタ名を使用します。
“{$type}_template” ここで $type
はテンプレートの種類です。
テンプレート階層で利用可能なすべてのフィルタのリストは以下の通りです。
embed_template
404_template
search_template
frontpage_template
home_template
privacypolicy_template
taxonomy_template
attachment_template
single_template
page_template
singular_template
category_template
tag_template
author_template
date_template
archive_template
index_template
例
例えば、デフォルトの著者階層を見てみましょう。
- author-{nicename}.php
- author-{id}.php
- author.php
author.php
の前にauthor-{role}.php
を追加するには、テンプレートタイプの「author_template」を使って実際の階層を操作します。
これにより、ユーザ名が「編集者」の役割を持つ/author/username
へのリクエストが、現在のテーマディレクトリに存在する場合には、author-editor.php
を使用して表示されるようになります。
function author_role_template( $templates = '' ) {
$author = get_queried_object();
$role = $author->roles[0];
if ( ! is_array( $templates ) && ! empty( $templates ) ) {
$templates = locate_template( array( "author-$role.php", $templates ), false );
} elseif ( empty( $templates ) ) {
$templates = locate_template( "author-$role.php", false );
} else {
$new_template = locate_template( array( "author-$role.php" ) );
if ( ! empty( $new_template ) ) {
array_unshift( $templates, $new_template );
}
}
return $templates;
}
add_filter( 'author_template', 'author_role_template' );