WordPressにおいて、リクエストがあった時に、どういうページを表示するのかを決める条件分岐は 、大きく以下の2の仕組みで制御されています。
- テンプレート階層
- 条件分岐タグ
_sでは、上記の2つ以外に、get_template_part()でテンプレートパーツファイルを読み込む際に、 第二引数に get_post_type()を渡すことで、ポストタイプ別に異なるファイルを読み込む処理も使われています。
テンプレート階層
リクエストに含まれているクエリによって、どの種類のページが要求されているかが決まると、その後、WordPressは、その種類のページにはどのテンプレートファイルを読み込むのが適切かを決めます。その際に用いられるルールが、テンプレート階層というものです。
テンプレート階層が何のためにあって、どういった仕組みで動いているのか…について、英語になりますが、下記の記事が一番わかりやすかったです。
THE WORDPRESS TEMPLATE HIERARCHY: WHAT, WHY, AND HOW
WordPressのソースファイルでは、wp-includes/template-loader.php にテンプレート階層が書かれています。
if ( wp_using_themes() ) :
$template = false;
if ( is_embed() && $template = get_embed_template() ) :
elseif ( is_404() && $template = get_404_template() ) :
elseif ( is_search() && $template = get_search_template() ) :
elseif ( is_front_page() && $template = get_front_page_template() ) :
elseif ( is_home() && $template = get_home_template() ) :
elseif ( is_post_type_archive() && $template = get_post_type_archive_template() ) :
elseif ( is_tax() && $template = get_taxonomy_template() ) :
elseif ( is_attachment() && $template = get_attachment_template() ) :
remove_filter( 'the_content', 'prepend_attachment' );
elseif ( is_single() && $template = get_single_template() ) :
elseif ( is_page() && $template = get_page_template() ) :
elseif ( is_singular() && $template = get_singular_template() ) :
elseif ( is_category() && $template = get_category_template() ) :
elseif ( is_tag() && $template = get_tag_template() ) :
elseif ( is_author() && $template = get_author_template() ) :
elseif ( is_date() && $template = get_date_template() ) :
elseif ( is_archive() && $template = get_archive_template() ) :
else :
$template = get_index_template();
endif;
/**
* Filters the path of the current template before including it.
*
* @since 3.0.0
*
* @param string $template The path of the template to include.
*/
if ( $template = apply_filters( 'template_include', $template ) ) {
include( $template );
} elseif ( current_user_can( 'switch_themes' ) ) {
$theme = wp_get_theme();
if ( $theme->errors() ) {
wp_die( $theme->errors() );
}
}
return;
endif;
条件分岐タグ
テンプレート階層によって、どのテンプレートファイルを読み込むのかが決まりますが、テンプレートファイル内で条件分岐タグを使うことで、さらに表示内容を細かく制御できます。
WordPress Codex Conditional Tags
とてもたくさん種類がありますが、if文の中で、is_やhas_で始まるもので、関数の名前から処理が想像できるものになっています。
テンプレートパーツによる条件分岐
get_template_part()は、テンプレートパーツファイルの読み込みで使われる関数です。
WordPress Codex 関数リファレンス/get template part
_sでは、 このget_template_part() の第二引数にget_post_type()を使うことで、その記事のポストタイプに応じたテンプレートパーツファイルを読み込むよう分岐している部分があります。
WordPress Codex 関数リファレンス/get post type
例えば、index.phpには以下のような記述があります。
get_template_part( 'template-parts/content', get_post_type() );
template-partsというディレクトリ以下には、content.php以外に、content-page.phpやcontent-none.php、content-search.phpというファイルがあります。get_post_typeでハイフン以下に該当するファイルが見つかればそのファイルを、見つからなければ content.phpを読み込むという処理が行われます。
_s以外のテーマでは、get_post_type()以外に、get_post_format()を使って分岐を行うような方法もあるようです。
また余談ですが、includeやrequireではなく、なぜWordPressではget_temlate_part()を使うべきなのかは、下記の記事が良くまとまっていました。
Understanding get_template_part
get_temlate_part()を使うべき理由
- ファイルへのフルパスを書く必要がない。
- ファイルが無い場合も、warningやfatalエラーを出さない。
- ファイルが無い時には、他に適したファイルを自分で探す。
- 子テーマと親テーマの関係を理解して、適切なファイルを読み込むことができる。