かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

WordPress ネストしてるテンプレートに変数を渡したい

普段 React とかでフロントエンドをやってます。たまに WordPress の案件があると PHP タグが大量に埋め込まれたテンプレートめっちゃ見通し悪いな…となりついテンプレートを分割しまくってしまいます。その際に React で言う所の props みたいに inclide 元のファイルから変数を渡したい時に 2回くらいググってしまったのでメモして残しておきます。(どうせ忘れる自分用のメモ)

環境

1. global な変数で渡してしまう

分割したファイルを include すると読み込み位置と同じスコープになるので、読み込み元の変数がそのまま使える

<?php // 親テンプレート
$foo = 'MY STARWAY';
include_once( __DIR__ . '/path/to/template.php');
<?php // 読み込まれるファイル
echo $foo;
// => "MY STARWAY"

正直 include したファイルで突然定義してない変数が出てきて見通しが良くないように感じる…
他にも同じスコープになるので読み込んだファイルで変数を変更すると、予期しないバグを発生させる温床にもなりうる

<?php // 読み込まれるファイル
$foo = 'TRAVEL RIBBON';
<?php // 親テンプレート
$foo = 'MY STARWAY';
include_once( __DIR__ . '/path/to/template.php');
echo $foo;
// => "TRAVEL RIBBON"

2. get_template_part の第三引数で変数を渡す

get_template_part( string $slug, string $name = null, array $args = array() ): void|false
  • 第三引数に配列形式で値を渡せる
  • 渡した値は $args という配列に格納される
<?php // 親テンプレート
$foo = 'MY STARWAY';
get_template_part('path/to/template', null, ['foo' => $foo]);
<?php // 読み込まれるファイル
$my_foo = $args['foo'] ?: '';
echo $my_foo;
// => "MY STARWAY"

get_template_part で渡した変数は別参照になるので安全

<?php // 読み込まれるファイル
$my_val = $args['foo'] ?: 'default';
$unit = $args['unit'] ?: [];

$foo = 'TRAVEL RIBBON';
$unit[] = ['akari'];
<?php // 親テンプレート
$foo = 'MY STARWAY';
$unit = ['ichigo', 'aoi', 'ran'];
get_template_part('path/to/template', null, ['foo' => $foo, 'unit' => $unit]);
echo $foo;
// => "MY STARWAY"
var_dump($unit);
// array(3) { [0]=> "ichigo" [1]=> "aoi" [2]=> "ran" }

まとめ

WordPress のテーマでテンプレートを分割して分割したテンプレートに呼び出し元から変数を渡したい場合は公式の get_template_part を使うのがパスの問題も無く意図しない変数の上書きもないので良さそうです!


[参考]

アイカツ!未来へのSTARWAY 全人類見てください!