In der functions.php meines Themas rufe ich eine add_action auf, um ein gewisses Maß an Kontrolle darüber zu erlangen, wo jquery geladen wird (in der Fußzeile zusammen mit den anderen Skripten meines Themas).
Das Problem, das ich habe, ist, dass wenn ich add_action ('wp_enqueue_scripts') verwende, es nur dann ausgelöst wird, wenn keine Plugins geladen sind. Die Methode add_action ('init') funktioniert jedoch in allen Fällen.
Ich kann mich nicht erinnern warum, aber ich glaube, dass add_action ('wp_enqueue_scripts') in diesem Fall bevorzugt wird. Wenn das stimmt, wie kann ich es in allen Fällen zum Laufen bringen?
In functions.php
//if(!is_admin()){add_action('init', 'my_theme_init');} //THIS WORKS ALL THE TIME
//add_action('wp_enqueue_scripts', 'my_theme_init'); //THIS ONLY WORKS WHEN NO PLUGINS PRESENT
if(!is_admin())
{
require_once(TEMPLATEPATH . '/functions_public.php');
}
In functions_public.php
function my_theme_init()
{
/* PREVENT DUPLICATE COPIES OF JQUERY FROM PLUGINS
**************************************************/
wp_deregister_script('jquery');
/* LOAD THE LOCAL WORDPRESS COPY OF JQUERY AND THEME CUSTOM SCRIPTS IN THE FOOTER
***********************************************/
wp_register_script('jquery', get_bloginfo('template_directory').'/scripts.mythemescripts.js',false,false,true);
wp_enqueue_script('jquery');
}
Die zweite Methode, die add_action ('wp_enqueue_scripts') verwendet, wird anscheinend nicht unter Bedingungen ausgeführt, unter denen ein Plugin vorhanden ist, das Skriptabhängigkeiten zum Thema schreibt.
quelle
Antworten:
Viele Plugin-Entwickler machen die Dinge nicht richtig. Der richtige Weg ist, sich anzuschließen,
wp_enqueue_scripts
wie Sie es versuchen.Hier ist jedoch die Reihenfolge der Hooks, die in einer typischen Anforderung ausgeführt werden:
Die Sache ist, dass ursprünglich mehreren Entwicklern gesagt wurde, sie sollten sich anschließen,
init
um ihre Skripte in die Warteschlange zu stellen. Bevor wir einenwp_enqueue_script
Haken hatten, war dies die "richtige" Art, Dinge zu tun, und Tutorials, die die Praxis fortsetzen, schweben immer noch im Internet herum und korrumpieren ansonsten gute Entwickler.Meine Empfehlung wäre, Ihre Funktion in zwei Teile aufzuteilen. Machen Sie Ihr
wp_deregister_script
/wp_register_script
aminit
Haken und verwenden Sie denwp_enqueue_scripts
Haken, wenn Sie jQuery tatsächlich in die Warteschlange stellen.Dies hält Sie in der Welt des "richtigen Handelns" für das Einreihen Ihrer Skripte und schützt Sie vor den Hunderten von Entwicklern, die es immer noch "falsch machen", indem Sie jQuery gegen Ihre verkettete Version austauschen, bevor sie es der Warteschlange hinzufügen .
Sie möchten auch Ihren
init
Haken mit einer hohen Priorität hinzufügen :quelle
priority
Hinzufügen von Aktionen. Es hängt alles davon ab, wie Sie die Priorität anzeigen. Wenn Sie möchten, dass Ihre "zuerst" ausgeführt wird, ist eine niedrigere Nummer besser - eine höhere Priorität in der Reihenfolge der Ausführungswarteschlangen. Wenn Sie jedoch möchten, dass der Effekt Ihrer Funktion Vorrang vor anderen hat, möchten Sie, dass er später ausgeführt wird - also eine höhere Priorität durch "Effekt". Und in diesem Fall ist es wahrscheinlich eine höhere Zahl, die Sie möchten. Obwohl es wenig sinnvoll ist, die RTM-Version von jquery auszutauschen, wie der vorherige Kommentator vorschlägt.Hier gibt es mehrere Probleme, die miteinander zusammenhängen.
wp_enqueue_scripts
wp_enqueue_script()
, setzen Sie den$footer
Parameter auftrue
add_action( $hook, $callback )
Anrufe sollten in nichts eingewickelt sein; Lassen Sie sie direkt von ausführenfunctions.php
is_admin()
bedingten Prüfungen in Ihren Rückruf einfügenwp_enqueue_scripts
ist zu spät . Teilen Sie Ihren Abmelde- / Registrierungscode in einen Rückruf auf, der angeschlossen istinit
.get_template_directory()
eher alsTEMPLATEPATH
Alles zusammen:
Aber nochmal: Dies ist wirklich nicht der beste Ansatz. Am besten entfernen Sie einfach die Rückrufe des Plugins add_action (), mit denen die Registrierung von Core-jQuery aufgehoben wird, oder verwenden Plugins, die nicht so rücksichtslos sind wie das Ersetzen von Core-Bundled-jQuery.
quelle
_doing_it_wrong()
, etwas, das nicht nur jQuery ist, "jQuery" zu nennen. Außerdem: jQuery selbst kann einfach aus der Warteschlange entfernt werden, um sicherzustellen, dass es nicht zweimal geladen wird. Derwp_dequeue_script()
Anruf muss nur mit einer ausreichenden Priorität erfolgen, um sicherzustellen, dass er danach nicht mehr in die Warteschlange gestellt wird.