テンプレート内で$postが使えなくなる点について
-
立て続けにすいません、内容が別なのでトピックを建て直させていただきました。
たとえば、single.phpや、page.phpなどで、
$post->ID などのように、$postを利用している場合、YASAKANI Cacheの設定で、ページキャッシュを有効にすると、$post が Null になってしまいます。そこで、
global $post;
を$postをつかう前に入れると、問題なくなります。
現状はこれで解決しているのですが、プラグイン側で対策できればいいな、と思いました。
WordPress テーマのテンプレートファイルの呼び出し方の違いが影響しているようなのですが、原因がわかりません
Yasakaniキャッシュでは、single.php や page.php などのテンプレートファイルの呼び出し処理部を ob_start() と ob_get_clean() を使ってバッファリングして、その出力データをキャッシュとして保存しています。
このバッファリング処理でグローバル変数が破棄されるような挙動となってしまっているようです
グローバル宣言をテンプレート内で宣言していない一部のテーマの場合はご指摘のように問題が起こる場合がありますが、テンプレートファイル内で、きちんとグローバル宣言してから変数を使っている多くのテーマ(テンプレート)では問題なく Yasakani キャッシュを使っていただいていると思っています
プラグイン側での対策ができればよいのですが、現時点では対応方法がわからないので何か情報があれば教えて下さい m(__)m
グローバル宣言してから変数を使っている多くのテーマ(テンプレート)では問題なく Yasakani キャッシュを使っていただいていると思っています
なるほど。
たまたまうまく動いていただけで、本来はグローバル宣言してからつかうべきなのですね。よくわかりました。
もし、他になにかわかればお知らせします。
ありがとうございます。
たまたま動いているは、ちょっと言いすぎかも
例えば $a とグローバル宣言してあるファイルから、include でテンプレートファイルを読み込んだ時に、そのテンプレートファイル内で(関数内でなく)$a 変数を参照すればグローバルスコープの変数として扱われると書かれているので、別ファイルになっていても暗黙の内にグローバルとして扱われるようです
ただ、ob_start でバッファリングした時は、何故かその暗黙のグローバルスコープとして継承されずに、未初期化のグローバル変数と見なされてしまうような感じです
何故そうなるのか、私の処理でなにか抜けているのか、そこはよくわかりません (^_^;)
ただ、明示的にグローバルと宣言してあげれば、きちんと扱えますので、今のところは暗黙のグローバルスコープの継承に頼らずに明示的に再度ファイル内でグローバル宣言が必要になってしまっているということです
従って、このような問題が起こる可能性もあるので、プログラムを別ファイルに分けた場合には、念のため明示的にグローバル宣言をしておくほうが良いようです