Angenommen, Sie müssen Javascript oder CSS-Code generieren, der vom aktuellen Kontext abhängt.
Zum Beispiel haben Sie ein Formular auf der Homepage, das eine Ajax-Anfrage beim Senden auslöst, und ein anderes Formular auf der einzelnen Seite. Oder im Fall von CSS möchten Sie ein Thema erstellen, mit dem Benutzer ihr eigenes Layout erstellen, Farben ändern usw. können.
Bisherige Lösungen:
Fügen Sie den Code in den Kopfteil des Dokuments ein (oder am Ende bei JS)
Führen Sie eine spezielle Anforderung durch, die den Code ausgibt, z . B. site.com?get_assets . Dies ist langsam, da WP zweimal geladen wird.
Speichern Sie es für eine bestimmte Zeit in temporären Dateien und laden Sie es von dort. Nicht sehr zuverlässig für öffentliche Themen oder Plugins.
Nur Javascript - machen Sie es statisch, indem Sie es in eine normale Datei packen, die jedes Mal geladen wird. In diesem Fall müssten Sie Ihren Code in jede Situation bringen
Kennst du andere Welchen Weg würdest du gehen?
quelle
Antworten:
Eine zusätzliche Option, abhängig von der Art der Parameter, die Sie übergeben müssen. Nennen wir es (2a). Sie können auch PHP-Skripte erstellen, die dynamisch generiert
text/css
odertext/javascript
nicht generiert werdentext/html
, und ihnen die Daten bereitstellen, die sie mithilfe von GET-Parametern benötigen, anstatt WordPress zu laden. Dies funktioniert natürlich nur, wenn Sie eine relativ kleine Anzahl relativ kompakter Parameter übergeben müssen. Angenommen, Sie müssen nur die URL eines Posts oder das Verzeichnis einer Datei o.ä. übergeben, dann können Sie Folgendes tun:In der header.php:
In fancy-js.php:
etc.
Auf diese Weise können Sie jedoch nur auf die Daten zugreifen, die direkt in den GET-Parametern übergeben wurden. und es wird nur funktionieren, wenn die Anzahl der Dinge, die Sie übergeben müssen, relativ gering und die Darstellung dieser Dinge relativ kompakt ist. (Im Grunde genommen eine Handvoll Zeichenfolgen oder numerische Werte - ein Benutzername, etwa oder ein Verzeichnis; keine Liste aller letzten Beiträge eines Benutzers oder ähnliches.)
Welche dieser Optionen die beste ist - ich weiß es nicht; Das hängt von Ihrem Anwendungsfall ab. Option (1) hat den Vorteil, einfach zu sein und Ihnen den Zugriff auf alle WordPress-Daten zu ermöglichen, die Sie möglicherweise benötigen, ohne dass die Leistung durch zweimaliges Laden von WordPress beeinträchtigt wird. Es ist fast sicher, was Sie tun sollten, es sei denn, Sie haben einen starken Grund, dies nicht zu tun (z. B. aufgrund der Größe des Stylesheets oder Skripts, das Sie verwenden müssen).
Wenn die Größe groß genug ist, um ein Problem in Bezug auf das Gewicht Ihrer einen Seite zu verursachen, können Sie (2) oder (2a) ausprobieren.
Andernfalls - dies ist wahrscheinlich die bessere Idee - können Sie versuchen, die Teile des Skripts oder des Stylesheets, die die dynamischen Daten tatsächlich verwenden, von den Teilen zu trennen, die statisch angegeben werden können. Angenommen, Sie haben ein Stylesheet, dem ein Verzeichnis von WordPress übergeben werden muss, um einen Hintergrundparameter für das # my-fancy-Element festzulegen. Sie können dies alles in das head-Element einfügen:
Aber warum sollten Sie das tun müssen? Es gibt hier nur eine Zeile, die von Daten aus WordPress abhängt. Besser nur die Zeilen aufteilen, die von WordPress abhängen:
Fügen Sie alles andere in ein statisches Stylesheet ein, das Sie mit einem Standardlinkelement (style.css oder was auch immer) laden:
Und lassen Sie die Kaskade die Arbeit machen.
Das gleiche gilt für JavaScript: anstatt dies zu tun:
Fügen Sie stattdessen so etwas in das head-Element ein:
Und dann legen Sie den Rest in einer statischen JavaScript-Datei ab und schreiben die Funktionen my_huge_function () und my_other_function () neu, um die globalen Elemente WordPressPostData.url und WordPressPostData.author zu verwenden.
40 KB CSS oder 40 KB JS können fast immer in <1 KB aufgeteilt werden, was tatsächlich von dynamischen Daten abhängt. Der Rest kann in einer statischen externen Datei angegeben und dann mithilfe der Kaskade (für CSS) oder mit globalem Zugriff neu kombiniert werden Variablen (Globals, DOM-Elemente oder was auch immer Sie bevorzugen, für JS).
quelle
Der dynamische CSS-Fall ist ziemlich einfach.
Erstellen Sie einfach eine Funktion, die die dynamischen CSS-Definitionen in
<style type="text/css"></style>
Tags ausgibt , und binden Sie diese Funktion einwp_print_styles
. z.BAngenommen, Sie haben Farbschemata vorkonfiguriert. Sie können das entsprechende Stylesheet entsprechend der aktuellen Benutzereinstellung einreihen:
Beachten Sie, dass sich in diesem Fall die Funktion einhakt
wp_enqueue_scripts
, da WordPress keinenwp_enqueue_styles
Aktions-Hook hat.quelle
Ich dachte das schon eine Weile. Ihre Frage lässt mich darauf zurückkommen. Ich bin mir nicht sicher, ob es eine gute Idee ist oder nicht, daher möchte ich Experten-Kommentare dazu.
Was ist, wenn ich die Javascript / CSS-Datei über PHP schreibe, wenn der Administrator die Daten speichert ? Es wird einmalig geschrieben, bis der Benutzer das Layout erneut ändert (was der Benutzer möglicherweise nicht zu oft tut). Auf diese Weise greifen wir nur einmal auf die Datenbank für die Benutzereinstellungen zu, wenn der Benutzer Daten speichert.
Nach dem Schreiben der Datei handelt es sich um reguläre Javascript- / CSS-Dateien, sodass wir die Datenbank nicht jedes Mal aufrufen müssen, wenn das Thema geladen wird.
Eine Frage, die beantwortet werden muss: Was passiert, wenn ein Besucher versucht, auf die Site zuzugreifen, sobald PHP die Datei schreibt?
Lass mich wissen was du denkst.
quelle
wp-content/uploads
(dem einzigen Verzeichnis, das garantiert aus WP-Code beschreibbar ist), könnte dies ein praktikabler Ansatz sein. Ich denke, dass sogar WP Core diese Technik für eine js-Datei verwendet.Für kleine Teile von Skripten, die Sie möglicherweise nicht in eine separate Datei aufnehmen möchten, weil sie beispielsweise dynamisch generiert werden, bietet sich WordPress 4.5 und weitere an
wp_add_inline_script
. Diese Funktion speichert das Skript grundsätzlich in einem anderen Skript. Angenommen, Sie entwickeln ein Thema und möchten, dass Ihr Kunde seine eigenen Skripts (wie Google Analytics oder AddThis) über die Optionsseite einfügen kann. Beispiel .Für Styles gibt es
wp_add_inline_style
, die grundsätzlich gleich funktionieren. Sie würden es zum Beispiel verwenden, um alle Ihre Customizer-Mods zu durchlaufen und sie in einem String mit dem Namen zusammenzufassen$all_mods
, den Sie dann wie folgt zu Ihrem Haupt-Stylesheet hinzufügen würden:quelle
Erstellen Sie eine dynamische JS.php-Datei und geben Sie ihr wichtige query_vars. Diese Variablen
$_GET
helfen der Datei dabei, den Kontext zu bestimmen, und Sie können sie zwischenspeichern undreadfile()
für zukünftige Anforderungen verwenden.Stellen Sie einfach sicher, dass die Datei
wp-load.php
vor allem anderen geladen wird, damit Sie Zugriff auf WP-Funktionen haben. Verwenden Sie den relativen Pfad zum aktuellen Ordner(dirname(__FILE__))
oder digg in absteigender Reihenfolge in der Ordnerstruktur, umwp-load.php
unabhängig von der Platzierung des Plugins zu suchen.Code, um wp-load.php von überall zu suchen
Prost, Scribu!
PS : Bei komplizierten Strukturen, bei denen Ordner nicht der normalen WP-Dekrementierungsstruktur folgen, können übergeordnete Plug-ins Informationen mit direkt zugreifbaren Dateien austauschen. Ein übergeordnetes Plugin, das mit einer dynamischen PHP-Datei geliefert wird, die CSS / JS rendert, kann in eine Datei schreiben, die
realpath()
von derwp-load.php
und der Standalone-Datei verwendet werden kann. Dies wäre ein Problem für 0,1% der WP-Benutzer. Ich denke, diejenigen, die Ordner verschieben und nicht der normalen Struktur folgen, wissen, was sie tun, und können wahrscheinlich PIMP-Plugins, diewp-load.php
direkt geladen werden müssen.quelle
wp-load.php
keine gute Praxis, ein Theme oder eine Plugin-Datei einzubeziehen, da sich das Verzeichniswp-content
und / oder dasplugins
Verzeichnis an einer beliebigen Stelle relativ zum WP-Stammverzeichnis befinden können. Denken Sie an WP_CONTENT_DIR und WP_PLUGINS_DIR.