web-dev-qa-db-ja.com

WordPressテーマ変数のスコープ

WordPressテーマのテンプレートファイル(index.php、header.phpなど)全体にアクセスできる変数を作成する必要があります。関数定義はfunctions.phpテンプレートファイルの中(あなたのテーマパスの中)にあることを私は知っていますが、変数のためのそのようなことはありません。

たとえば、私はテーマのカテゴリを常に取得する必要があるので、テーマのどこからでもアクセスできるようにしたいと思います。

$categories = get_categories(); /* get_categories() is a wordpress function */ 

こうすれば、カテゴリを取得するたびにデータを再割り当てする必要なく、割り当てられたデータに簡単にアクセスできます。

残念ながら、そのコードを私のfunctions.phpファイルに追加してもうまくいきません。また、変数globalも作成できません。

8
Luca Matteis

どうやらglobalがうまくいきます。問題は、私の変数$categoriesは、その前にglobalを付けて再定義されていなければならなかったことです。

5
Luca Matteis

ドミニク(彼の答えにメモを追加する方法がわからない):

defineはスカラしか受け付けないので、define( CATS, get_categories() );やできないことさえできませんでした

$categories = get_categories();
define( CATS, $categories );

それ以外の場合、defineは問題なく動作しますが、実際にはスカラーに対してより安全です(定数が上書きされないことを確認できるため)。

1
fritzfromlondon

これも動作します:

functions.phpにdefine('TEST', 'this is a test');を追加
そしてあなたのheader.phpかなんでもecho TEST;

ある方法に他の方法よりも優れたパフォーマンス上の利点はありますか?

0
Dominic

私はこれが本当に古いことを知っています、しかし改良の余地があります。

グローバルではなく$ GLOBALS ['categories']を使用することを検討してください。

これには2つの理由があります。

  1. 毎回global $categories;を書く必要はありません。
  2. それは明らかであり、それから我々はグローバルを使用していて、そうではない。

このコードを見てください:

global $categories;

// a lot of PHP code here

<?php print_r ($categories) ?>

変数を使用する直前にグローバル状態を初期化した場合にのみ、グローバルかどうかを判断するのはかなり困難です。そして、あなたが持っているテンプレートファイルのいずれかでそれを繰り返すことを忘れないでください。

命名規則を使用することは可能ですが、私の意見ではもっと良い方法があります。

$GLOBALS['categories']の使用を検討してください。

global $categoriesをもう一度考えなくても、functions.phpで変数を一度初期化するだけです。そしてそれはグローバルなものであることがわかります。

print_r ($GLOBALS['categories']);

このような状況では、パフォーマンスの問題はまったく問題になりません。 Sara Golemon( リンク )を引用します。

これは、$ GLOBALS配列を使用することにとってどういう意味ですか?そう、グローバルキーワードは技術的に速いのです。今、私はここで一つのことについて本当に明確にしたいと思います。グローバルをローカライズされた[コンパイル済み変数]として使用することで得られるマイナーなスピードアフォーダンスは、5年間でコードを見ることと$ fooがグローバルスコープから来たことを知っていることの保守性に対して真剣に検討する必要があります。 something_using($ GLOBALS ['foo']);グローバルな$ fooよりもずっと明確になるでしょう。/*バンチャコード*/something_using($ foo);ペニー賢くてバカにならないでください。

0
Keeprock