• get_template_part()はslug-name.phpを先に探し見つからなければslug.phpを読む

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として、次の順で候補を組み立てます。

  1. {slug}-{name}.php
  2. {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のどこに存在するか確認することです。

戻る