はじめに
WordPressのオリジナルテーマ開発をしていて、page.phpやindex.phpといったテンプレートファルではfunction.phpで宣言したグローバル変数使えるのに、 get_template_parts()
で呼び出しているテンプレートパーツファイル内ではグローバル変数が使えない!という現象に悩まされたので、なんとなくコード書いちゃう仲間に向けて
現象が起きるコード
現象が起きる状態はこんな感じ
// function.php
// 前後省略...
$GlobalText = 'テキスト';
// 前後省略...
// テンプレートファイル(page.phpとか)
// 前後省略...
echo $GlobalText; // ○ 表示される
// 前後省略...
// テンプレートパーツファイル(get_template_parts()で呼び出して使うファイル)
// 前後省略...
echo $GlobalText; // × 表示されない
// 前後省略...
解決方法
グローバル変数をテンプレートファイルで使えるようにするには次のように呼び出します
// テンプレートパーツファイル(get_template_parts()で呼び出して使うファイル)
// 前後省略...
global $GlobalText
echo $GlobalText;
// 前後省略...
PHPをちゃんと学んでいる人からすると「あーね」となる感じがしますね。
グローバル変数は、どの関数からも呼び出すことができますが、関数で使う際はglobalという宣言をする必要があります。それを知っていればなんとなく想像ついたんだろう!
テンプレートファイルとテンプレートパーツで呼び出し方に違いが出た理由は、テンプレートファイルとテンプレートパーツのファイルの読み込み方法の違いに起因しています。
WordPressはテンプレートファイルを読み込む際に、自動的にfunctions.php
を読み込み、その中で定義されたグローバル変数や関数が使用可能になります。
テンプレートファイルではWordPressが自動的にfunctions.php
を読み込むため、グローバル変数や関数を直接使用できます。
一方、get_template_part()
で呼び出したテンプレートパーツは個別のファイルとして扱われ、functions.php
が読み込まれないためglobal
キーワードを使って明示的に宣言する必要があります。
おわりに
言語理解はしてないんだけど調べながらなんとなく動くものは書ける!状態なのでPHPをわかっていればすぐに辿り着けそうな解決方法でした。
// function.php
$GlobalText = 'テキスト'
function sampleFunc2(){
global $GlobalText2;
$GlobalText2 = 'テキスト2'
}
function sampleFunc(){
echo $GlobalText; // 「Undefined variable '$GlobalText'.」というエラーが出る
echo $GlobalText2 // 同じくエラーが出る
}
globalという書き方が存在すること自体はよくわかんないけど知っていました。
globalで書けばグローバル変数になってどこでも使える変数になるという理解。
で、解決のために色々試しているうちに上のコードを書いてみたら自分の理解ではどこでも呼び出せるはずのグローバル変数が未定義と言われる…で、これはglobalの理解がおかしいかもとなって解決のきっかけになりました。