web-dev-qa-db-de.com

Anzeige einer in functions.php gespeicherten Variablen im Widget

Ich versuche, eine Variable anzuzeigen, die in meiner Datei functions.php gespeichert ist. Aus Gründen der Frage wird diese Variable als $test = 'test'; gespeichert. Wenn ich echo $test innerhalb von page.php, header.php oder einer anderen Datei verwende, wird der Wert zurückgegeben, wenn ich jedoch versuche, dasselbe innerhalb eines Widgets zu tun (ich verwende ein Plugin, das die Ausführung von PHP innerhalb von ermöglicht ein Widget) passiert nichts.

Irgendwelche Ideen, wie ich das umgehen könnte?

3
Nikki Mather

Das Widget arbeitet in einem anderen Bereich als der functions.php.

Sie können zwei verschiedene Ansätze verwenden, um das zu umgehen.

  1. Machen Sie die Variable global (fügen Sie sie in den oberen Bereich ein):

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

    Aber das ist riskant: Jedes andere Skript kann die Variable jetzt versehentlich ändern, und es ist sehr schwer, dies zu debuggen.

  2. Erstellen Sie eine spezielle Klasse oder Funktion für die Variable. Sie können sogaroneclass oder function verwenden, um viele Werte zu speichern. Beispiel:

    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 Ihrem functions.php können Sie jetzt ein Objekt erstellen und einen Wert hinzufügen:

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

    In Ihrem Widget können Sie das Objekt und den gespeicherten Wert abrufen:

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

    Sie können sogar mehrere unabhängige Theme_Data -Objekte für unterschiedliche Zwecke erstellen. Erstellen Sie sie einfach mit unterschiedlichen $filter -Zeichenfolgen:

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