テンプレート階層

2020.04.01 2020.04.01

TOPICS

翻訳元記事はこちらです。

前述したように、テンプレートファイルはモジュール化された再利用可能なファイルで、WordPressサイトのウェブページを生成するために使用されます。
テンプレートファイルの中には(ヘッダーやフッターのテンプレートなど)、サイトのすべてのページで使用されるものもあれば、特定の条件でのみ使用されるものもあります。

この記事では、WordPress が個々のページで使用するテンプレートファイルを決定する方法を説明します。既存のWordPressテーマをカスタマイズしたい場合、どのテンプレートファイルを編集する必要があるかを決めるのに役立ちます。

また、条件付きタグを使用して、特定のページに読み込まれるテンプレートを制御することもできます。

テンプレートファイル階層

概要

WordPressは、ページを表示する際に、どのテンプレートまたはテンプレートのセットを使用するかを決定するために、クエリストリングを使用します。
クエリストリングは、ウェブサイトの各部分へのリンクに含まれる情報です。最初の「?」の後に来るもので、「&」で区切られたいくつかのパラメーターが含まれている場合があります。

簡単に言うと、WordPress はテンプレート階層を検索して、一致するテンプレートファイルを見つけるまで検索します。以下は、どのテンプレートファイルを使用するかを決定する方法です。

  1. すべてのクエリストリングをクエリタイプにマッチさせ、リクエストされたページを決定します。 (例えば、検索ページ、カテゴリページなど)
  2. テンプレート階層で決定された順序でテンプレートを選択します。
  3. 現在のテーマのディレクトリ内の特定の名前のテンプレートファイルを探し、階層で指定された、最初に一致するテンプレートファイルを使用します。

基本的なindex.phpのテンプレートファイルを除いて、特定のテンプレートファイルを実装するかどうかを選択することができます。

WordPress が一致する名前のテンプレートファイルを見つけられなかった場合、階層内の次のファイルにスキップします。
WordPressで一致するテンプレートファイルが見つからない場合は、テーマのindex.phpファイルが使用されます。

あなたのブログが http://example.com/blog/ にあり、訪問者が http://example.com/blog/category/your-cat/ のようなカテゴリページへのリンクをクリックした場合、WordPress は現在のテーマのディレクトリにあるテンプレートファイルの中からカテゴリの ID に一致するものを探して、正しいページを生成します。具体的には、WordPress は次のような手順を踏んでいます。

  1. 現在のテーマのディレクトリ内で、カテゴリのスラッグに一致するテンプレートファイルを探します。カテゴリのスラッグが「unicorns」の場合、WordPress は category-unicorns.php という名前のテンプレートファイルを探します。
  2. category-unicorns.phpが見つからず、カテゴリのIDが4の場合、WordPressはcategory-4.phpという名前のテンプレートファイルを探します。
  3. category-4.phpがない場合、WordPressは一般的なカテゴリテンプレートファイルであるcategory.phpを探します。
  4. category.phpが存在しない場合、WordPressは一般的なアーカイブテンプレートであるarchive.phpを探します。
  5. archive.phpが存在しない場合、WordPressはメインテーマのテンプレートファイルであるindex.phpにフォールバックしてしまいます。

図でまとめたもの

下図は、WordPressのテンプレート階層に基づいてWordPressページを生成するために、どのテンプレートファイルが呼び出されるかを示しています。

詳細のサイトはこちらです。

テンプレート階層の詳細

テンプレート階層は図として理解しやすいですが、以下のセクションでは、WordPress がいくつかのクエリタイプに対してテンプレートファイルを呼び出す順番を説明します。

ホームページの表示

WordPressはデフォルトでは、あなたのサイトのホームページに最新のブログ記事を表示するように設定されています。このページはブログ記事インデックスと呼ばれています。
また、ブログ記事を別の静的ページに表示するように設定することもできます。フロントページとして使用している場合でも、別の静的ページとして使用している場合でも、ブログ記事インデックスのレンダリングには、テンプレートファイル「home.php」が使用されます。home.phpが存在しない場合、WordPressはindex.phpを使用します。

  1. home.php
  2. index.php

front-page.phpが存在する場合は、home.phpテンプレートを上書きします。

フロントページの表示

front-page.php テンプレートファイルは、あなたのサイトのフロントページをレンダリングするために使用され、フロントページがブログ記事インデックスを表示するか、静的ページを表示するかに関わらず、使用されます。
フロントページテンプレートはブログ記事インデックス(home.php)テンプレートよりも優先されます。
front-page.phpファイルが存在しない場合、WordPressは「設定」→「表示」の設定に応じて、home.phppage.phpファイルのどちらかを使用します。
どちらのファイルも存在しない場合は、index.phpファイルを使用します。

  1. front-page.php – 設定→表示設定の「ホームページの表示」で設定した「最新の投稿」と「固定ページ」の両方に使用します。
  2. home.php – WordPress が front-page.php を見つけられず、「ホームページの表示」に「最新の投稿」が設定されている場合、home.php を探します。
    さらに、「ホームページの表示」で「投稿ページ」が設定されている場合、WordPress はこのファイルを探します。
  3. page.php – 「ホームページの表示」で「ホームページ」が設定されている場合。
  4. index.php – 「ホームページの表示」で「最新の投稿」が設定されていてもhome.phpが存在しない場合や、「ホームページ」が設定されていてもpage.phpが存在しない場合。

ご覧のように、WordPressがルートを進むかには多くのルールがあります。WordPressがどのような表示をするかを判断するには、上のチャートを使うのがベストです。

プライバシーポリシーの表示

privacy-policy.php テンプレートファイルは、サイトのプライバシーポリシーページをレンダリングするために使用されます。
プライバシーポリシーページテンプレートは、静的ページ (page.php) テンプレートよりも優先されます。privacy-policy.php ファイルが存在しない場合、WordPress は利用可能なテンプレートに応じて page.php または singular.php ファイルを使用します。どちらのファイルも存在しない場合は、index.phpファイルを使用します。

  1. privacy-policy.php – 設定→プライバシーの「プライバシーポリシーページを選択」で設定したプライバシーポリシーのページで使用します。
  2. カスタムテンプレートファイル – ページに割り当てられたページテンプレート。get_page_templates() を参照してください。
  3. page-{slug}.php – ページのスラッグがprivacyの場合、WordPressはpage-privacy.phpを使用します。
  4. page-{id}.php – ページIDが6の場合、WordPressはpage-6.phpを使用します。
  5. page.php
  6. singular.php
  7. index.php

個別投稿

個別投稿のテンプレートファイルを使って、個別投稿をレンダリングします。WordPress は以下の条件分岐でテンプレートを選択します。

  1. single-{post-type}-{slug}.php – まず、WordPressは特定の記事のテンプレートを探します。例えば、投稿タイプがproductで投稿スラッグがdmc-12の場合は、single-product-dmc-12.phpを探します。(WordPress4.4以降)
  2. single-{post-type}.php – ポストタイプがproductの場合、WordPressはsingle-product.phpを探します。
  3. single.php – WordPressはその後、single.phpにフォールバックします。
  4. singular.php – その後、singular.phpにフォールバックします。
  5. index.php – 最後に、WordPressは最終的にindex.phpにフォールバックします。

固定ページ

静的なページ(固定ページタイプ)をレンダリングするために使用されるテンプレートファイルです。他の投稿タイプとは異なり、固定ページはWordPressにとって特別なものであり、以下の条件分岐となります。

  1. カスタムテンプレートファイル – ページに割り当てられたページテンプレート。get_page_templates() を参照してください。
  2. page-{slug}.php – ページのスラッグがrecent-newsの場合、WordPressはpage-recent-news.phpを使用します。
  3. page-{id}.php – ページIDが6の場合、WordPressはpage-6.phpを使用します。
  4. page.php
  5. singular.php
  6. index.php

カテゴリー

カテゴリーアーカイブのインデックスページのレンダリングは、WordPressでは以下の条件分岐となります。

  1. category-{slug}.php – カテゴリのスラッグがnewsの場合、WordPress は category-news.php を探します。
  2. category-{id}.php – カテゴリのIDが6の場合、WordPressはcategory-6.phpを探します。
  3. category.php
  4. archive.php
  5. index.php

タグ

タグアーカイブのインデックスページを表示するには、WordPressでは以下の条件分岐となります。

  1. tag-{slug}.php – タグのスラッグが sometag の場合、WordPress は tag-sometag.php を探します。
  2. tag-{id}.php – タグのIDが6の場合、WordPressはtag-6.phpを探します。
  3. tag.php
  4. archive.php
  5. index.php

カスタムタクソノミー

カスタムタクソノミーは若干異なるテンプレートファイルパスを使用します。

  1. taxonomy-{taxonomy}-{term}.php – タクソノミーがsometax、タクソノミーのタームがsometermの場合、WordPressはtaxonomy-sometax-someterm.phpを探します。
    投稿フォーマットの場合は、タクソノミーが「post_format」、タームが「post-format-{format}」となります。
    つまりリンク投稿フォーマットの場合はtaxonomy-post_format-postformat-link.phpです。
  2. taxonomy-{taxonomy}.php – タクソノミーがsometaxだった場合、WordPressはtaxonomy-sometax.phpを探します。
  3. taxonomy.php
  4. archive.php
  5. index.php

カスタム投稿タイプ

カスタム投稿タイプは、適切なアーカイブインデックスページをレンダリングするために以下の条件分岐となります。

  1. archive-{post_type}.php – カスタム投稿タイプがproductの場合、WordPressはarchive-product.phpを探します。
  2. archive.php
  3. index.php

個別投稿タイプのテンプレートのレンダリングについては、上記の個別投稿の項を参照してください。

著者の表示

上記の例に基づいて、著者アーカイブのインデックスページをレンダリングすることは、かなり説明的です。

  1. author-{nicename}.php – 作者の名前がmattの場合、WordPress は author-matt.php を探します。
  2. author-{id}.php – 作者のIDが6だった場合、WordPressはauthor-6.phpを探します。
  3. author.php
  4. archive.php
  5. index.php

日付

日付ベースのアーカイブインデックスページは、期待通りにレンダリングされます。

  1. date.php
  2. archive.php
  3. index.php

検索結果

検索結果は、他のテンプレートタイプと同じパターンで表示されます。

  1. search.php
  2. index.php

404(Not Found)

同様に、404テンプレートファイルもこの順番で呼び出されます。

  1. 404.php
  2. index.php

添付ファイル

添付ファイルページ(添付ファイル投稿タイプ)のレンダリングには、以下の条件分岐が使用されます。

  1. {MIME-type}.php – 任意の MIME タイプ。 (例: image.php, video.php, pdf.php)
    テキスト/プレーンの場合は、順番に以下のパスが使用されます。
    1. text-plain.php
    2. plain.php
    3. text.php
  2. attachment.php
  3. single-attachment-{slug}.php – 例えば、添付ファイルのスラッグが holiday の場合、WordPress は single-attachment-holiday.php を探します。
  4. single-attachment.php
  5. single.php
  6. singular.php
  7. index.php

埋め込み

埋め込みテンプレートファイルは、埋め込み中の投稿をレンダリングするために使用されます。4.5以降、WordPressでは以下の条件分岐を使用しています。

  1. embed-{post-type}-{post_format}.php – まず、WordPress は特定の投稿のテンプレートを探します。例えば、投稿タイプがpostで音声形式の場合、WordPress は embed-post-audio.php を探します。
  2. embed-{post-type}.php – 投稿タイプがproductの場合、WordPressはembed-product.phpを探します。
  3. embed.php – WordPressはその後、embed.phpにフォールバックします。
  4. 最後に、WordPressは最終的に独自のwp-includes/them-compat/embed.phpテンプレートにフォールバックします。

非アスキー文字処理

WordPress 4.7 以降、テンプレート名に非 ASCII 文字を含む動的な部分は、実際にはエンコードされていない形式とエンコードされた形式の両方を、この順にサポートしています。どちらを使用するかを選択することができます。

ここでは、IDが6の「Hello World 😀」というページのページテンプレート階層です。

投稿スラッグ、ターム名、作者のニックネームにも同じ動作が適用されます。

フィルターの階層

WordPressのテンプレートシステムでは、階層をフィルタリングすることができます。
これは、階層の特定のポイントに何かを挿入したり変更したりすることができることを意味します。
フィルタ(get_query_template() 関数にあります)は以下のフィルタ名を使用します。
“{$type}_template” ここで $type はテンプレートの種類です。

テンプレート階層で利用可能なすべてのフィルタのリストは以下の通りです。

例えば、デフォルトの著者階層を見てみましょう。

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' );