Ich habe ein Plugin veröffentlicht, das einen Shortcode erstellt und eine JavaScript-Datei und eine CSS-Datei benötigt, um auf jede Seite geladen zu werden, die diesen Shortcode enthält. Ich könnte das Skript / den Stil einfach auf alle Seiten laden lassen, aber das ist nicht die beste Vorgehensweise. Ich möchte nur die Dateien auf Seiten laden, die den Shortcode aufrufen. Ich habe zwei Methoden gefunden, aber beide haben Probleme.
Methode 1 setzt ein Flag in der Shortcode-Handler-Funktion auf true und überprüft diesen Wert dann in einem wp_footer
Rückruf. Wenn dies zutrifft, wird wp_print_scripts()
JavaScript geladen. Das Problem dabei ist, dass es nur für JavaScript und nicht für CSS funktioniert, da CSS im Inneren deklariert werden sollte <head>
, was Sie nur während eines frühen Hooks wie init
oder tun können wp_head
.
Methode 2 wird vorzeitig ausgelöst und überprüft, ob der Shortcode im aktuellen Seiteninhalt vorhanden ist. Ich mag diese Methode viel besser als die erste, aber das Problem damit wird nicht erkannt, wenn die Vorlage aufruft do_shortcode()
.
Daher tendiere ich dazu, die zweite Methode zu verwenden und dann zu ermitteln, ob eine Vorlage zugewiesen ist, und wenn ja, den Shortcode zu analysieren. Zuvor wollte ich jedoch prüfen, ob jemand eine bessere Methode kennt.
Update: Ich habe die Lösung in mein Plugin integriert. Wenn jemand neugierig ist, es in einer Live-Umgebung zu sehen, können Sie es herunterladen oder durchsuchen .
Update 2: Ab WordPress 3.3 ist es jetzt möglich, einen Shortcode-Callback direkt aufzurufenwp_enqueue_script()
, und die JavaScript-Datei wird in der Fußzeile des Dokuments aufgerufen. Das ist technisch auch für CSS-Dateien möglich, sollte aber als schlechte Praxis angesehen werden, da die Ausgabe von CSS außerhalb des <head>
Tags gegen die W3C-Spezifikationen verstößt, unter Umständen FOUC verursacht und den Browser dazu zwingt, die Seite erneut zu rendern.
Antworten:
Aufgrund meiner eigenen Erfahrung habe ich eine Kombination aus Methode 1 und 2 verwendet - die Architektur und die Fußzeilenskripte von 1 und die Vorausschau-Technik von 2.
Für die Vorausschau verwende ich jedoch Regex anstelle von
stripos
; persönliche Präferenz, schneller und kann nach 'falschem' Shortcode suchen;Wenn Sie befürchten, dass Autoren
do_shortcode
manuell verwendet werden, würde ich sie anweisen,einen Aktionsaufruf zu verwenden,um Ihren vorregistrierten Stil manuell indieWarteschlange zu stellen.UPDATE : Für den faulen Autor, der nie RTFM verwendet, wird eine Nachricht ausgegeben, um den Fehler auf ihren Wegen hervorzuheben ;)
quelle
do_shortcode()
vertraut sind, kann man dann nicht davon ausgehen, dass sie auch mit den folgenden Anweisungen zum Einreihen des Shortcode-Stils vertraut sind?init
, nur irgendwo zuvorwp_head
. Überprüfenwp_style_is( 'my_style_handle', 'done' )
Sie für den faulen Entwickler in Ihrem Shortcode. Wenn dies nicht der Fall ist, drucken Sie einen sichtbaren Fehler aus, der Sie anweist, was zu tun ist.do_shortcode()
zu der Vorlage bereits "etwas Zusätzliches tut" - und Benutzer, die dies tun würden, wüssten entweder bereits, dass der Stil in eine Warteschlange gestellt werden muss, oder sie wären eher bereit / wahrscheinlich besondere Anweisungen befolgen.Ich beantworte diese Frage zu spät, aber seit Ian diesen Thread auf der Liste der WP-Hacker gestartet hat, war es mir ein Anliegen, sie zu beantworten, insbesondere angesichts der Tatsache, dass ich geplant habe, einigen Plugins, an denen ich arbeite, eine solche Funktion hinzuzufügen.
Ein zu berücksichtigender Ansatz besteht darin, beim Laden der ersten Seite zu überprüfen, ob der Shortcode tatsächlich verwendet wird, und dann den Shortcode-Verwendungsstatus in einem Post-Metaschlüssel zu speichern. Hier ist wie:
Schritt-für-Schritt-Anleitung
$shortcode_used
Flagge auf'no'
.$shortcode_used
Flag auf'yes'
.'the_content'
Hook-Priorität ein12
, nachdem WordPress Shortcodes verarbeitet hat, und überprüfen Sie das Post-Meta''
mit der Taste auf a"_has_{$shortcode_name}_shortcode"
. (Ein Wert von''
wird zurückgegeben, wenn für die Beitrags-ID kein Beitrags-Metaschlüssel vorhanden ist.)'save_post'
Haken, um das Post-Meta zu löschen und das persistente Flag für diesen Post zu löschen, falls der Benutzer die Verwendung des Shortcodes ändert.'save_post'
Hook verwendenwp_remote_request()
, um ein nicht blockierendes HTTP-GET an den eigenen Permalink des Posts zu senden, um das Laden der ersten Seite und das Setzen des persistenten Flags auszulösen.'wp_print_styles'
und überprüft Post meta für einen Wert von'yes'
,'no'
oder mit''
der Taste"_has_{$shortcode_name}_shortcode"
. Wenn der Wert'no'
nicht ist, dienen Sie dem Äußeren. Wenn der Wert ist'yes'
oder''
weitermachen und dem Äußeren dienen.Und das sollte es tun. Ich habe ein Beispiel-Plugin geschrieben und getestet, um zu zeigen, wie das alles funktioniert.
Beispiel Plugin Code
Das Plugin wird durch einen
[trigger-css]
Shortcode aktiviert, der die<h2>
Elemente auf der Seite auf Weiß auf Rot setzt, damit Sie leicht sehen können, wie sie funktionieren. Es wird davoncss
ausgegangen, dass ein Unterverzeichnis einestyle.css
Datei mit folgendem CSS enthält:Und unten ist der Code in einem funktionierenden Plugin:
Beispiel-Screenshots
Hier ist eine Reihe von Screenshots
Basic Post Editor, kein Inhalt
Nachanzeige, kein Inhalt
Einfacher Post Editor mit
[trigger-css]
Shortcode[trigger-css]
Nachanzeige mit KurzwahlNicht sicher, ob es 100% ist
Ich glaube, dass das oben Genannte in fast allen Fällen funktionieren sollte, aber da ich gerade diesen Code geschrieben habe, kann ich nicht 100% sicher sein. Wenn Sie Situationen finden, in denen es nicht funktioniert, würde ich gerne wissen, ob ich den Code in einigen Plugins korrigieren kann, die ich soeben hinzugefügt habe. Danke im Voraus.
quelle
post_content
. Und was ist mit Shortcodes in Widgets?'pre_http_request'
haken und mehrere Aufrufe an dieselbe URL deaktivieren, während der'save_post'
Hook aktiv ist, aber ich möchte warten, bis wir wirklich eine Notwendigkeit dafür gesehen haben, nein? Widgets können zwar verbessert werden, aber es ist noch kein Anwendungsfall, den ich mir angesehen habe.<style>
).Googeln fand eine mögliche Antwort für mich . Ich sage "Potenzial", wie es gut aussieht, sollte funktionieren, aber ich bin nicht zu 100% davon überzeugt, dass es der beste Weg ist, dies zu tun:
Dies sollte in der Lage sein, zu überprüfen, ob der aktuelle Beitrag einen Shortcode verwendet, und dem
<head>
Element ein Stylesheet entsprechend hinzuzufügen . Aber ich denke nicht, dass es für eine Indexseite (dh mehrere Posts in der Schleife) funktionieren wird ... Es stammt auch aus einem 2-jährigen Blog-Post, daher bin ich nicht einmal sicher, ob es mit WP 3.1.X funktionieren wird .quelle
get_shortcode_regex()
für die Suche.do_shortcode()
die Vorlage manuell aufrufen, wissen Sie bereits, dass Sie denUnter Verwendung einer Kombination aus der Antwort von TheDeadMedic und der Dokumentation get_shortcode_regex () (in der meine Shortcodes tatsächlich nicht gefunden wurden) habe ich eine einfache Funktion erstellt, mit der Skripts für mehrere Shortcodes in die Warteschlange gestellt werden. Da das wp_enqueue_script () in Shortcodes nur zur Fußzeile hinzugefügt wird, kann dies hilfreich sein, da es sowohl Kopf- als auch Fußzeilenskripts verarbeiten kann.
quelle
Schließlich habe ich auch eine Lösung für das bedingte Laden von CSS gefunden, die für mein Plugin www.mapsmarker.com funktioniert und die ich gerne mit Ihnen teilen möchte. Es wird geprüft, ob mein Shortcode in der aktuellen Vorlagendatei und in der Datei header / footer.php verwendet wird. Wenn ja, wird das benötigte Stylesheet in die Kopfzeile eingefügt:
quelle
Für mein Plugin habe ich festgestellt, dass Benutzer manchmal einen Theme Builder haben, dessen Shortcode in Post-Metadaten gespeichert ist . Hier ist, was ich verwende, um festzustellen, ob mein Plugin-Shortcode in aktuellen Post- oder Post-Metadaten vorhanden ist :
quelle
Für CSS-Dateien können Sie diese in Ihre Shortcode-Ausgabe laden:
Legen Sie eine Konstante oder etwas anderes fest
MY_CSS_LOADED
(schließen Sie das CSS nur ein, wenn die Konstante nicht festgelegt ist).Beide Methoden sind langsamer als auf diese Weise.
Für JS-Dateien können Sie dasselbe tun, wenn das Skript, das Sie laden, eindeutig ist und keine externen Abhängigkeiten aufweist. Wenn dies nicht der Fall ist, laden Sie es in die Fußzeile, aber verwenden Sie die Konstante, um zu bestimmen, ob geladen werden muss oder nicht ...
quelle
<head>
Elements ist nicht korrekt. Die Validierung ist zwar nur eine Richtlinie, aber wenn wir versuchen, diese Richtlinie einzuhalten, ist das Laden des Stylesheets innerhalb der Shortcode-Ausgabe eine schlechte Idee.<style type="text/css"> The element named above was found in a context where it is not allowed. This could mean that you have incorrectly nested elements -- such as a "style" element in the "body" section instead of inside "head"
. Inline-Stile (<element style="..."></element>
) sind also gültig, Inline-<style>
Elemente jedoch nicht.Script Logic ist ein WordPress-Plugin, mit dem Sie die volle Kontrolle über alle JavaScript- und CSS-Dateien haben. Mit diesem Plugin können Sie CSS- und JS-Dateien nur auf Seiten laden, auf denen dies erforderlich ist.
http://wordpress.org/plugins/script-logic/
quelle