Scripts und Styles effektiv einbinden

Wenn man JavaScript und CSS Dateien einbinden möchte, dann sollte man immer die Funktionen wp_enqueue_script() und wp_enqueue_style() verwenden. Falls ihr das noch nicht tut, dann fangt bitte ab sofort damit an. Die Verwendung der beiden Funktionen ist wirklich sehr einfach, aber um diese auch effektiv zu nutzen, sollte man ein paar Dinge beachten.

Einfache Verwendung

Die einfachste Art, die Funktionen zu verwenden, ist die Definition eines „handle“ sowie einer URL der Datei, die ihr einbinden wollt:

wp_enqueue_script(
	'chart-js',
	'https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.7.0/chart.min.js'
);

Dieses Beispiel würde eine JavaScript-Datei einbinden, sie sich auf einem externen Server befindet. Das ist so weit auch OK, aber es gibt viele Gründe, wieso man Dateien lieber lokal einbinden möchte, um beispielsweise Probleme beim Ausfall des CDN zu vermeiden oder aber, um den Datenschutz zu verbessern.

Verwendung einer lokalen Datei – schlechtes Beispiel

Um eine Datei aus einem Plugin oder Theme zu laden, würde es ausreichen, den Pfad wie folgt relative anzugeben:

wp_enqueue_script(
	'chart-js',
	'/wp-content/plugins/plugin-name/assets/chart.min.js'
);

Die Datei würde dann wie folgt in den Quellcode eingebunden werden:

<script type='text/javascript' src='https://theme-tests.docker.test/wp-content/plugins/plugin-name/assets/chart.min.js?ver=5.9'></script>

Das würde zwar funktionieren, es gibt mit dieser einfachen Methode aber ein paar Probleme.

1. Immer dynamische Pfade verwenden

Im Beispiel oben wurde ein relativer Pfad auf das Verzeichnis wp-content/plugins verwendet. Das mag für viele von euch richtig aussehen, aber der Ordner wp-content kann einen anderen Namen haben (und manche Sicherheits-Plugins tun das auch – obwohl es eine schlechte Idee ist). Ihr solltet daher immer eine Hilfsfunktion verwenden, um den relativen Pfad zu diesem Ordner zu erhalten. Wenn ihr eine Datei in einem Plugin oder Theme einbindet, dann könnt ihr hierzu verschiedene Funktionen verwenden. Diese hier werdet ihr dafür vermutlich in der Regel verwenden:

2. Immer eine Version der Datei angeben

Wie ihr in dem Beispiel oben sehen könnt, fügt WordPress immer eine Versionsnummer an. Wenn ihr selbst keine festlegt, dann wird WordPress immer seine aktuelle Version ans Ende der URL anhängen. Heute würde also 5.9 am Ende stehen. Diese Versionsnummer hat den Zweck, euch beim Caching zu helfen. Da sich eure Dateien aber sicher nicht (nur) dann ändern, wenn eine neue WordPress Version erscheint, solltet ihr hier einen anderen Versions-String verwenden. Das könnte einer der folgenden sein:

  • Eine statische Versionsnummer, die der Version des Plugins entspricht
  • Ein statisches Änderungsdatum des Plugins
  • Ein statisches Änderungsdatum der Datei, die eingebunden werden soll
  • Ein dynamisches Änderungsdatum der Datei, die eingebunden werden soll

In der Vergangenheit habe ich oft die erste oder dritte Option verwendet. Aber dabei musste jeder dieser Versions-String (für alle Dateien) immer manuell aktualisiert werden. Dabei vergisst man dann schnell mal einen und der Browser liefert eine alte Datei aus seinem Cache aus. Heutzutage verwende ich daher normalerweise den letzten Ansatz. Das hat auch den Vorteil, dass während der Entwicklung, bei jedem Speichern der Datei immer sichergestellt wird, dass der Browser stets die aktuellste Datei lädt. Ein Beispiel für diesen Ansatz – kombiniert mit dynamischen Pfaden – könnte wie folgt aussehen:

wp_enqueue_script(
	'chart-js',
	plugins_url( 'assets/chart.min.js', __FILE__ ),
	array(),
	filemtime( plugin_dir_path( __FILE__ ) . 'assets/chart.min.js' )
);

Das Resultat der Einbindung der Datei würde dann so aussehen:

<script type='text/javascript' src='https://theme-tests.docker.test/wp-content/plugins/plugin-name/assets/chart.min.js?ver=1644792351' id='chart-js-js'></script>

Wie ihr hier sehen könnt, wurde an das Ende der URL der aktuelle UNIX-Timestamp angehängt. Da sich dieser mit jeder Änderung der Datei ändert, wird der Browser immer die aktuellste Datei laden.

Fazit

Dieser Blogbeitrag behandelt ein sehr einfaches Konzept, aber ich sehe immer wieder Plugins und Themes, die Dateien nicht effektiv einbinden. Mit diesen kleinen Tricks könnte ihr viel Stress beim Finden von Fehlern vermeiden, die nur deshalb auftreten, weil der Fehler eigentlich nur darin bestand, dass der Browser noch immer eine alte Version der Datei aus seinem Cache geladen hatte.

Veröffentlicht von

Bernhard ist fest angestellter Webentwickler, entwickelt in seiner Freizeit Plugins, schreibt in seinem Blog über WordPress und andere Themen, treibt sich gerne bei den WP Meetups in Berlin und Potsdam herum und läuft nach Feierabend den ein oder anderen Halbmarathon.

4 Kommentare » Schreibe einen Kommentar

  1. Hallo Bernhard,

    filemtime zur Versionierung nutze ich mittlerweile auch als Standard. Ich checke aber zur Sicherheit noch, ob es die Datei wirklich gibt mit:

    file_exists( plugin_dir_path( __FILE__ ) . 'assets/chart.min.js' ) ?  filemtime( plugin_dir_path( __FILE__ ) . 'assets/chart.min.js'  ) : null

    Wenn nicht, z.B. weil gerade kompiliert wird, gibt das sonst eine Exception.

    Wichtig finde ich auch immer wp_register_script und wp_enqueue_script zu nutzen, damit die Dateien wirklich nur geladen werden, wenn sie benötigt werden: https://go-around.de/blog/assets-optimiert-laden/

    • Danke für deinen Kommentar Johannes,

      so in etwa mache ich es auch. Allerdings habe ich insgesamt ein if-Statements um den `wp_register_scripts` Funktionsaufruf. Das `wp_enqueue_script` mache ich dann in den passenden Hooks für Frontend, Backend und Block-Editor.

      Aber ich wollte den Beitrag wirklich so kurz wie möglich halten und nur auf diesen einzelnen und wichtigen Aspekt eingehen, den viele eben nicht beachten.

  2. Hi,

    ich habe mit meinen laienhaften Kenntnissen versucht ein globales Skript, das derzeit auf allen Seiten geladen wird, nur in bestimmten Verzeichnissen zu laden.
    xyz wird auf allen WordPress Seiten geladen mit Hilfe des „Insert Headers and Footers“ Plugin. Gibt es eine Möglichkeit das Skript nur auf Seiten in einem bestimmten Verzeichnis zu laden.
    Beispiel: Skript soll geladen werden auf xyz.de/abc ?

    LG

    Jonathan

    • Hallo Jonathan,

      ich kenne leider das von dir verwendete Plugin nicht und kann dir daher auch nicht sagen, ob es damit möglich ist.

      Aus welchem Grund möchtest du denn ein „globales Skript“ nur auf bestimmten Seiten anzeigen? Oft möchte man das ja, wenn im Inhalt der Seite etwas enthalten ist, was dieses JavaScript enthält. Daher gibt es oft auch bessere Wege, als über den Pfad zu gehen (der sich ja auch mal ändern könnte). Aber ohne deinen genauen Anwendungsfall zu kennen, kann ich dir leider nicht weiterhelfen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert