WordPress クラシックテーマを制作したことがある方ならご存知の方も多いでしょう get_template_part()
関数。こちらはテーマ内にある部品(パーツ)を読み込む際に利用します。
WordPress テーマに限ったことではありませんが、ディレクトリ内がさまざまな名前が付けられているファイルで煩雑になっていると、想像外のミスや問題を起こすきっかけになったりすることもあります。そう言う場合には、パラメーターを活用することで、細かな用途に分けられたパーツも整頓・管理することができるようになります。
ここでは、それら整頓する際の記述も含めて、 get_template_part()
関数について詳しく紹介していきます。
get_template_part() 関数とは
テンプレートパーツをテンプレートに読み込むことができます。
また、子テーマがテーマ内の再利用可能なコードをオーバーロードするためのシンプルなメカニズムを提供します。この関数を使ってパーツを読み込んでおくと、子テーマを使ってカスタマイズを行う際にもパーツの上書きも管理しやすくなります。詳しくは後述します。
get_template_part()
の内部では require_once
ではなく require
を使って読み込まれるため、同じパーツを複数回読み込むことができます。
パラメーター
$slug | テンプレートのスラッグ名 |
$name (オプション) | 特別なテンプレートの名前 |
$args (オプション) | 追加でテンプレートに渡す引数 |
使い方
例えばテーマの中に content.php
というパーツを用意したとします。このパーツを任意のテンプレート(例えば single.php
など)から呼び出したい時には、以下のように記述します。
get_template_part( 'content' );
テーマフォルダの中に content.php
などとパーツを作っていくと、ファイル数が増えていくとちょっと煩雑になってしまうかもしれません。
そういった際によく利用されるフォルダー名で template-parts
というものがあります。例えばその中に content.php
を用意して template-parts/content.php
という状態にしたとします。この場合、呼び出し方は以下のようになります。
get_template_part( 'template-parts/content' );
パラメーターの $slug
はこのように使います。
さらに、投稿ページに特化したパーツ content-single.php
を用意した場合だと、以下のように呼び出すことができます。
get_template_part( 'template-parts/content', 'single' );
パラメーターの $name
はこのように活用することができます。
最後に引数をパーツに渡すことができます。使い方はさまざまだと思いますので、単純に値を渡す方法を紹介します。まず、受け取るパーツの方で出力できるように準備します。例えば、content-single.php
ファイルの中にこのように値を出力できるようにしておきます。
<p>key1の値は <?php echo $args[ 'key1' ]; ?> です。</p>
<p>key2の値は <?php echo $args[ 'key2' ]; ?> です。</p>
という記述を含めたとします。そして、パーツを読み込む際に以下のように引数を渡してあげます。
get_template_part(
'template-parts/content',
'single',
array(
'key1' => 'あいうえお',
'key2' => 'かきくけこ'
)
);
すると、出力部分では、
key1の値は あいうえお です。
key2の値は かきくけこ です。
となります。こちらを応用して動的な仕組みを作ることもできるので、場合によっては活用できることも幅広くなりますね。
子テーマを利用したカスタマイズを行う際の優先順位について
ファイルの上書きの仕組みについて
これまで template-parts/content-single.php
というファイル名を使って紹介してきているので、ここでも同じファイル名を使って説明していきます。
まず、通常テーマを作る際に template-parts/content-single.php
というファイルを用意して、投稿コンテンツを表示する際に利用するパーツを作ったとします。
おそらくこの流れで固定ページのコンテンツを表示するためのパーツ template-parts/content-page.php
を用意することもあるでしょう。
そして、そのように作られている親テーマを利用しつつ、必要な箇所だけカスタマイズしたいと考えた場合、WordPress では「子テーマ」というものを用意してカスタマイズを行うことがあります。
子テーマについて詳しい説明は割愛しますが、親テーマと同じ階層に同じ名前のファイルを用意した場合、上書きすることができます。
例えば、子テーマの中に template-parts/content-single.php
というファイルを作った場合、親テーマの template-parts/content-single.php
ではなく、子テーマの template-parts/content-single.php
が採用され表示に利用されます。
ファイルがなかった場合にはどうなるのか
では、子テーマから template-parts/content-single.php
を指定したけれど、何らかの問題でそのファイルが存在しなかった場合にはどうなるのか。エラーが出力されるのか?
結論としては、親テーマの template-parts/content-single.php
が表示されます。
ではさらに、親テーマのアップデートの影響からか、親テーマにも template-parts/content-single.php
が存在しなくなっていたらどうなるのか?
その場合は、子テーマの template-parts/content.php
(-single
がない)が採用されます。さらに子テーマ側にこのファイルがない場合には、親テーマの template-parts/content.php
が採用されるという優先順位となっています。
まとめるとこのような感じです。
子テーマからtemplate-parts/content-single.php
を上書きした場合の表示が優先されるパーツの順番は、
- 子テーマの
template-parts/content-single.php
- 親テーマの
template-parts/content-single.php
- 子テーマの
template-parts/content.php
- 親テーマの
template-parts/content.php
となります。
パーツのファイル命名をする際に考えるべきこと
上記の理由から、パーツの命名をする際にも考えるべきことがあります。結論としては、content-single.php
というファイルを作るのであれば、そのファイルのフォールバック的役割を持たせるためにも content.php
というファイルは用意するべきでしょう。
この仕組みを持っておかないと、いざという時に「何も表示されない」という最悪な状態が発生する可能性があります。WordPress テーマに index.php
ファイルが必要なのと同じですね。
パーツの呼び出しについてはこの4つを覚えておこう!
WordPress テーマ開発において、テンプレートパーツを呼び出す場面は多々あります。それらの場面でどの関数をいつ使えば良いのか判断に迷うかもしれませんが、大きく分けて以下の4つに分類することができます。参考までに覚えておきましょう。
サイトヘッダーを呼び出す関数 get_header()
サイトヘッダーを呼び出す場合には get_header()
関数を利用します。
サイトフッターを呼び出す関数 get_footer()
サイトフッターを呼び出す場合には get_footer()
関数を利用します。
サイドバーを呼び出す関数 get_sidebar()
サイドバーを呼び出す場合には get_sidebar()
関数を利用します。
これらの関数については以下のページでも紹介しています。
上記のパーツ以外を呼び出す関数 get_template_part()
サイトヘッダー、サイトフッター、サイドバー以外のパーツを呼び出す場合によく利用されるのが、本記事で紹介している get_template_part()
関数になります。ぜひ覚えておきましょう。
フック
get_template_part
do_action( ‘get_template_part’, string $slug, string $name, string[] $templates, array $args )
get_template_part()
が利用される前に発火するアクションフックです。
add_action(
'get_template_part',
function () {
echo "すべての get_template_part() が使われている箇所の前に出力される";
}
);
こちらを実行すると、テーマ内で利用されているすべての get_template_part()
の前に、echo されているテキストが表示されます。
get_template_part_{slug}
do_action( “get_template_part_{$slug}”, string $slug, string|null $name, array $args )
読み込むパーツのスラッグを指定して、そのパーツの読み込みがされる前に発火するアクションフックです。
add_action(
'get_template_part_template-parts/content/content-single',
function () {
echo "template-parts/content/content-single.php パーツが読み込まれる直前に出力されます";
}
);
$slug
で読み込むパーツを指定することで、特定のパーツの読み込み前に処理を挟むことができます。
まとめ
今回はクラシックテーマ開発でも利用頻度が高い get_template_part()
関数を紹介してきました。
スラッグを指定して利用されることは多いと思いますが、階層を持たせることができる点や、引数を渡すことができるという点に気づきを得る方も見えたかも知れませんね。
また、子テーマでの利用を可能にするためにも、パーツが欠損した際に利用されるパーツの優先順になども知っておくと、より汎用性の高いテーマを開発することができるでしょう。