サポート » テーマ » functions.phpで宣言した変数をfooter.php等で参照したい

  • 解決済 luminums

    (@luminums)


    はじめまして。
    最近スキンを触り始めたばかりで、わからないところが出てきたので質問します。

    1.試してみたこと
    えーと、
    functions.php に例えば $aaa という変数を宣言して、その変数に「あ」と代入し、
    footer.php で echo $aaa; してブログトップにアクセスしたところ全く反応しませんでした(宣言されてないのかな・・・)。
    index.php に echo $aaa; と同じように記述してみたところ表示されました。

    ■functions.php

    <?php
    $aaa = "あ";
    ?>

    ■footer.php

    <?php
    echo $aaa;
    ?>

    ■index.php(表示されました)

    <?php
    echo $aaa;
    ?>

    という感じです。

    2.質問の内容
    footer.phpやsidebar.phpなどに宣言した変数の表示する方法を教えて下さい。
    (たぶん何か勘違いしていると思うので、テーマの仕組みとか動きとか詳しく教えていただけると嬉しいです)。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • footer.php はどのようにしてるんですか?
    同じくsidebar.phpは?

    たんに、index.phpにそれらが読み込まれていないだけではありませんか?
    簡単なテーマを眺めてみるといいと思います。

    モデレーター jim912

    (@jim912)

    luminumsさん、こんにちは。

    phpでは、変数のスコープと言って、通常、関数内で使われる変数は、それ以外の箇所では参照できません。

    footer.phpや、header.php、sidebar.php、loop.phpは、load_template関数内でrequire(読み込み)がなされるため、index.phpなどとは、スコープが異なるわけです。

    これを回避するためには、この変数は関数外でも有効という宣言をする必要があります。

    global $aaa;

    これをfooter.phpの最初にでも記述すれば、footer.phpでも表示できるかと思います。
    ただし、1点注意があり、WordPressでは、幾つか独自で使ってしまうと不具合が発生する変数名があります。($postなど他多数)

    自分固有の変数を使う場合は、接頭辞を付けWordPress本体やプラグインが利用する変数と被らないよう注意が必要です。

    >kvexさん早速の回答ありがとうございます。
    index.phpにfooter.phpは読み込まれているのでそちらの記述は問題ないようでした。

    >jim912さん回答ありがとうございます。
    なるほど、やはりそういった理由で変数にアクセスできてなかったようですね・・・。
    ということは、おっしゃるとおりWordpressで予め宣言・予約されている名称に注意しつつ接頭辞をつけるなりしてglobalで宣言してみます。

    ためしてみたところ、global宣言しただけでは動きませんでした。
    footer.phpに同じ変数名で
    global $aaa; と宣言したところ、functions.phpで代入していた値が参照できました。

    ただこの動きは非常に不思議な感じです・・・。

    ■functions.php
    <?php
    global $aaa;
    $aaa = “あ”;
    ?>

    ■footer.php
    <?php
    global $aaa;
    echo $aaa;
    ?>

    上のようなコードでないと参照できなかったです。
    functions.phpで宣言しているはずなのに、footer.phpでも同じように宣言しないと参照できなかったのがよくわからなかったです。ん~・・・。

    なんでもないphpで、同じ構造でincludeした場合はこのような宣言をしなくても参照できたので不思議。

    このような宣言をしないと参照できないものなのでしょうか・・・。いまいちスキンの動きが読めません。
    このあたりご存知であれば教えていただけますか?

    まず最初に
    私は、functionの中で使ってるのだと思って勘違いしていましたごめんなさい。

    それと、変数のスコープについてはjim912さんの説明のとおりなので、疑問を持つと言うより「そういうもんだ」と覚えてください。

    さて、global の使い方を間違っています。

    footer.phpに同じ変数名で
    global $aaa; と宣言したところ、functions.phpで代入していた値が参照できました。

    そういうことです。それをjim912さんが説明してくれています。

    使いたいほうで宣言してください。

    モデレーター jim912

    (@jim912)

    luminumsさん、こんにちは。

    最初にglobal宣言をした方が逆ですw
    functions.phpの関数外は、スコープで言うと一番トップレベルの階層で、ここをグローバル領域といいます。ここでは、宣言をせずとも変数はグローバル変数となります。

    一方、footer.phpでは、load_template関数内での実行となるため、グローバル領域の変数を参照するためには、宣言が必要なのです。

    footer.phpでも宣言を書かないのに$postが使えたりすることを不思議に思うかもしれませんが、これは、load_template関数内に

    global $posts, $post, $wp_did_header, $wp_did_template_redirect, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;

    と宣言が書かれているためです。

    >kvexさん
    >jim912さん
    下手な質問ばっかりしてすみません。

    何度か回答を読んでいたらなんとなく意味が分かってきました。
    globalはfunctions.phpで宣言しないとだめなのかと思っていました。宣言する場所が逆っていうのはそういう意味ですよね・・・?

    グローバルな変数として利用するにはその利用する領域(footer.php)で宣言すればいいわけですね。

    >さて、global の使い方を間違っています。

    footer.phpに同じ変数名で
    global $aaa; と宣言したところ、functions.phpで代入していた値が参照できました。

    二重でなんで宣言するんだろうと思っていたんです・・・。

    >kvexさん
    >jim912さん
    丁寧に教えていただき本当感謝してます。

    まだ、何か解釈が間違っていそうであればよろしくお願いします。

    そういうことです!

    「こっちで使わせてくれぃ!」 という感じで宣言します。

    > そういうことです!
    > 「こっちで使わせてくれぃ!」 という感じで宣言します。
    ありがとうございます!安心しました。

    これで楽しいことができそうです^^

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「functions.phpで宣言した変数をfooter.php等で参照したい」には新たに返信することはできません。