Отображение переменной, хранящейся в functions.php внутренний виджет


Я пытаюсь отобразить переменную, которая хранится в моем functions.php файл - ради вопроса эта переменная хранится как $test = 'test';. Когда я использую echo $test внутри page.php, header.php или любой другой файл, значение возвращается, однако, когда я пытаюсь сделать то же самое внутри виджета (я использую плагин, который позволяет выполнять PHP внутри виджета), ничего не происходит.

Есть идеи относительно того, как я мог бы обойти это?

Author: Brad Dalton, 2014-02-07

1 answers

Виджет работает в другой области , чем functions.php.

Вы могли бы использовать два разных подхода, чтобы обойти это.

  1. Сделайте переменную глобальной (поместите ее в верхнюю область видимости):

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

    Но это рискованно: любой другой скрипт может теперь случайно изменить переменную, и это очень сложно отладить.

  2. Создайте специальный класс или функцию для переменной. Вы даже можете использовать один класс или функция для хранения множества значений. Пример:

    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
Author: fuxia, 2014-02-07 20:13:45