web-dev-qa-db-ja.com

プラグイン内でのグローバル変数の使用

私は今までに最初のプラグインを作成していて、同じページのさまざまな部分で同じオプション変数を呼び出す必要があることに気づいたので、解決策を探し、自分のために機能しているグローバル変数を見つけました。記事の人々はグローバル変数の使用に反対しているようであり、そしてまた、私がそれらを正しい方法で使用しているかどうかは全くわかりません。

これは私が持っているものです。

/************************
* Variables
************************/
global $bClass, $cClass, $dClass, $cExpiry;
       $bClass = $cClass = $dClass = $cExpiry =  get_option('myoption');

それから私は単一のオプションを使用して関連する変数を配列に保存するので、このような値をエコーし​​ます。

jquery

expires: <?php global $cExpiry; echo $cExpiry['cExpiry']; ?>,

それから私はそれを同じページ内の他の機能でも使うでしょう。

だから、それは私のために動作しますが、私はそれを正しくやっているかどうかまだ疑問に思っています。

update 説明のおかげで、私はローカル変数を使うことになり、自分のコードに間違いを見つけました。

すべての変数が単一のオプションに保存されているので、単一のローカル変数を使用しました。

$options = get_option('myoption');

それから変数を大括弧で囲むことで配列にアクセスできます。

<?php echo $options['var1']; ?>

私は以前は$bClass = $cClass = $dClass = $cExpiry = get_option('myoption');をやっていましたが、悪いことです。

2
David Garcia

これより簡単な方法があります。 @Wyckが既にグローバルを使うのは悪い考えであると述べているので、ここで簡単な説明とその方法は:

なぜグローバルが悪いのか

1)誰でもどこからでもアクセスできます。最初はこれはいいですね。でも、以下のようにすることもできます。

// Your code: default value
global $foo;
$foo = 'bar';

// User setting:
global $foo;
$foo = get_option( 'baz' );

// Later in your code
if ( 'bar' === $foo )
    // do something important

// Now I, the end user, do this in a template
// or Ernie, the novice developer, does this in his 3rd party plugin:
$GLOBALS['foo'] = 42;

そして突然何も期待通りに動作しません。それは簡単です:グローバルは傍受される可能性があります。それらは競合しないわけではなく、誰もそれらが含んでいるものを確認することはできませんever

2)それらがオンザフライで変更できることがわかった後、それらは予測不可能であることがわかります。もしあなたがそれらをあなたのIDE(例えばPHPStorm、Eclipse/Aptanaなど)でさかのぼって追跡したいのであれば、あなたは彼らのOriginがどこにあるのか、正確にどこに変更されるのかを知ることはないでしょうあなたはかなりの間座って、BreakpointsのようなものやXDebugのようなものを使い、あなたのやり方を知っています。

3)もっと書く必要がありますか?そうではないと思います。

結論:ほとんどのオプションはオートロードされているので、それらは各ページ/リクエストに既に存在しており、グローバルにラップする必要はありません。必要なときはいつでもget_option()を呼び出してください。

PHPからJSにデータを移動する方法

そのままで簡単: wp_localize_script()

例:(login_enqueue_scriptsおよびadmin_enqueue_scriptsフックと一緒にも使用できます)

add_action( 'wp_enqueue_scripts', 'wpse115840_scripts' );
function wpse115840_scripts()
{
    wp_enqueue_script( 'wpse_handle', etc... );
    // Here goes the magic:
    wp_localize_script( 'wpse_handle', 'wspeObject', array(
        'foo' => 'bar',
        'bar' => get_option( 'baz' )
    ) );
}

これで、登録したばかりのJavaScriptファイル内のwp_localize_script()配列(3番目の引数)から、単にwpseObjectを呼び出すことで、すべてのデータにアクセスできます。次の例では、barという値になります。

console.log( wpseObject.foo );

そしてあなたのwpseObject.barはあなたのbaz設定値を保持するでしょう。

5
kaiser