The widget operates in a different scope than the functions.php
.
You could use two different approaches to get around that.
-
Make the variable global (put it into the top scope):
// functions.php $GLOBALS['var_name'] = 'hello'; // widget echo $GLOBALS['var_name'];
But that is risky: any other script can change the variable now accidentally, and it is very hard to debug this.
-
Create a special class or function for the variable. You could even use one class or function to store many values. Example:
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; } }
In your
functions.php
, you can create an object now and add a value:$theme_data = new Theme_Data(); $theme_data->set( 'default_posts_in_news_widget', 10 );
In your widget, you can get that object and the stored value:
// 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;
You can even create multiple independent
Theme_Data
objects for different purposes, just create them with different$filter
strings:$widget_data = new Theme_Data( get_template() . '_widgets' ); $customizer_data = new Theme_Data( get_template() . '_customizer' );