UPDATE: Meine ursprüngliche Frage wurde gelöst, aber dies wird zu einer gültigen Diskussion darüber, warum keine globalen Variablen verwendet werden sollten. Ich aktualisiere die Frage daher, um dies widerzuspiegeln. Die Lösung war <?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
wie @TomJNowell vorgeschlagen.
UPDATE 2: Ich habe jetzt genau das getan, was ich wollte. Aber ich benutze immer noch globale Möglichkeiten und würde gerne einen besseren Weg finden.
Ich versuche, eine ganze Reihe globaler Variablen für die Permalinks zu Kategorien einzurichten, die an verschiedenen Stellen in meinem Thema verwendet werden sollen. Der Hauptgrund dafür ist die Verwendung sowohl in der Hauptnavigation als auch in einer Reihe von Unternavigationen, die anhand der Kategorie ausgewählt werden, in der sich der aktuelle Beitrag befindet. Dies ist kein Thema, das ich für die Verwendung durch andere freigeben werde. sondern ist für einen ganz bestimmten Zweck gebaut.
So erstelle ich sie gerade (ich habe nur einige Variablen eingefügt).
function set_global_nav_var()
{
//proposal
global $prop;
// Get the ID of a given category
$category_id_prop = get_cat_ID( 'proposal' );
// Get the URL of this category
$category_link_prop = get_category_link( $category_id_prop );
$prop = '<a href="' .esc_url( $category_link_prop ). '" title="Proposal">Proposal</a>';
//Calvinball
global $cb;
// Get the ID of a given category
$category_id_cb = get_cat_ID( 'calvinball' );
// Get the URL of this category
$category_link_cb = get_category_link( $category_id_cb );
$cb = '<a href="' .esc_url( $category_link_cb). '" title="Calvinball">Calvinball</a>';
}
add_action( 'init', 'set_global_nav_var' );
Ich kann jetzt an den <?php global $prop; echo $prop; ?>
4 Stellen, die gehen und den gesamten Link für den Code zurückbekommen. Wenn sich das ändert, muss ich es nur an einer Stelle ändern. Ich bin offen für Alternativen, die nicht den globalen Geltungsbereich betreffen.
Antworten:
Ich rate zwar dringend davon ab und es wird die Dinge nicht beschleunigen, aber Ihre Verwendung ist falsch.
Wenn Sie versuchen, ein globales Schlüsselwort zu verwenden, müssen Sie zuerst das globale Schlüsselwort angeben. Sie haben es hier bei der Definition des Werts angegeben, aber außerhalb dieses Bereichs muss es als globale Bereichsvariable neu deklariert werden.
zB in functions.php:
In single.php funktioniert das nicht:
Weil $ hello undefiniert ist. Dies jedoch wird funktionieren:
Natürlich solltest du beides nicht tun. WordPress versucht bereits, diese Dinge im Objekt-Cache zwischenzuspeichern. Sie werden dabei keine Geschwindigkeitssteigerung bemerken (es kann sein, dass die Geschwindigkeit geringfügig abnimmt). Sie werden lediglich zusätzliche Komplexität und die Notwendigkeit erhalten, viele globale Deklarationen einzugeben, die nicht erforderlich sind.
Sie sollten strukturierte Daten wie Objekte oder Abhängigkeitsinjektionen oder in Ihrem Fall eine Reihe von Funktionen verwenden.
Zum Beispiel ist hier ein Mittel, um etwas Ähnliches über statische Variablen zu tun (immer noch schlecht aus den gleichen Gründen, aber nur ein kleines bisschen weniger und einfacher zu tippen), z
Wenn Sie wirklich Zeit sparen möchten, indem Sie Daten an einem Ort speichern, den Sie wiederverwenden möchten, sollten Sie das
WP_Cache
System mitwp_cache_get
usw. Verwendenquelle
<?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
nach Ihrem Vorschlag mache . Vielen Dank!Verwenden Sie keine so einfachen globalen Variablen .
Warum nicht Globals verwenden?
Weil die Verwendung von Globals die langfristige Wartung der Software erschwert.
Der WordPress-Kern hat viel zu viel Gebrauch von Globalen. Beim Versuch zu verstehen, wie grundlegende Funktionen
the_content
funktionieren, stellen Sie plötzlich fest, dass die$more
Variable nicht lokal, sondern global ist. Sie müssen die gesamten Kerndateien durchsuchen, um zu verstehen, wann sie auf true gesetzt ist.Was kann also getan werden, wenn versucht wird, das Kopieren und Einfügen mehrerer Codezeilen zu beenden, anstatt das Ergebnis der ersten Ausführung in einem globalen Code zu speichern? Es gibt verschiedene Ansätze, funktionale und OOP.
Die Süßstofffunktion. Es ist einfach ein Wrapper / Makro zum Speichern des Copy / Paste
Die Vorteile sind, dass es jetzt eine Dokumentation zu den Aufgaben des früheren globalen Systems gibt und Sie einen offensichtlichen Punkt für das Debuggen haben, wenn der zurückgegebene Wert nicht der erwartete Wert ist.
Sobald Sie einen Süßstoff haben, können Sie das Ergebnis bei Bedarf einfach zwischenspeichern (tun Sie dies nur, wenn Sie feststellen, dass die Ausführung dieser Funktion lange dauert).
Auf diese Weise haben Sie dasselbe Verhalten wie bei einem globalen Server, haben jedoch den Vorteil, dass Sie bei jedem Zugriff eine sichere Initialisierung haben.
Sie können ähnliche Muster mit OOP haben. Ich finde, dass OOP in Plugins und Themes normalerweise keinen Mehrwert bringt, aber das ist eine andere Diskussion
Dies ist ein umständlicher Code, aber wenn Sie mehrere Werte haben, die Sie vorberechnen möchten, weil sie immer verwendet werden, kann dies ein langer Weg sein. Grundsätzlich ist dies ein Objekt, das alle Ihre globalen Elemente auf organisierte Weise enthält. Um zu vermeiden, dass eine Instanz dieses Objekts global wird (Sie möchten nur eine Instanz, ansonsten berechnen Sie die Werte neu), möchten Sie möglicherweise ein Singleton-Muster verwenden (einige Leute behaupten, es sei eine schlechte Idee, YMMV).
Ich greife nicht gerne direkt auf ein Objektattribut zu, daher verzerrt es in meinem Code weiter
quelle
Ihre Frage beschäftigt sich mit der Funktionsweise von PHP.
Nehmen Sie als Beispiel $ wpdb
$ wpdb ist eine bekannte globale Variable.
Wissen Sie, wann es deklariert und mit Werten belegt wird?
Jede Seite wird geladen , ja, jedes Mal, wenn Sie Ihre WordPress-Site besuchen.
Ebenso müssen Sie sicherstellen, dass die Variablen, die globalisiert werden sollen, deklariert und auf jeder geladenen Seite mit entsprechenden Werten belegt werden.
Obwohl ich kein Theme-Designer bin, kann ich sagen, dass after_setup_theme ein einmaliger Hook ist. Es wird nur ausgelöst, wenn das Thema aktiviert ist.
Wenn ich du wäre, würde ich Init oder andere Haken verwenden. Nein, wenn ich Sie wäre, würde ich überhaupt keine globalen Variablen verwenden ...
Ich bin wirklich nicht gut darin, Dinge zu erklären. Sie sollten sich also ein Buch zulegen, wenn Sie sich mit PHP befassen möchten.
quelle
Sie können immer ein Singleton-Muster über statische Getter verwenden.
quelle