web-dev-qa-db-ja.com

Widget内のfunctions.phpに格納されている変数を表示する

私のfunctions.phpファイルの中に格納されている変数を表示しようとしています - 問題のために、この変数は$test = 'test';として格納されています。 page.php、header.php、その他のファイルの中でecho $testを使うと、ウィジェットの中で同じことをしようとすると値が返されます(PHP insideの実行を許可するプラグインを使っています)ウィジェット)何も起こりません。

私はこれを回避する方法についてのアイデアはありますか?

3
Nikki Mather

ウィジェットはfunctions.phpとは異なる スコープ で動作します。

これを回避するには、2つの異なる方法を使用できます。

  1. 変数をグローバルにします(トップスコープに入れます)。

    // functions.php
    $GLOBALS['var_name'] = 'hello';
    
    // widget
    echo $GLOBALS['var_name'];
    

    しかし、それは危険です。他のスクリプトは変数を誤って変更する可能性があり、これをデバッグするのは非常に困難です。

  2. 変数用の特別なクラスまたは関数を作成します。多くの値を格納するためにoneクラスや関数を使うことさえできます。例:

    class Theme_Data
    {
        private $data = array();
    
        public function __construct( $filter = 'get_theme_data_object' )
        {
            add_filter( $filter, array ( $this, 'get_instance' ) );
        }
    
        public function set( $name, $value )
        {
            $this->data[ $name ] = $value;
        }
    
        public function get( $name )
        {
            if ( isset ( $this->data[ $name ] ) )
                return $this->data[ $name ];
    
            return NULL;
        }
    
        public function get_instance()
        {
            return $this;
        }
    }
    

    functions.phpでは、今すぐオブジェクトを作成して値を追加することができます。

    $theme_data = new Theme_Data();
    $theme_data->set( 'default_posts_in_news_widget', 10 );
    

    ウィジェットでは、そのオブジェクトと保存されている値を取得できます。

    // widget
    $theme_data = apply_filters( 'get_theme_data_object', NULL );
    
    if ( is_a( $theme_data, 'Theme_Data' ) )
        $num = $theme_data->get( 'default_posts_in_news_widget' );
    else
        $num = 5;
    

    目的に応じて複数の独立したTheme_Dataオブジェクトを作成することもできます。異なる$filter文字列を使用してそれらを作成するだけです。

    $widget_data     = new Theme_Data( get_template() . '_widgets' );
    $customizer_data = new Theme_Data( get_template() . '_customizer' );
    
3
fuxia