2026年5月24日

2026年5月24日

WordPressのget_template_partが読み込まれない・失敗するときの原因と対処法

WordPressの get_template_part() が失敗するとき、ほとんどの原因は「指定したパスにファイルが無い(と WordPress が判断している)」か「ファイルは読み込まれているが、中で変数やエラーの問題が起きている」のどちらかです。get_template_part() はファイルが見つからなくてもエラーを出さずに何も表示しないため、原因が見えにくいのが特徴です。この記事では、関数がファイルを探す仕組みを押さえたうえで、よくある失敗パターンと、どのファイルを探したかをログに出して切り分ける方法を解説します。

get_template_part がファイルを探す仕組み

まず、関数の仕様を正確に押さえておきます。

get_template_part( string $slug, string $name = null, array $args = array() );

たとえば get_template_part( 'template-parts/content', 'page' ) と書くと、WordPress は次の順でファイルを探します。

  1. template-parts/content-page.php
  2. template-parts/content.php

最初に見つかったファイルが1つだけ読み込まれます。探す場所は、内部で使われている locate_template() によって決まり、子テーマのフォルダー → 親テーマのフォルダーの順です。子テーマを使っていない場合は、有効なテーマのフォルダーだけが対象です。

ポイントは次の3つです。

  • $slug と $name はテーマのフォルダーからの相対パスで、拡張子 .php は付けません。
  • $name は「あれば優先するバリエーション」で、見つからなければ $slug だけのファイルにフォールバックします。
  • WordPress 5.5 以降では、ファイルが見つからなかったときに false を返します。見つかった場合は何も返しません。

よくある失敗パターン

拡張子 .php を付けている

// 誤り: content.php.php を探してしまう
get_template_part( 'template-parts/content.php' );

// 正しい書き方
get_template_part( 'template-parts/content' );

WordPress が .php を自動で付け足すため、拡張子を書くと content.php.php を探すことになります。最も多い間違いの1つです。

フルパス(サーバー上の完全なパス)を渡している

get_template_directory() . '/template-parts/content' のようにフルパスを渡すと、テーマのフォルダーの後ろにさらにフルパスがつながったパスを探すことになり、見つかりません。get_template_part() に渡すのはテーマからの相対パスだけです。テーマ外のファイルを読み込みたい場合は、get_template_part() ではなく require などを使います。

大文字・小文字やフォルダー名の違い

ローカル環境(WindowsやmacOSの標準設定)ではファイル名の大文字・小文字を区別しないことが多く、Content.php を content で呼んでも動いてしまいます。ところが多くの本番サーバー(Linux)は区別するため、アップロードした途端に読み込まれなくなります。「ローカルでは動くのに本番で表示されない」ときは、まずここを疑ってください。template-parts と template-part、parts と part のようなフォルダー名の1文字違いもよくあります。

子テーマに置いたつもりが親テーマを見ている(またはその逆)

子テーマで上書きしたいときは、親テーマと同じ相対パスで子テーマにファイルを置く必要があります。親テーマが template-parts/content.php を読み込んでいるのに、子テーマ直下に content.php を置いても使われません。

逆に、子テーマに古いコピーが残っていると、親テーマを更新しても子テーマ側のファイルが優先されて変更が反映されません。親テーマの更新後に表示がおかしい場合は、子テーマに同名ファイルが残っていないかを確認します。

ブロックテーマの HTML テンプレートパーツを呼ぼうとしている

Twenty Twenty-Four などのブロックテーマでは、ヘッダーやフッターのテンプレートパーツは parts/header.html のような HTML ファイルです。get_template_part() は PHP ファイルしか探さないため、これらは読み込めません。PHP から HTML のテンプレートパーツを出力したい場合は、WordPress 5.9 で追加された block_template_part() を使います。

// parts/header.html を出力する
block_template_part( 'header' );

プラグインの中から呼んでいる

get_template_part() が探すのはテーマのフォルダーだけです。プラグインのフォルダーにあるファイルを指定しても見つかりません。プラグインで「テーマに同名ファイルがあればそれを使い、無ければプラグイン内のファイルを使う」ようにしたい場合は、locate_template() で探してから、見つからなければプラグイン内のファイルを読み込む形にします。

$template = locate_template( 'myplugin/card.php' );
if ( '' === $template ) {
	$template = plugin_dir_path( __FILE__ ) . 'templates/card.php';
}
load_template( $template, false );

ファイルは読み込まれているのに表示がおかしい場合

ファイルの場所が正しくても、次の理由で「失敗したように見える」ことがあります。

呼び出し元の変数が使えない

get_template_part() で読み込んだファイルは関数の中で実行されるため、呼び出し元で定義したローカル変数は見えません。

// 呼び出し元
$label = 'おすすめ';
get_template_part( 'template-parts/card' ); // card.php の中で $label は未定義になる

WordPress 5.5 以降なら、第3引数 $args で値を渡せます。読み込まれたファイルの中では $args という配列として受け取ります。

// 呼び出し元
get_template_part( 'template-parts/card', null, array( 'label' => 'おすすめ' ) );
<?php
// template-parts/card.php
$label = isset( $args['label'] ) ? $args['label'] : '';
?>
<span class="card-label"><?php echo esc_html( $label ); ?></span>

出力するときは esc_html() などでエスケープします。$args に入る値が投稿者や利用者の入力に由来する場合もあるので、テンプレート側でエスケープしておくのが基本です。

なお、ループ内で使う the_title() や get_the_ID() などのテンプレートタグは、グローバルな $post を参照するため、$args で渡さなくても使えます。

テンプレートパーツの中でPHPエラーが起きている

読み込まれたファイルの中で致命的なエラーが起きると、その位置から先が表示されなかったり、画面が真っ白になったりします。wp-config.php でデバッグログを有効にして、エラーの内容を確認します。

// wp-config.php(「編集が必要なのはここまでです」の行より上に書く)
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

エラーは wp-content/debug.log に記録されます。本番環境で調査する場合は、画面には表示させず(WP_DEBUG_DISPLAY を false)、確認が終わったら WP_DEBUG を元に戻してください。

キャッシュで古い表示が残っている

ファイルを修正しても表示が変わらないときは、ページキャッシュ系のプラグインやサーバーのキャッシュ、PHPのOPcacheが古い結果を返している可能性があります。キャッシュを削除してから確認します。

どのファイルを探したかをログに出して切り分ける

原因が分からないときは、WordPress が実際にどのファイル名を探したかを記録すると早く切り分けられます。get_template_part() は、ファイルを探す前に get_template_part アクションを実行し、探す候補のファイル名を渡しています(WordPress 5.2 以降)。これを使って、見つからなかったものだけをログに出します。

// 子テーマの functions.php(調査が終わったら削除する)
add_action( 'get_template_part', function ( $slug, $name, $templates, $args ) {
	if ( defined( 'WP_DEBUG' ) && WP_DEBUG && '' === locate_template( $templates ) ) {
		error_log( '[template part not found] ' . implode( ', ', $templates ) );
	}
}, 10, 4 );

この状態でページを表示すると、見つからなかったテンプレートパーツが debug.log に template-parts/content.php.php のような形で記録されます。記録されたファイル名と、実際のファイルの場所・名前を見比べれば、拡張子の重複や大文字・小文字の違いがすぐに分かります。

呼び出し側で個別に確認したい場合は、戻り値を使うこともできます。

if ( false === get_template_part( 'template-parts/content', get_post_type() ) ) {
	error_log( 'content template part not found for post type: ' . get_post_type() );
}

ログに何も出ないのに表示されない場合は、ファイルは見つかって読み込まれていることになるので、前述の変数やPHPエラー、キャッシュの方向に調査を進めます。

まとめ

  • get_template_part( $slug, $name ) は {$slug}-{$name}.php → {$slug}.php の順に、子テーマ → 親テーマの順で探し、見つからなくてもエラーは出しません。
  • 失敗の多くは、拡張子 .php の付与、フルパスの指定、大文字・小文字の違い、子テーマでの置き場所の違いです。
  • ブロックテーマの HTML パーツは block_template_part()、プラグイン内のファイルは locate_template() と load_template() で扱います。
  • 変数は第3引数 $args(WordPress 5.5 以降)で渡し、テンプレート側でエスケープします。
  • get_template_part アクションでログを取ると、どのファイルを探して失敗したかを特定できます(2026年10月現在の WordPress の仕様にもとづきます)。

お気軽にご相談ください

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