get_template_part()で呼び出したテンプレートに変数を渡す方法

  • WordPress

WordPress のget_template_part()は、PHP の include などと違って呼び出し側で定義した変数を参照することができません。そのため、グローバル変数である$wp_queryに値を渡してそこから参照できるようにします。

(2021/2)WordPress 5.5 以上から、get_template_part() の引数で変数を渡すことができるようになりました。その方法も解説します。

今回は例として、example.phpというテンプレートを呼び出し、その中から呼び出し側にある変数を参照できるようにします。

WordPress バージョン 5.5 以上:get_template_part() の引数を使う

5.5 以上であれば、get_template_part()の第三引数 $args を渡すことができます。

get_template_part() | Function | WordPress Developer Resources

呼び出し側

get_template_part()の第三引数に配列を渡します。

// テンプレート読み込み
$args = [
  'example_string' => 'てきとうな文字',
  'example_array' => [1, 2, 3],
];
get_template_part('example', null, $args);

今回は呼び出しファイル名が example.php という名前のため第二引数は null としていますが、example-hoge.php などであれば、

get_template_part('example', 'hoge', $args);

になります。

テンプレート側

変数 $args を読み込み、値を取り出すだけです。

<?php
  echo $args['example_string']; // てきとうな文字
  echo implode(',', $args['example_array']); // 1,2,3

変数名は get_template_part()側で $args という名前で定義したからではなく、どう渡してもこちら側は $args という変数名で受け取ります。

WordPress バージョン 5.5 未満:set_query_var() を使う

呼び出し側

// 変数をセットする
set_query_var('example_variable', 'てきとうな文字');

// テンプレート読み込み
get_template_part('example');

set_query_var()

set_query_var()で、グローバル変数$wp_query->query_varsの配列に値を追加することができます。ここでは'てきとうな文字'という文字列をセットしていますが、配列や数値など他の型も渡せます。

※注意点として、query_varsにセットされているキー名被らないキー名を使います。下記を参照するか、var_dump($wp_query->query_vars)を確認してください。

https://wpdocs.osdn.jp/WordPress_Query_Vars

テンプレート側

// 値を取得
$example_variable = get_query_var('example_variable');

// 出力
echo $example_variable;

get_query_var()

テンプレート(ここでは example.php )側では、get_query_var()を使って値を取得します。この例では先ほど定義したexample_variableを取得しているので、'てきとうな文字'が表示されるはずです。

直接参照する

詳細は追えていないのですが、get_query_var()を使わなくても、get_template_part()で呼び出したテンプレ側では、$wp_query->query_varsのが全て変数として定義されているようです。

先ほどの例だと、get_query_var()を使わなくても下記だけで呼び出せます。

echo $example_variable;

とはいえテンプレート側だけ見ると、定義していない変数を使っているように見えてわかりにくいので、get_query_vars()で取得を明示した方がわかりやすいかなという気がします。

注意点

あくまで$wp_queryの値を参照しているので、セットした後にメインクエリを書き換えると呼び出せません。

// 値をセット
set_query_var('hoge', 'てきとうな文字');

// メインクエリを書き換え
query_posts('post_type=post');

// example テンプレート呼び出し
// ※だが、先ほどセットした hoge は呼び出すことができない
get_template_part('example');

query_posts()では、グローバル変数$wp_queryを書き換えてしまうので、最初にセットしたhogeはなかったことになります。一番最初のメインクエリには、wp_reset_query()で戻すことができるので、その後でテンプレートを呼び出します。

// 値をセット
set_query_var('hoge', 'てきとうな文字');

// メインクエリを書き換え
query_posts('post_type=post');

... なんかいろんな処理 ...

// メインクエリを元に戻す
wp_reset_query();

// example テンプレート呼び出し
get_template_part('example');