Umfang der WordPress-Theme-Variablen

9

Ich muss eine Variable erstellen, auf die in allen meinen WordPress Theme-Vorlagendateien (index.php, header.php usw.) zugegriffen werden kann. Ich weiß, dass Funktionsdefinitionen in der functions.phpVorlagendatei (in Ihrem Themenpfad) enthalten sind, aber für Variablen gibt es so etwas nicht.

Zum Beispiel muss ich ständig Kategorien in meinem Thema abrufen, daher möchte ich, dass diese von überall in meinem Thema zugänglich sind:

$categories = get_categories(); /* get_categories() is a wordpress function */ 

Auf diese Weise kann ich einfach auf zugewiesene Daten zugreifen, ohne sie jedes Mal neu zuweisen zu müssen, wenn ich meine Kategorien abrufen muss.

Leider functions.phpfunktioniert das Hinzufügen dieses Codes in meiner Datei nicht und das Erstellen der Variablen auch nicht global.

Gonçalo Peres 龚燿禄
quelle

Antworten:

5

Anscheinend globalmacht der Trick. Das Problem war, dass meine Variable mit einem vorangestellten in jeder Vorlage, die ich verwenden musste, neu definiert werden $categoriessollte .global


quelle
2
Kennt jemand eine intuitivere Lösung, als sie in jeder Vorlagendatei als global neu definieren zu müssen? Ich benutze diese Methode bei der Entwicklung meines Themas und es sieht ... fehl am Platz aus.
1
Super Kerl, danke! Für alle, die bereit sind, die ein bisschen dick sind wie ich: In Ihrer Datei functions.php: <? Php $ test = "Ich bin ein Test!"; ?> In Ihrer, ich weiß nicht, header.php: <? Php global $ test; echo $ test; ?> und du bist golden!
Dominic
Wenn dies hilft zu klären: alle der Template - Dateien in Wordpress durch genannt werden require()Aussagen , die in Funktionen eingewickelt werden: get_header(), get_footer(), etc; die selbst sind Wrapper um die Funktion get_template_part(). Da Funktionen in PHP nur Zugriff auf die darin definierten oder als Referenz übergebenen Variablen haben, müssen Sie diese ankündigen, wenn Sie eine Variable aus dem globalen Bereich verwenden möchten (oder eine Variable definieren und im globalen Bereich zugänglich machen möchten) mit dem globalen Schlüsselwort zuerst.
Goldenapples
1

Dominic (weiß nicht, wie er seiner Antwort eine Notiz hinzufügen soll):

define akzeptiert nur Skalare, also kannst du es nicht define( CATS, get_categories() ); und nicht einmal

$categories = get_categories();
define( CATS, $categories );

Andernfalls funktioniert define einwandfrei und ist für Skalare sogar sicherer (da Sie sicher sein können, dass die Konstanten nicht überschrieben werden können).


quelle
1

Ich weiß, dass dieser wirklich alt ist, aber es gibt Raum für Verbesserungen.

Sie sollten in Betracht ziehen, $ GLOBALS ['Kategorien'] anstelle von nur global zu verwenden.

Dafür gibt es zwei Gründe:

  1. Wir müssen nicht global $categories;jedes Mal schreiben .
  2. Es ist kristallklar, dann verwenden wir global und dann nicht.

Betrachten Sie diesen Code:

global $categories;

// a lot of PHP code here

<?php print_r ($categories) ?>

Nur wenn wir den globalen Status direkt vor der Verwendung der Variablen initialisieren, ist es ziemlich schwer zu sagen, ob er global ist oder nicht. Und vergessen Sie nicht, es in einer Ihrer Vorlagendateien zu wiederholen.

Es ist möglich, dafür Namenskonventionen zu verwenden, aber meiner Meinung nach gibt es einen besseren Weg.

Erwägen Sie die Verwendung $GLOBALS['categories'].

Wir müssen unsere Variable nur einmal in functions.php initialisieren, ohne global $categorieserneut darüber nachdenken zu müssen . Und wir können sehen, dass es global ist.

print_r ($GLOBALS['categories']);

Leistungsprobleme sind in dieser Situation überhaupt kein Problem. Ich zitiere Sara Golemon ( Link ):

Was bedeutet das für Ihre Verwendung des $ GLOBALS-Arrays? Richtig, das globale Schlüsselwort ist technisch schneller. Jetzt möchte ich eines wirklich klarstellen. Die geringe Geschwindigkeitssteigerung, die durch die Verwendung Ihrer Globals als lokalisierte [kompilierte Variablen] erzielt wird, muss ernsthaft gegen die Wartbarkeit abgewogen werden, Ihren Code in fünf Jahren zu betrachten und zu wissen, dass $ foo aus dem globalen Bereich stammt. Something_using ($ GLOBALS ['foo']); wird Ihnen auf der ganzen Linie IMMER klarer sein als global $ foo; / * Bunda-Code * / Something_using ($ foo); Sei nicht penny-weise und Pfund dumm ..

Keeprock
quelle
0

Dies funktioniert auch:

in functions.php hinzufügen define('TEST', 'this is a test');
und in Ihrer header.php oder was auch immerecho TEST;

Gibt es einen Leistungsvorteil bei einer Methode gegenüber einer anderen?

Dominic
quelle