Wie können Skripte und / oder Stile für die Verwendung in Plugins registriert / in die Warteschlange gestellt werden?
Ich habe vor kurzem ein einfaches Plugin-Plugin gemacht , um den Benutzer Avatar / Gravatar mit einem Shortcode hinzuzufügen. Ich habe verschiedene Stiloptionen für die Anzeige des Avatars (quadratisch, rund usw.) und habe mich entschieden, die CSS direkt in den Shortcode selbst einzufügen.
Jetzt ist mir jedoch klar, dass dies kein guter Ansatz ist, da der CSS-Code jedes Mal wiederholt wird, wenn der Shortcode auf einer Seite verwendet wird. Ich habe mehrere andere Ansätze auf dieser Site gesehen und der wp-Codex hat sogar zwei eigene Beispiele, so dass es schwierig ist zu wissen, welcher Ansatz am konsistentesten und schnellsten ist.
Hier sind die Methoden, die mir derzeit bekannt sind:
Methode 1: Direkt in den Shortcode aufnehmen - Dies ist das, was ich derzeit im Plugin mache, aber es scheint nicht gut zu sein, da es den Code wiederholt.
class My_Shortcode {
function handle_shortcode( $atts, $content="" ) {
/* simply enqueue or print the scripts/styles in the shortcode itself */
?>
<style type="text/css">
</style>
<?php
return "$content";
}
}
add_shortcode( 'myshortcode', array( 'My_Shortcode', 'handle_shortcode' ) );
Methode 2: Verwenden Sie die Klasse, um Skripts oder Stile bedingt in die Warteschlange zu stellen
class My_Shortcode {
static $add_script;
static function init() {
add_shortcode('myshortcode', array(__CLASS__, 'handle_shortcode'));
add_action('init', array(__CLASS__, 'register_script'));
add_action('wp_footer', array(__CLASS__, 'print_script'));
}
static function handle_shortcode($atts) {
self::$add_script = true;
// shortcode handling here
}
static function register_script() {
wp_register_script('my-script', plugins_url('my-script.js', __FILE__), array('jquery'), '1.0', true);
}
static function print_script() {
if ( ! self::$add_script )
return;
wp_print_scripts('my-script');
}
}
My_Shortcode::init();
Methode 3: Verwenden von get_shortcode_regex();
function your_prefix_detect_shortcode() {
global $wp_query;
$posts = $wp_query->posts;
$pattern = get_shortcode_regex();
foreach ($posts as $post){
if ( preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
&& array_key_exists( 2, $matches )
&& in_array( 'myshortcode', $matches[2] ) )
{
// css/js
break;
}
}
}
add_action( 'wp', 'your_prefix_detect_shortcode' );
Methode 4: Verwenden von has_shortcode();
function custom_shortcode_scripts() {
global $post;
if( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'myshortcode') ) {
wp_enqueue_script( 'my-script');
}
}
add_action( 'wp_enqueue_scripts', 'custom_shortcode_scripts');
quelle
Method 4: Using has_shortcode();
ist am besten, weil es sicherstellt, dass Skripte und Stile einmal geladen werden, wenn der Inhalt des Beitrags einen Shortcode enthält, unabhängig von der mehrfachen Verwendung des Shortcodes. Obwohl es möglicherweise nicht für Shortcode-Anwendungen in Widgets oder in der Seitenleiste funktioniert, bin ich mir nicht sicher. Wenn es sich um ein Plugin handelt, würde ich Ihnen nicht empfehlen, Skripte mit einem Shortcode zu verknüpfen, da einige möglicherweise Ihre Funktion anstelle des Shortcodes aufrufen, um die gewünschte Ausgabe zu erhalten.Antworten:
Ich habe einen anderen Weg gefunden, der für mich gut funktioniert:
Wenn Sie das Plugin initialisieren, stellen Sie Ihre Skripte und Stile nicht in die Warteschlange, sondern registrieren Sie sie mit
wp_register_style
undwp_register_script
.Als nächstes können Sie das Skript / den Stil bei Bedarf laden. Zum Beispiel, wenn Sie einen Shortcode mit
wp_enqueue_style("your_style")
und rendernwp_enqueue_script("your_script")
.Hier ist ein Beispiel-Plugin mit dieser Methode, mit dem Sie get_avatar als Shortcode verwenden können. Das Stylesheet wird nur in die Warteschlange gestellt, wenn der Shortcode vorhanden ist.
Verwendung (ID ist standardmäßig der aktuelle Benutzer):
[get_avatar id="" size="32" default="mystery" alt="Profile Photo" class="round"]
quelle
wp_enqueue_scripts
Hook bereits aufgetreten ist. (Shortcodes werden analysiert, währenddessenthe_content
ein Teil desthe_post
Hooks ist. Wenn Sie das Skript nicht bereits registriert haben, ist es zu spät, eineBevor ich mit der Beantwortung beginne, muss ich sagen, dass CSS und JS nicht dasselbe sind.
Der Grund ist einfach: Während das Hinzufügen von js zum Hauptteil der Seite (in der Fußzeile) ein gängiger und gültiger Weg ist, muss CSS im
<head>
Abschnitt der Seite platziert werden: Auch wenn die Mehrheit der Browser CSS in der Seite ordnungsgemäß rendern kann body, das ist kein gültiger HTML-Code.Wenn ein Shortcode gerendert wird, der
<head>
Abschnitt bereits gedruckt wurde, bedeutet dies, dass js problemlos in der Fußzeile hinzugefügt werden kann, jedoch muss css hinzugefügt werden, bevor der Shortcode gerendert wird.Skripte
Wenn Ihr Shortcode nur js benötigt, haben Sie Glück und können nur
wp_enqueue_script
im Rumpf des Shortcode-Rückrufs Folgendes verwenden :Dabei wird Ihr Skript nur einmal in die Fußzeile eingefügt, auch wenn der Shortcode mehrmals auf der Seite verwendet wird.
Stile
Wenn Sie für den Code Stile benötigen, müssen Sie vor dem eigentlichen Rendern des Shortcodes handeln .
Hierfür gibt es verschiedene Möglichkeiten:
Sehen Sie sich alle Posts in der aktuellen Abfrage an und fügen Sie bei Bedarf die Shortcode-Stile hinzu. Dies ist, was Sie in Methode 3 und 4 in OP tun. Tatsächlich tun beide Methoden dasselbe, wurden jedoch
has_shortcode
in WP 3.6 hinzugefügt, obwohlget_shortcode_regex
es seit Version 2.5 verfügbar ist. Verwendenget_shortcode_regex
Sie diese Methode nur, wenn Sie Ihr Plugin mit älteren Versionen kompatibel machen möchten.Fügen Sie auf allen Seiten immer den Shortcode-Stil hinzu
Probleme
Problem mit # 1 ist die Leistung. Regex sind ziemlich langsame Vorgänge und das Starten von Regex in einer Schleife aller Posts kann die Seite konsistent verlangsamen. Darüber hinaus ist es in Themes eine ziemlich häufige Aufgabe, nur Post-Ausschnitte in Archiven anzuzeigen und vollständigen Inhalt mit Shortcodes nur in einzelnen Ansichten anzuzeigen. In diesem Fall startet Ihr Plugin beim Anzeigen eines Archivs in einer Schleife einen regulären Ausdruck, um einen Stil hinzuzufügen, der niemals verwendet wird: eine unnötige doppelte Auswirkung auf die Leistung: Verlangsamung der Seitengenerierung + zusätzliche unnötige HTTP-Anforderung
Problem mit # 2 ist wieder Leistung. Das Hinzufügen eines Stils zu allen Seiten bedeutet, dass eine zusätzliche HTTP-Anforderung für alle Seiten hinzugefügt wird, auch wenn diese nicht benötigt wird. Auch wenn die Generierungszeit der serverseitigen Seiten nicht beeinflusst wird, gilt dies für die gesamte Renderzeit der Seite und für alle Websiteseiten.
Was sollte ein Plugin-Entwickler also tun?
Ich denke, das Beste ist, eine Optionsseite zum Plugin hinzuzufügen, auf der Benutzer auswählen können, ob der Shortcode nur in der Einzelansicht oder sogar in Archiven behandelt werden soll. In beiden Fällen ist es besser, eine andere Option bereitzustellen, um auszuwählen, für welche Beitragstypen die Kurzwahl aktiviert werden soll.
Auf diese Weise kann ein Hook gesetzt werden
"template_redirect"
, um zu überprüfen, ob die aktuelle Abfrage den Anforderungen entspricht, und in diesem Fall den Stil hinzuzufügen.Wenn der Benutzer den Shortcode nur in einzelnen Post-Ansichten verwendet, empfiehlt es sich, zu prüfen, ob der Post einen Shortcode enthält oder nicht: Wenn nur eine Regex erforderlich ist, sollte die Seite nicht so stark verlangsamt werden.
Wenn der Benutzer die Verwendung von Shortcode auch in Archiven auswählt , würde ich vermeiden, bei hoher Anzahl von Posts Regex für alle Posts auszuführen und den Stil nur in eine Warteschlange einreihen, wenn die Anforderungen an die Abfragetauglichkeit erfüllt sind.
Was in dieser Hinsicht als "hoch" zu betrachten ist, sollte darin bestehen, einige Leistungstests durchzuführen oder alternativ eine weitere Option hinzuzufügen und den Benutzern eine Auswahl zu geben.
quelle
<style>
Tags im Dokumenttext jetzt gemäß der W3C-Spezifikation gültig sind. w3.org/TR/html52/document-metadata.html#the-style-elementFü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
Ich mache so:
und catch hook in anderen Funktionen (oder anderen Plugins):
quelle
Ich habe für mein eigenes Plugin herausgefunden, ob der Shortcode im Text-Widget vorhanden ist.
quelle
WordPress hat eine eingebaute Funktion, um etwas basierend auf einem bestimmten Shortcode-Präsentationsstatus zu tun. Der Funktionsname ist
has_shortcode()
. Mit dem folgenden Code können Sie Ihren Stil und Ihre Skripte einreihen.Hier habe ich das benutzt
is_a( $post, 'WP_Post' )
, um zu überprüfen, ob das$post
Objekt zurWP_Post
Klasse gehört, und ich habe$post->post_content
den Inhalt des Beitrags überprüft.quelle
Ich habe eine Kombination aus dem Beispielcode der Wordpress-Seite für has_shortcode () und der Antwort, die zndencka gab, erstellt. Mir ist aufgefallen, dass die Funktion has_shortcode in Wordpress 3.6 hinzugefügt wurde. Deshalb überprüfe ich zuerst, ob die Funktion vorhanden ist. Vielleicht ist diese Überprüfung ein bisschen veraltet, da laut wordpress nicht mehr viele Benutzer unter WordPress 3.6 ihre eigenen Statistiken haben.
quelle
Wir können CSS- und JS-Dateien in der Tat unter bestimmten Bedingungen per Shortcode laden, ohne übermäßig aufwendige Funktionen zu verwenden:
Nehmen wir zunächst an, wir haben alle unsere CSS / JS-Dateien zuvor registriert (möglicherweise beim
wp_enqueue_scripts
Ausführen).Als nächstes wollen wir unsere Shortcode-Funktion untersuchen:
Einfach. Getan. Ergo: css / js-Dateien können "bedingt" geladen werden (nur wenn [shortcode] ausgeführt wird).
Betrachten wir die folgende Ideologie:
prep_css_and_js()
lade ich während meiner Funktion ALLE .css / .js-Dateien, die sich in bestimmten Ordnern befinden ...Jetzt, da WP sie als registrierte Skripte betrachtet, können wir sie in der Tat bedingt aufrufen, basierend auf einer Reihe von Situationen, einschließlich, aber nicht beschränkt auf
my_shortcode_func()
Vorteile: (kein MySQL, keine erweiterten Funktionen und keine Filter erforderlich)
Verweise:
quelle