Отображение переменной, хранящейся в functions.php внутренний виджет
Я пытаюсь отобразить переменную, которая хранится в моем functions.php файл - ради вопроса эта переменная хранится как $test = 'test';
. Когда я использую echo $test
внутри page.php, header.php или любой другой файл, значение возвращается, однако, когда я пытаюсь сделать то же самое внутри виджета (я использую плагин, который позволяет выполнять PHP внутри виджета), ничего не происходит.
Есть идеи относительно того, как я мог бы обойти это?
1 answers
Виджет работает в другой области , чем functions.php
.
Вы могли бы использовать два разных подхода, чтобы обойти это.
-
Сделайте переменную глобальной (поместите ее в верхнюю область видимости):
// functions.php $GLOBALS['var_name'] = 'hello'; // widget echo $GLOBALS['var_name'];
Но это рискованно: любой другой скрипт может теперь случайно изменить переменную, и это очень сложно отладить.
-
Создайте специальный класс или функцию для переменной. Вы даже можете использовать один класс или функция для хранения множества значений. Пример:
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' );