普段 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
を使うのがパスの問題も無く意図しない変数の上書きもないので良さそうです!
[参考]
- get_template_part() | Function | WordPress Developer Resources
- PHPにおける変数のスコープと静的変数――「バグの温床」としないための使い方:Web業界で働くためのPHP入門(10)(1/2 ページ) - @IT
- phpで共通パーツをincludeする際に相対パスで記述する方法(ついでにcurrentも付与) | oku-log
- 似てるようで違う、PHPのエルビス演算子とNull合体演算子 - Qiita