Ich habe eine Variable in header.php, wie zum Beispiel:
$page_extra_title = get_post_meta($this_page->ID, "_theme_extra_title", true);
Sobald ich tun:
var_dump($page_extra_title);
Ich komme immer NULL
außerhalb von header.php (var_dump funktioniert nur in header.php richtig). Ich habe dieselbe Variable überall dort eingefügt, wo ich sie benötige (page.php, post.php, footer.php usw.), aber das ist Wahnsinn und macht es fast unmöglich, alles zu pflegen.
Ich frage mich, wie ich eine Variable am besten durch alle Dateien in meinem Design leiten kann. Ich vermute, dass die Verwendung von functions.php zusammen mit "get_post_meta" nicht die beste Idee ist. :)
global
, oder? Aber es kommt aus guten Gründen nicht in Frage. Außerdem müssen Sie auchglobal
Variablen "aufrufen" , indem Sie das Schlüsselwort verwenden, um sie verfügbar zu machen. Je nach Anwendungsfall Sitzungen könnte eine Lösung sein. Ansonsten - wie bereits erwähnt - denke ich, dass eine Funktion oder eine Klasse, die den Job für Sie erledigt, der richtige Weg ist.Antworten:
Grundlegende getrennte Datenstrukturen
Um Daten weiterzugeben, verwenden Sie normalerweise ein Modell (das ist das "M" in "MVC"). Schauen wir uns eine sehr einfache Schnittstelle für Daten an. Schnittstellen werden nur als "Rezepte" für unsere Bausteine verwendet:
Oben ist, was wir herumreichen: Eine gemeinsame ID und ein "Label".
Anzeigen von Daten durch Kombinieren von Atomteilen
Als nächstes benötigen wir eine Ansicht , die zwischen unserem Modell und ... unserer Vorlage verhandelt.
Grundsätzlich sagt diese Schnittstelle
Schließlich müssen wir oben implementieren und die tatsächliche Ansicht erstellen . Wie Sie sehen, gibt der Konstruktor an, dass für unsere Ansicht eine Vorlage obligatorisch ist und dass wir sie rendern können. Um die Entwicklung zu vereinfachen, prüfen wir sogar, ob die Vorlagendatei tatsächlich vorhanden ist, damit wir anderen Entwicklern das Leben (und auch uns) erheblich erleichtern und dies beachten können.
In einem zweiten Schritt der Render-Funktion verwenden wir ein Closure , um den eigentlichen Template-Wrapper und
bindTo()
das Model für das Template zu erstellen .Ansicht und Rendering trennen
Dies bedeutet, dass wir eine sehr einfache Vorlage wie die folgende verwenden können
um unsere Inhalte zu rendern. Wenn wir die Teile zusammenfügen, erhalten wir etwas in den folgenden Zeilen (in unserem Controller, Mediator usw.):
Was haben wir gewonnen?
Auf diese Weise können wir
Kombination von OOP PHP mit der WP API
Natürlich ist dies kaum möglich , wie grundlegende Theming - Funktionalität
get_header()
,get_footer()
etc., nicht wahr? Falsch. Rufen Sie einfach Ihre Klassen in der gewünschten Vorlage oder im gewünschten Vorlagenteil auf. Rendern Sie es, transformieren Sie die Daten und machen Sie, was Sie wollen. Wenn Sie wirklich nett sind, fügen Sie einfach Ihre eigenen benutzerdefinierten Filter hinzu und lassen Sie sich von einem Unterhändler anzeigen, was von welchem Controller auf welcher Route bzw. mit welcher bedingten Vorlage gerendert wird.Fazit?
Sie können problemlos mit den oben genannten Inhalten in WP arbeiten und sich dennoch an die grundlegende API halten und Code und Daten wiederverwenden, ohne ein einzelnes Global aufzurufen oder den globalen Namensraum zu beschädigen und zu verschmutzen.
quelle
Dies ist ein alternativer Ansatz zu @kaiser answer, den ich als ziemlich gut befunden habe (+1 von mir), der jedoch zusätzliche Arbeit erfordert, um mit den WP-Kernfunktionen verwendet zu werden, und der per se in die Vorlagenhierarchie integriert ist.
Der Ansatz, den ich teilen möchte, basiert auf einer einzelnen Klasse (es ist eine abgespeckte Version von etwas, an dem ich arbeite), die sich um das Rendern von Daten für Vorlagen kümmert.
Es hat einige (IMO) interessante Funktionen:
$this
Schlüsselwörtern auf Variablen zu. Dadurch haben Sie die Möglichkeit, bei nicht definierten Variablen Benachrichtigungen in der Produktion zu vermeidenDie
Engine
Klasse(Hier als Gist erhältlich .)
Wie benutzt man
Sie müssen nur die
Engine::init()
Methode aufrufen , wahrscheinlich'template_redirect'
aufgelegt. Dies kann über ein Themefunctions.php
oder über ein Plugin erfolgen.Das ist alles.
Ihre vorhandenen Vorlagen funktionieren wie erwartet. Jetzt haben Sie jedoch die Möglichkeit, auf benutzerdefinierte Vorlagendaten zuzugreifen.
Benutzerdefinierte Vorlagendaten
Um benutzerdefinierte Daten an Vorlagen zu übergeben, gibt es zwei Filter:
'gm_template_data'
'gm_template_data_{$type}'
Der erste wird für alle Vorlagen ausgelöst, der zweite ist vorlagenspezifisch. Der dynamische Teil
{$type}
ist der Basisname der Vorlagendatei ohne Dateierweiterung.Mit dem Filter
'gm_template_data_single'
können zB Daten an diesingle.php
Vorlage übergeben werden.Die an diese Hooks angehängten Rückrufe müssen ein Array zurückgeben , wobei die Schlüssel die Variablennamen sind.
Beispielsweise können Sie Metadaten wie folgt als Vorlagendaten übergeben:
Und dann können Sie innerhalb der Vorlage einfach Folgendes verwenden:
Debug-Modus
Wenn sowohl die Konstanten
WP_DEBUG
alsWP_DEBUG_DISPLAY
auch wahr sind, arbeitet die Klasse im Debug-Modus. Dies bedeutet, dass eine Ausnahme ausgelöst wird, wenn keine Variable definiert ist.Wenn sich die Klasse nicht im Debug-Modus befindet (wahrscheinlich in der Produktion), wird beim Zugriff auf eine undefinierte Variable eine leere Zeichenfolge ausgegeben.
Datenmodelle
Eine schöne und verwaltbare Möglichkeit, Ihre Daten zu organisieren, ist die Verwendung von Modellklassen.
Dies können sehr einfache Klassen sein, die Daten mit den oben beschriebenen Filtern zurückgeben. Es gibt keine bestimmte Benutzeroberfläche, sie kann nach Ihren Wünschen organisiert werden.
Unten sehen Sie nur ein Beispiel, aber Sie können es auf Ihre eigene Weise tun.
Die
__invoke()
Methode (die ausgeführt wird, wenn eine Klasse wie ein Rückruf verwendet wird) gibt eine Zeichenfolge zurück, die für das<title>
Tag der Vorlage verwendet werden soll.Dank der Tatsache, dass das zweite übergebene Argument
'gm_template_data'
der Vorlagenname ist, gibt die Methode einen benutzerdefinierten Titel für die Homepage zurück.Mit dem obigen Code ist es dann möglich, so etwas zu verwenden
im
<head>
Abschnitt der Seite.Teilstücke
WordPress verfügt über Funktionen wie
get_header()
oderget_template_part()
die zum Laden von Partials in die Hauptvorlage verwendet werden können.Diese Funktionen können, genau wie alle anderen WordPress-Funktionen, in Vorlagen verwendet werden, wenn die
Engine
Klasse verwendet wird.Das einzige Problem ist, dass in den mit den WordPress-Kernfunktionen geladenen Partials die erweiterte Funktion zum Abrufen benutzerdefinierter Vorlagendaten nicht verwendet werden kann
$this
.Aus diesem Grund verfügt die
Engine
Klasse über eine Methodepartial()
, mit der ein Teil geladen werden kann (vollständig untergeordnetes Thema) und die benutzerdefinierten Vorlagendaten weiterhin in Teilbereichen verwendet werden können.Die Verwendung ist ziemlich einfach.
Angenommen, es gibt eine Datei mit dem Namen
partials/content.php
im Ordner theme (oder child theme), kann sie mit folgendem Befehl eingefügt werden:Innerhalb dieses Teils ist der Zugriff auf alle übergeordneten Themendaten auf dieselbe Weise möglich.
Im Gegensatz zu WordPress-Funktionen können mit dieser
Engine::partial()
Methode bestimmte Daten an Partials übergeben werden, indem einfach ein Array von Daten als zweites Argument übergeben wird.Standardmäßig haben Partials Zugriff auf Daten, die im übergeordneten Design verfügbar sind, und auf Daten, die explizit übergeben wurden.
Wenn eine explizit an partial übergebene Variable denselben Namen wie eine übergeordnete Designvariable hat, gewinnt die explizit übergebene Variable.
Es ist jedoch auch möglich, einen Teil im isolierten Modus einzuschließen, dh der Teil hat keinen Zugriff auf übergeordnete Themendaten. Übergeben Sie dazu einfach
true
das dritte Argument anpartial()
:Fazit
Auch wenn es ziemlich einfach ist, ist der
Engine
Unterricht ziemlich vollständig, kann aber sicherlich weiter verbessert werden. ZB gibt es keine Möglichkeit zu überprüfen, ob eine Variable definiert ist oder nicht.Dank seiner 100% igen Kompatibilität mit WordPress-Funktionen und Vorlagenhierarchie können Sie es problemlos in vorhandenen Code und Code von Drittanbietern integrieren.
Beachten Sie jedoch, dass dies nur teilweise getestet wurde. Möglicherweise gibt es Probleme, die ich noch nicht entdeckt habe.
Die fünf Punkte unter "Was haben wir gewonnen?" in @kaiser Antwort :
sind auch für meine Klasse gültig.
quelle
Einfache Antwort: Übergeben Sie keine Variablen, da es stinkt, als würden Sie globale Variablen verwenden, was böse ist.
Deinem Beispiel nach scheint es so, als würdest du versuchen, eine frühe Optimierung vorzunehmen, noch ein Übel;)
Verwenden Sie die WordPress-API, um Daten abzurufen, die in der Datenbank gespeichert sind, und versuchen Sie nicht, deren Verwendung zu überlisten und zu optimieren, da die API nicht nur Werte abruft und Filter und Aktionen aktiviert. Durch Entfernen des API-Aufrufs entfernen Sie die Fähigkeit anderer Entwickler, das Verhalten Ihres Codes zu ändern, ohne ihn zu ändern.
quelle
Obwohl Kaisers Antwort technisch richtig ist, bezweifle ich, dass es die beste Antwort für Sie ist.
Wenn Sie ein eigenes Thema erstellen, ist dies meiner Meinung nach der beste Weg, ein Framework mithilfe von Klassen einzurichten (und möglicherweise auch Namespaces und Interfaces, obwohl dies für ein WP-Thema möglicherweise etwas zu viel ist).
Wenn Sie jedoch nur ein vorhandenes Thema erweitern / anpassen und nur eine oder mehrere Variablen übergeben müssen, sollten Sie sich meiner Meinung nach daran halten
global
. Daheader.php
in einer Funktion enthalten ist, können die Variablen, die Sie in dieser Datei deklarieren, nur in dieser Datei verwendet werden. Mitglobal
machen Sie sie im gesamten WP-Projekt zugänglich:In
header.php
:In
single.php
(zum Beispiel):quelle
$wp_theme_vars_page_extra_title
oder$wp_theme_vars['page_extra_title']
zum Beispiel. Es war nur eine Erklärung, warum global hier funktionieren würde. OP hat nach einer Möglichkeit gefragt, wie eine Variable durch alle Dateien geleitet werden kannglobal
.but it is really bad practice diving into the global scope
Ich wünschte, jemand hätte das den Entwicklern von WP Core erzählt. Ich verstehe den Sinn der Verwendung von Namespaces, Datenabstraktion, Entwurfsmustern, Komponententests und anderen bewährten Methoden / Techniken für die Programmierung in Code, der für Wordpress geschrieben wurde, nicht, wenn der Wordpress-Kern mit schlechten Codierungsmethoden wie glabalen Variablen (z. B. den Widgets) übersät ist Code).Eine einfache Lösung besteht darin, eine Funktion zu schreiben, um den zusätzlichen Titel zu erhalten. Ich verwende eine statische Variable, um nur einen Datenbankaufruf zu speichern. Gib das in deine functions.php ein.
Rufen Sie außerhalb von header.php die Funktion auf, um den Wert zu erhalten:
quelle