WordPressでテーマを作成するときに同じようなテンプレートを作成するときがあります。例えば、単純なsingle.phpとpage.phpの本文とかindex.phpとsearch.phpとarchive.phpの記事リストとかです。ほかにも、single.phpでpost-formatだけ変えたいときなどがあります。同じようなものをコピペで使い回してもいいですが、ミスの元になりやすいですし何よりそんな作業は面倒です。WordPressではget_template_part()というコピペ作業から開放してくれる関数があります。

get_template_part()について

get_tempalte_part()は引数に指定したテンプレートをインクルードしてくれる関数です。テーマを作成したことあるならget_header()やget_footer()などをつかってheader.phpやfooter.phpなどがインクルードされるのを知っていると思います。get_template_part()はそのget_header()やget_footer()みたいなテンプレートのインクルードを好きに指定できる関数です。

関数の仕様

get_template_part( $slug, $name );
引数説明デフォルト必須
$slugstringテーマスラッグ名なし
$namestring特定テンプレート名なし
  • $slugはテーマディレクトリからテンプレートファイルのパスを指定します。get_template_part()において$slugは必ず書く必要があります。
  • $nameは$slugに対して追加で名前があるときに指定します。

呼び出したいテンプレートの例

上の説明だとちょっとわかりづらいと思うのでどういう風にテンプレートファイルの名前を指定するのかをだします。インクルードしたいテンプレートファイルに以下のものがテーマディレクトリの直下にあるとします。

  • content.php
  • content-single.php

content.phpをインクルードしたい場合

content.phpの「content」がget_template_part()の $slug になります。なのでcontent.phpをインクルードしたいときは

get_template_part( 'content' );

とすればOKです。

$slugについて

上の2つの例でいくとget_template_part()において別に$nameは必要なくねぇ!? と思う方もいるでしょう。content-single.phpの場合だと$slugと$nameは、ハイフンで区切ったテンプレートファイル名と同じだからです。

$slug-$name.php

ここで少し細かい説明をするとget_template_part()における$slugは テンプレートファイル名を引数としているのではありません 。テーマディレクトリからテンプレートファイルまでのパスを指定します。なのでテーマディレクトリからディレクトリを切ってその下にインクルードしたいテンプレートがある場合は以下のような形にすればいいです。

get_template_part( 'template/content' );

またディレクトリを切ったテンプレートファイルと同じ階層のテンプレートファイルをインクルードしたい場合もテーマフォルダからの指定なので上と同じやり方になります。

get_template_part( 'template/content', 'aside' );

$nameについて

$nameは$slugは複数あるときに$nameで区切っておくと便利なのでどんどん使いましょう。Twenty Thirteenでは、get_post_format()を使って投稿ページ(single.php)の投稿フォーマットを出し分けしてます。

まとめ

ここまでget_template_part()について紹介しました。最初のほうに書いたとおりテーマ作成で同じような処理をする場合や投稿フォーマットが変わるときなどはコピペをするのではなく、get_template_part()をつかってテーマを作成しましょう。