WordPressでテンプレートの編集をしていると、get_template_part関数を見かけます。これは、他のテンプレートを現在のテンプレート内に埋め込む関数です。
直接コードを記述せず、別ファイルとして1行のコードで呼び出せるので、管理や編集が楽になります。
headerやfooterなど主要なパーツは「 get_header();」や「 get_footer();」というシンプルな関数が予め用意されています。get_template_partはそれ以外の、自作したテンプレートを読み込むときに使います。
get_template_partの使い方について実例を使って解説します。
get_template_part関数の基本構文
get_template_partは以下のように最大で2つの引数をとります。
get_template_part( $slug, $name );
- $slug: テンプレートのパス(必須)
- $name: 特定テンプレート名(省略可)
指定したファイルが見つからなかったときは、「false」を返します(v5.5.0以降)。
ここではWordpressのフィルの命名ルールに沿っています。
例えば、投稿の個別ページを読み込みたい場合に、そのテンプレートのファイル名が「single.php」の場合は、「get_template_part( ’single’ );」となります。
「single-product.php」という個別のテンプレートを呼び出したい場合は、「get_template_part( ’single’, ‘product’ );」となります。
ファイルが深い階層に入っている場合
テンプレートファイルのパスの指定は、テーマディレクトリからの相対パスを記述します。
上記例では、single.phpはテーマディレクトリの直下にあるため、’single.php’とすればOK。もし、更に深い階層構造にある場合は、ディレクトリ名/ で階層を指定します。
例えば、「wp-content > themes > テーマディレクトリ名 > template-parts > post > content-image.php」のファイルを呼び出したい場合は以下のように指定します。
get_template_part( ’template-parts/post/content’, ‘image’ );
WordPressのファイル読み込み順序(ファイル階層)
WordPressがファイルを読み込む順序について補足しておきます。
WordPressはファイル名によって優先的に読み込むファイルを分けています。例えば投稿ページの場合、優先度の高い順に以下のようになります。
もし1~3のファイルが作成されていない場合は、index.phpが使われます。ちなみに、index.phpはWordpressを構築するときに必須のファイルです。
これらは、Wordpressが自動で判断するものですが、get_template_part関数を使えば、他のテンプレートを自分で選択して埋め込めるようになります。
投稿ページ以外のフィアル階層は以下のようになっています。
get_template_part関数の使用実例
まずは、簡単な実例でget_template_part関数の動作をご紹介します。
使用中のテーマディレクトリのは以下に以下のようなファイルを作成します。
- wp-content > themes > テーマディレクトリ名 > template-parts > post > content-test.php
<hr>
<div>
<p>get_template_part関数による読み込みをテストしています。</p>
</div>
<hr>
このcontent-test.phpテンプレートをindex.phpの中で読み込みます。index.phpの冒頭に以下を追記します。
<?php get_template_part( 'template-parts/post/content', 'test' ); ?>
以上でコードの記述は完了です。
index.phpを使っているページをブラウザで開きます。するとページの冒頭に読み込んだテンプレートが表示されているのがわかります。
このように、get_template_part関数は簡単で、かつ便利です。
get_template_part関数の使用実例(応用編:変数を使う)
get_template_part関数の引数は変数で指定することもできます。投稿ページの「投稿フォーマット」という機能を使った実際の使用例を説明します。
投稿フォーマットとは?
投稿ページにはデフォルトで「投稿フォーマット」という機能が用意されています。これは、ページの内容に合わせて使うテンプレートを切り分ける機能です。
投稿ページ毎に割り当てます。各ページにはそれに対応する値が紐付けられます。各ページ毎の投稿フォーマットは「get_post_format()」という関数で取得できます。
例えば、画像には「image」、動画には「movie」が割当てられます。これがテンプレートとひも付きます。
標準だと「content.php」ですが、画像は「content-image.php」、動画は「content-movie.php」のテンプレートを参照するようになります。
get_template_partの応用
この切り分け機能は、get_template_part関数を応用しています。
例えば、投稿一覧ページに投稿タイプによるレイアウトの切り分け機能を実装する場合は、以下のようなコードを記述します。
第2引数は、get_post_format関数を使って、現在の投稿の投稿タイプを代入しています。
get_template_part( 'template-parts/post/content', get_post_format() );
これは、template-parts > post ディレクトリ配下にある、content-{投稿タイプ}.php のテンプレートを呼び出す記述です。
通常、全投稿から一つづつを抜き出す「while ( have_posts() ) 」の中で使います。
<?php
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
get_template_part( 'template-parts/post/content', get_post_format() );
endwhile;
else :
get_template_part( 'template-parts/post/content', 'none' );
endif;
?>
投稿が一つでもあれば、以下の処理になり、その投稿タイプに該当するテンプレートを表示します。
- get_template_part( ‘template-parts/post/content’, get_post_format() );
投稿が無い場合は以下のように、なにもない場合のテンプレート content-none.php を返します。
- get_template_part( ‘template-parts/post/content’, ‘none’ );
ちなみに、have_posts()は次に表示する投稿があるかどうかを真偽値で返します。the_post()は、have_postsを次の投稿に進める処理になります。
まとめ
get_template_part関数はいかがでしたでしょうか?
カスタムしたテンプレートを作成したり、ページの内容を切り出して、それを簡単に呼び出し・埋め込める、とても便利な機能なので、ぜひ、色々と試してみてください。