2026年5月20日
2026年5月20日
get_template_part()の使い方|引数$argsの渡し方と読み込み順を解説
get_template_part() は、テーマの一部を別ファイルに切り出して読み込むWordPressの関数です。WordPress 5.5以降は第3引数 $args で変数を渡せるようになり、同じパーツを場所ごとに出し分けやすくなりました。この記事では、基本の書き方、ファイルが探される順番(子テーマ→親テーマ)、$args の受け取り方、読み込めないときの調べ方までを、そのまま使えるコード例とともに解説します。
get_template_part()の基本
構文は次のとおりです。
get_template_part( string $slug, string|null $name = null, array $args = array() );
$slug:テーマのルートからの相対パス。拡張子.phpは付けない(例:template-parts/content)$name:パーツの種類を表す名前。指定すると{$slug}-{$name}.phpを優先して探す$args:テンプレートパーツに渡す配列(5.5以降)
たとえば記事一覧で、投稿タイプごとにカードのデザインを変えたい場合は次のように書きます。
<?php
// archive.php などのループ内
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
get_template_part( 'template-parts/content', get_post_type() );
endwhile;
endif;
投稿なら template-parts/content-post.php、カスタム投稿タイプ news なら template-parts/content-news.php を探し、見つからなければ template-parts/content.php を読み込みます。専用ファイルを用意した種類だけデザインを変え、それ以外は共通のファイルで表示する、という作り方ができます。
include や require で直接読み込むのと比べた利点は、子テーマで同じパスにファイルを置くだけで上書きできる点と、読み込み時にアクションフックが実行される点です。配布するテーマや、子テーマでのカスタマイズを想定するテーマでは、パーツの読み込みに get_template_part() を使うのが一般的です。
ファイルが探される順番
get_template_part() は内部で locate_template() を使ってファイルを探します。この順番を知っておくと、「子テーマに置いたのに反映されない」という問題を避けられます。
get_template_part( 'template-parts/content', 'news' ) の場合、探す順番は次のとおりです。
- 子テーマの
template-parts/content-news.php - 親テーマの
template-parts/content-news.php - 子テーマの
template-parts/content.php - 親テーマの
template-parts/content.php
ポイントは、ファイル名ごとに子テーマ→親テーマの順で探すことです。つまり、親テーマに content-news.php があり、子テーマには content.php しかない場合、親テーマの content-news.php が使われます。子テーマの側を優先させたいなら、親テーマと同じファイル名で子テーマに置いてください。
子テーマを使っていない場合は、1と2、3と4が同じ場所になるだけで、考え方は変わりません。
$argsで値を渡す(WordPress 5.5以降)
5.5より前は、パーツに値を渡すには set_query_var() やグローバル変数を使う必要がありました。現在は第3引数の配列を使うのが素直な方法です。
呼び出し側は次のように書きます。
<?php
get_template_part(
'template-parts/card',
null,
array(
'post_id' => get_the_ID(),
'show_date' => true,
'title_tag' => 'h3',
)
);
受け取る側の template-parts/card.php では、$args という変数名でその配列を使えます。
<?php
// template-parts/card.php
$defaults = array(
'post_id' => get_the_ID(),
'show_date' => false,
'title_tag' => 'h2',
);
$args = wp_parse_args( $args, $defaults );
// 見出しタグは許可したものだけにする
$title_tag = in_array( $args['title_tag'], array( 'h2', 'h3', 'h4' ), true ) ? $args['title_tag'] : 'h2';
$post_id = (int) $args['post_id'];
?>
<article class="card">
<<?php echo $title_tag; ?> class="card__title">
<a href="<?php echo esc_url( get_permalink( $post_id ) ); ?>">
<?php echo esc_html( get_the_title( $post_id ) ); ?>
</a>
</<?php echo $title_tag; ?>>
<?php if ( $args['show_date'] ) : ?>
<time datetime="<?php echo esc_attr( get_the_date( 'c', $post_id ) ); ?>">
<?php echo esc_html( get_the_date( '', $post_id ) ); ?>
</time>
<?php endif; ?>
</article>
このコードの要点は3つあります。
wp_parse_args()で既定値と合わせておくと、呼び出し側が一部のキーを省略しても警告が出ない- 見出しタグのように出力にそのまま使う値は、許可リストで絞ってから出力する
- URLは
esc_url()、テキストはesc_html()、属性はesc_attr()でエスケープする。$argsの中身は呼び出し側から自由に渡せるので、パーツ側で安全に扱う
第2引数を使わない場合は null を渡します。空文字 '' でも同じ動作になりますが、null のほうが意図が伝わりやすくなります。
つまずきやすいポイント
呼び出し元の変数はパーツ側で使えない
get_template_part() で読み込まれたファイルは関数の中で実行されるため、呼び出し元で定義したローカル変数は見えません。$my_var を定義してからパーツを呼んでも、パーツ側では未定義になります。値は $args で渡してください。
一方、the_post() でセットされた投稿データは、get_the_title() や the_permalink() などのテンプレートタグからそのまま使えます。ループ内でカードを出すだけなら、$args を渡さなくても動くのはこのためです。
拡張子やパスの書き方
$slug に .php を付けると、card.php.php のような存在しないファイルを探してしまいます。先頭にスラッシュを付けたり、get_template_directory() で得たサーバー上のフルパスを渡したりするのも誤りです。テーマのルートからの相対パスだけを書きます。
戻り値で読み込みの成否を確認する
WordPress 5.5以降、get_template_part() はファイルが見つからなかったときに false を返します。開発中は次のように確かめると、ファイル名の誤りにすぐ気づけます。
<?php
if ( false === get_template_part( 'template-parts/card', null, array( 'show_date' => true ) ) ) {
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
error_log( 'template-parts/card.php が見つかりません' );
}
}
どのファイルが使われるかだけを知りたい場合は、locate_template( array( 'template-parts/content-news.php', 'template-parts/content.php' ) ) を実行すると、見つかったファイルのフルパスが返ります。見つからなければ空文字です。
フックで読み込みに処理を挟む
get_template_part() は、ファイルを探す前に2つのアクションフックを実行します。
get_template_part_{$slug}:特定のスラッグに対してだけ実行される。引数は$slug、$name、$argsget_template_part:すべての呼び出しで実行される。引数は$slug、$name、$templates(探すファイル名の配列)、$args
たとえば、開発中にどのパーツが呼ばれているかをログに残すには次のように書けます。
<?php
// 子テーマの functions.php(開発環境でのみ使う)
add_action( 'get_template_part', function ( $slug, $name, $templates, $args ) {
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
error_log( 'get_template_part: ' . implode( ', ', $templates ) );
}
}, 10, 4 );
これらはアクションなので、読み込むファイル自体を差し替えることはできません。ファイルを差し替えたい場合は、子テーマに同名のファイルを置くのが正攻法です。
ブロックテーマの場合
サイトエディターで編集するブロックテーマでは、ヘッダーやフッターは parts/ フォルダーのHTMLファイルとして管理され、テンプレートからはテンプレートパーツブロックで呼び出します。get_template_part() はPHPのテンプレートファイルを読み込む関数なので、ブロックテーマのテンプレートパーツとは仕組みが別です。ブロックテーマのパーツをPHPから出力したい場合は block_template_part() という別の関数があります。クラシックテーマとブロックテーマを併用する構成は、各関数の公式リファレンスで最新の対応状況を確認してください(2026年10月現在)。
まとめ
get_template_part( $slug, $name, $args )でテーマの部品を読み込む。$slugは拡張子なしの相対パス$nameを指定すると{$slug}-{$name}.phpを先に探し、なければ{$slug}.phpを使う- 探す順番はファイル名ごとに子テーマ→親テーマ。子テーマで上書きするなら同じファイル名で置く
- 5.5以降は第3引数
$argsで配列を渡し、パーツ側では$argsで受け取る。wp_parse_args()で既定値と合わせ、出力時はエスケープする - 呼び出し元のローカル変数はパーツ側で見えないので、値は
$argsで渡す - 5.5以降は見つからないと
falseを返す。locate_template()で使われるファイルを確認できる