get_template_part()はslug-name.phpを先に探し見つからなければslug.phpを読む
公開日: 執筆:佐藤
WordPressテーマのget_template_part( 'content', 'product' )は、content-product.phpを先に探し、なければcontent.phpを読み込みます。共通templateをslug.phpへ置き、違いが必要な種類だけslug-name.phpへ分ける関数です。
ファイルを分ける目的は、同じHTMLを複数のtemplateへ複製しないことです。分割数を増やすこと自体を目的にせず、繰り返し使う単位と、種類によって変える単位を決めます。
第二引数を指定すると種類別templateを先に探す
説明用の仮例として、投稿内容の共通templateをcontent.phpへ置き、商品投稿だけcontent-product.phpへ分けます。呼出側には次の一行を書きます。
<?php get_template_part( 'content', 'product' ); ?>
WordPress 4.2.2のget_template_part()は、第一引数を$slug、第二引数を$nameとして、次の順で候補を組み立てます。
{slug}-{name}.php{slug}.php
この仮例なら、最初の候補はcontent-product.php、二番目はcontent.phpです。第二引数を省いたget_template_part( 'content' )では、content.phpだけを探します。
種類別templateが見つからなくても、共通templateがあれば処理を続けられます。反対に、二つとも存在しなければ、その呼出しではtemplate fileを読み込みません。file名の綴りと配置場所を確認せず、関数が自動でfileを作るとは考えないでください。
子テーマではfile名の優先順を先に見る
get_template_part()は、候補をlocate_template()へ渡します。WordPress 4.2.2のlocate_template()は、候補fileを一つずつ取り出し、子テーマ側のSTYLESHEETPATH、親テーマ側のTEMPLATEPATHの順に存在を確認します。
子テーマを使い、get_template_part( 'content', 'product' )を呼ぶ場合の検索順は次のとおりです。
| 順番 | 探すfile |
|---|---|
| 1 | 子テーマのcontent-product.php |
| 2 | 親テーマのcontent-product.php |
| 3 | 子テーマのcontent.php |
| 4 | 親テーマのcontent.php |
file名の優先順が、子テーマと親テーマの優先順より外側にあります。そのため、親テーマにcontent-product.phpがあれば、子テーマのcontent.phpより先に読み込まれます。商品用の表示を子テーマで変えたいなら、子テーマにもcontent-product.phpを置きます。
親テーマのfileを直接編集すると、theme更新で変更が失われる可能性があります。変更対象が一つの種類だけなら、必要な種類別templateだけを子テーマへ置き、共通template全体の複製を避けます。
共通templateへ戻せる違いだけをnameで分ける
第二引数のnameは、違いの種類をfile名で表します。たとえば、通常投稿、商品投稿、告知投稿でHTMLが異なる場合に、次のように分けられます。
get_template_part( 'content', 'product' );
get_template_part( 'content', 'notice' );
get_template_part( 'content' );
ただし、分類名が増えるたびにtemplateを複製すると、修正箇所も増えます。見出し、本文、日付の構造が同じならcontent.phpへまとめ、構造が異なる種類だけを分けてください。色や余白だけの違いは、classとCSSで扱える場合があります。
template partを細かくし過ぎると、画面の一箇所を直すために、呼出側と複数fileを追う必要が生じます。header、記事本文、検索結果の一件など、責任を一文で説明できる単位にします。
同じtemplate partは一回しか使えないfileではない
get_template_part()は、見つけたfileをrequire_onceではなくrequireで読み込みます。同じpageの中で同じtemplate partを複数回呼ぶことができます。
この性質は、投稿一覧で一件ごとに同じ表示部品を使う場合に必要です。一方、関数定義やclass定義をtemplate partへ直接書き、同じfileを複数回読み込むと、重複定義の問題が起こり得ます。再利用する処理はfunctions.phpなどへ分け、template partは表示するHTMLを中心にします。
制作会社へtheme改修を依頼しても、親theme、子theme、独自fileのどれを正本として保守するかは、サイト所有者が把握できるようにします。納品時には、get_template_part()の呼出場所、候補file、変更した子themeのfileを一覧に残してください。
最初の一手は、theme内のget_template_part()を一件選び、第一引数と第二引数から候補fileを二つ書き出し、子themeと親themeのどこに存在するか確認することです。
関連記事

