WordPressテーマ変数スコープ


9

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

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

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

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

残念ながら、そのコードをfunctions.phpファイルに追加しても機能せず、変数も作成されませんglobal

回答:


5

どうやらglobalトリックを行います。問題は、変数を使用するために必要な各テンプレートで、変数$categoriesをその前に再定義するglobal必要があることでした。


2
すべてのテンプレートファイルでグローバルとして再定義する必要があるよりも直感的なソリューションを知っている人はいますか?私は自分のテーマを開発する際にこの方法を使用していますが、見た目が…場違いです。

1
素晴らしい男、ありがとう!私のように少し厚い、これを準備している人のために:functions.phpファイル内:<?php $ test = "I'm a test!"; ?>ヘッダーのphp:<?php global $ test; echo $ test; ?>そして、あなたは黄金です!
ドミニク

ワードプレスでのテンプレートファイルがすべてで呼ばれています。これは明確にすることができます場合はrequire()関数内にラップされている文:get_header()get_footer()など。それ自体が関数のラッパーget_template_part()です。PHPの関数は、その中で定義された変数または変数への参照によって渡された変数にのみアクセスできるため、グローバルスコープの変数を使用する(または変数を定義してグローバルスコープでアクセス可能にする)場合は、それを通知する必要があります。グローバル最初のキーワード。
goldenapples

1

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

defineはスカラーのみを受け入れるため、実行できず define( CATS, get_categories() );

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

それ以外の場合、defineは正常に機能し、実際にはスカラーの方が安全です(定数を上書きできないことが確認できるため)。


1

これは本当に古いのですが、改善の余地があります。

グローバルだけでなく、$ 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で変数を1回だけ初期化する必要があります。そして、それはグローバルなものであることがわかります。

print_r ($GLOBALS['categories']);

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

$ GLOBALS配列を使用する意味は何ですか?そうです、グローバルキーワードは技術的に高速です。さて、ここで1つ明確にしたいことがあります。ローカライズされた[コンパイルされた変数]としてグローバルを使用することで得られるマイナースピードアフォーダンスは、5年間でコードを調べ、$ fooがグローバルスコープからのものであることを知る保守性と真剣に比較検討する必要があります。something_using($ GLOBALS ['foo']); グローバルな$ fooよりも、いつの日かはっきりします。/ * bunchaコード* / something_using($ foo); ペニー賢く、ばかげたことはありません。


0

これも機能します:

functions.phpに追加define('TEST', 'this is a test');
して、header.phpまたはその他にecho TEST;

ある方法が他の方法よりも優れている点はありますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.