it-swarm.com.de

Laden/Entladen von WordPress-Skripten - wp_deregister_script ('jquery')

Ich habe ein paar Fragen zu WordPress beim Laden/Entladen von Javascript-Tools. Nachdem ich eine gut geschriebene Antwort auf eine Frage von Pieter Goosen gelesen hatte, musste ich ein bisschen lernen und den Code, den ich zum Laden meiner Bibliotheken verwende, aufräumen. Dieser Code stammt aus der function.php-Datei meines Kinderthemas. Auf meiner Website gibt es einige Funktionen, die die Kalender-Tools von datepicker verwenden. Zusätzlich gibt es ein paar Plugins, von denen ich sicher bin, dass sie jQuery verwenden.

function jquery_loadup() {
        //wp_deregister_script('jquery');    <--- ?H
        wp_enqueue_script('jquery');
        //wp_enqueue_script('jquery-migrate');
        wp_enqueue_script('jquery-ui-core');
        wp_enqueue_script('jquery-ui-datepicker');
        wp_enqueue_style('jquery-style', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css');
}
add_action('wp_enqueue_scripts','jquery_loadup');

Ich hatte den Eindruck, dass die Zeile wp_deregister_script('jquery') im Wesentlichen alle vorherigen 'Anfragen' für die jquery-Skripte zurücksetzt/löscht, damit sie sich nicht gegenseitig stören. Diese Zeile gefolgt von wp_enqueue_script('jquery'); sollte zu einer minimalen, sauberen Belastung von jQuery über das von WordPress häufig verwendete System für registrierte Handles/Skriptpfade führen, nicht wahr? Ich würde denken, dass der Aufruf der Deregistrierung das Vorhandensein einer früheren 'Installation' für jquery testet und, wenn er eine oder mehrere findet, das Laden stoppt, wenn keine registriert sind, nichts unternimmt.

Was ich sehe ist, dass wenn ich die wp_deregister_script('jquery') benutze, ich einen Fehler auf dem Websie "ReferenceError: jQuery is not defined" erhalte. In diesem Fall schlagen alle meine JavaScript-Funktionen fehl. Was zum Teufel? Die Site funktioniert einwandfrei, wenn sie kommentiert wird.

Fragen: Vermisse ich etwas? Was verstehe ich nicht über den Abmeldeanruf? Warum würde ich eine Fehlermeldung erhalten?

Beachten Sie, dass die Zeile für jquery-migrate für Software mit älteren Versionen von jQuery vorgesehen ist. Ich habe es getestet, kann aber nicht feststellen, dass es auf meiner Website etwas bewirkt. Daher habe ich es herausgenommen, um die Download- und Reaktionszeiten zu verbessern. Frage: Ist das eine schlechte Idee?

verweise:

2
zipzit

Wordpress verfügt im Wesentlichen über zwei Gruppen von Methoden zum Behandeln von Skripten, die beide verwendet werden sollten:

  • wp_register_script Registriert ein Skript in Wordpress. Es wird nicht aufgerufen, es ist nur für Wordpress verfügbar, wenn es benötigt wird.
  • wp_deregister_script ist genau das Gegenteil. Es löscht die Definitionen in wp_register_script, das Skript ist nicht mehr als Abhängigkeit oder zum Einreihen verfügbar.

Die registrierten Skripte geben nichts im Code aus. Sie definieren das Skript nur programmgesteuert, damit WP auf Abhängigkeiten und Warteschlangen reagieren kann.

  • wp_enqueue_script definiert und reiht ein Skript zur Ausgabe in die Kopf-/Fußzeile der HTML-Seite ein.
  • wp_dequeue_script macht genau das Gegenteil und stellt ein Skript für die Ausgabe in die Warteschlange.

Der eigentliche Ausdruck erfolgt auf der Aktion 'wp_head' oder 'wp_footer', abhängig von den Registerdetails.

Ein Beispiel:

wp_deregister_script('jquery');
wp_register_script('jquery', ("https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"), false, '1.9.1', true);

wp_enqueue_script( 'script-1', get_template_directory_uri() . '/js/example1.js', array('jquery'), '1.0.0', false );
wp_enqueue_script( 'script-2', get_template_directory_uri() . '/js/example2.js', array('jquery'), '1.0.0', true );
wp_enqueue_script( 'script-3', get_template_directory_uri() . '/js/example3.js', array('jquery'), '1.0.0', true );
wp_enqueue_script( 'script-4', get_template_directory_uri() . '/js/example4.js', array('jquery'), '1.0.0', true );
wp_enqueue_script( 'script-5', get_template_directory_uri() . '/js/example5.js', array('jquery'), '1.0.0', true );

In diesem Beispiel habe ich jQuery abgemeldet. Es ist nicht mehr verfügbar und ich würde den gleichen Fehler wie Sie erhalten, wenn ich ihn nicht erneut registrieren würde. (Diesmal vom Google CDN in der Hoffnung, dass es meine Seite beschleunigt.)

Aber in Zeile drei wird jQuery nicht gedruckt. Es wird nirgendwo angezeigt. Aber ab Zeile vier rufe ich eine Reihe von Skripten auf, die alle jquery als Abhängigkeit haben. Der erste befindet sich in der Kopfzeile, alle anderen in der Fußzeile. Aufgrund der Abhängigkeiten wird jQuery automatisch in den Header eingereiht, da es dort zuerst benötigt wird.

Mit dem Skriptsystem von Wordpress, das recht solide ist, müssen also keine Interferenzen oder vorherigen Anforderungen bearbeitet werden. Registrierte Skripte werden bei Bedarf einmalig und nur bei Bedarf aufgerufen.

In Ihrem Beispiel haben Sie das Skript in Zeile 1 der Funktion abgemeldet und in Zeile 2 erneut aufgerufen. Aufgrund der Abmeldung hat Wordpress jedoch alle Details wie URL, Version, Abhängigkeiten usw. vergessen. Die richtige Funktion in Ihrer Logik wäre wp_dequeue_script gewesen, aber selbst das wird nicht benötigt. Wordpress bewertet den Bedarf entweder anhand der in die Warteschlange gestellten Skripte oder anhand der Abhängigkeiten.

Bearbeiten:

woher weiß WordPress, wie man das Durcheinander von 8 verschiedenen Plugins stoppt, die alle versuchen, verschiedene Versionen von JQuery hinzuzufügen?

Die letzte Instanz der Registrierung von jquery vor der Aktion wp_print_scripts wird gedruckt. Dafür ist im Wesentlichen das Prioritätssystem in Aktionen/Filtern vorgesehen.

3

Nur um sich einzuschalten, zunächst einmal, danke für die Ergänzung, dankbar.

Sie verwenden ein untergeordnetes Thema, von dem das übergeordnete Themahaben sollte, um die in WordPress integrierte JQuery-Bibliothek in die Warteschlange zu stellen. Wie ich in dem Beitrag sagte, auf den Sie sich beziehen, ist es eine schlechte Praxis, mein Schwerpunkt, wenn ein übergeordnetes Thema die Abfrage nicht standardmäßig in die Warteschlange einreiht.

Sie haben einige Probleme mit Ihrem Code. Zuallererst sollten Sie die Standard-JQuery-Bibliothek niemals abmelden. Sie werden später etwas kaputt machen. Der richtige Weg ist, das Skript mit wp_dequeue_scripts zu entfernen.

Nur eine Frage hier, warum müssen Sie jquery aus der Warteschlange nehmen und es anfordern. Dies wird in der Regel von Plugin-Autoren verwendet, um sicherzustellen, dass jquery nicht zweimal geladen wird. Der Grund hierfür liegt darin, dass Plugins für alle Themen verwendet werden. Daher kann nicht festgestellt werden, ob für das Thema, das ein Benutzer mit dem Plugin verwendet, jquery geladen ist. Sie führen ein untergeordnetes Thema aus, das nur für dieses bestimmte übergeordnete Thema geeignet ist, sodass Sie wissen, ob für das übergeordnete Thema eine Abfrage geladen wurde. Es besteht also keine Notwendigkeit, zu entschlüsseln und anzufordern.

Zweitens müssen Sie die Priorität betrachten. add_action haben 4 Parameter, der dritte ist die Priorität ($priority). Normalerweise laden Plugins und untergeordnete Themen ihre Skripte nach einem übergeordneten Thema, um sicherzustellen, dass es später nicht überlaufen wird. Es ist also ratsam und sinnvoll, Ihre Aktion als letztes zu beenden. Dazu benötigen Sie eine sehr niedrige Priorität, dh eine sehr hohe Nummer.

  add_action( 'wp_enqueue_scripts', 'jquery_loadup', 999 );
2
Pieter Goosen