web-dev-qa-db-fra.com

Afficher une variable stockée dans functions.php à l'intérieur du widget

J'essaie d'afficher une variable qui est stockée dans mon fichier functions.php. Pour les besoins de la question, cette variable est stockée sous le nom $test = 'test';. Quand j'utilise echo $test dans page.php, header.php ou tout autre fichier, la valeur est renvoyée, mais lorsque j'essaie de faire la même chose dans un widget (j'utilise un plugin qui permet l'exécution de PHP à l'intérieur un widget) rien ne se passe.

Des idées sur la façon dont je pourrais contourner cela?

3
Nikki Mather

Le widget opère dans un scope différent du functions.php.

Vous pouvez utiliser deux approches différentes pour résoudre ce problème.

  1. Rendez la variable globale (placez-la dans le top scope):

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

    Mais cela est risqué: tout autre script peut changer la variable maintenant par accident, et il est très difficile de résoudre ce problème.

  2. Créez une classe ou une fonction spéciale pour la variable. Vous pouvez même utiliseroneclass ou function pour stocker de nombreuses valeurs. Exemple:

    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;
        }
    }
    

    Dans votre functions.php, vous pouvez créer un objet maintenant et ajouter une valeur:

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

    Dans votre widget, vous pouvez obtenir cet objet et la valeur stockée:

    // 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;
    

    Vous pouvez même créer plusieurs objets Theme_Data indépendants à des fins différentes. Créez-les simplement avec différentes chaînes $filter:

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