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');