load_template と get_template_part の 違い

load_template と get_template_part は、どちらもテンプレートを読み込む関数なんですが、はっきり違いを書いてあるサイトが見つからなかったので、このエントリに記載することにします。

load_template とは

概要

指定されたテンプレートを読み込みます。require_onceかどうかは引数で指定できます。テンプレートはページでもパーツでもOKです。テンプレートは絶対パスで指定します。また、次のグローバル変数が割り当てられます。

$posts, $post, $wp_did_header, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;

また、ソースを読み込む際は、require または require_once 関数を介して直接読み込まれます。

ソース:https://developer.wordpress.org/reference/functions/load_template/

使い方:https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/load_template

ファイルが存在しない場合

ファイルが存在しない場合はエラーになります。phpエアーを表示しないように設定しているサーバでは画面が真っ白になったりすることがあります。

get_template_part とは

概要

テンプレートパーツを読み込みます。ある程度自動で検索して、最高優先度のテンプレートファイルを読み込みます。子テーマのファイルで親テーマを上書きできます。グローバル変数はロードされません。

ソース:https://developer.wordpress.org/reference/functions/get_template_part/

使い方:https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_template_part

テンプレートを読み込む際には、 locate_template 関数を用いて読み込まれます。

参考:locate_template

ソース:https://developer.wordpress.org/reference/functions/locate_template/

使い方:https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/locate_template

自動検索の例(親テーマを使っている場合)

使用中のテーマが親テーマの場合は次のように検索します。

<?php
// 使い方
get_template_part( $slug );
// $slug が指定されていた時:
//  →
[テーマフォルダ]/{$slug}.php を読み込み
?>

<?php
// 使い方
get_template_part( $slug, $name );
// $slug と $name が指定されていた時:
//  → [テーマフォルダ]/{$slug}-{$name}.php を読み込み
?>

自動検索の例(子テーマを使っている場合)

子テーマを使っている場合、読み込む順番は、先に使用中のテーマ(子テーマ)内を検索して、次に親テーマ内を検索します。

以下のような使い方をした場合、次のような優先順位で自動検索されます。もし、ファイルが存在しない場合は何もしません。(エラーにならないので気が付かないことがあるので注意。)
<?php get_template_part( 'myslug', 'myname' ); ?>

  1. [子テーマのフォルダ]/myslug-myname.php
  2. [親テーマのフォルダ]/myslug-myname.php
  3. [子テーマのフォルダ]/myslug.php
  4. [親テーマのフォルダ]/myslug.php

ファイルが存在しない場合

ファイルが存在しない場合には何も起こりません。(エラーになりません。)このため、問題に気が付かなかったり、「書いたのに上手く動かない」と感じることがあるので注意が必要です。

用途ごとでの使い分けについて

どちらもよく似ている関数ですが以下のような感じで使い分けると良いと思います。

load_template を使うシーン

  • 高速で読み込みたい。
  • グローバル変数を宣言無しで使いたい。
  • 独自テーマなど、子テーマによる上書きを許可したくない(許可しなくてもいい)。
  • ファイルが存在しない場合はエラーになった方がいい。

get_template_part を使うシーン

  • 状況に応じて読み込むテンプレートをある程度自動化したい。
  • グローバル変数は自分で宣言する必要あり(例: global $post;)。
  • 子テーマによる上書きを許可したい(販売用テーマや汎用テーマにおいて親テーマとして使いまわしたいとき)。
  • ファイルが存在しなくてもそのまま処理を続行したいとき。

質問・コメントなどあると嬉しいです