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' ) の場合、探す順番は次のとおりです。

  1. 子テーマの template-parts/content-news.php
  2. 親テーマの template-parts/content-news.php
  3. 子テーマの template-parts/content.php
  4. 親テーマの 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、$args
  • get_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() で使われるファイルを確認できる

お気軽にご相談ください

お見積りへ お問い合わせへ
▲