Wenn es um die Leistung von WordPress geht, haben wir eine Menge über Plugins zu sagen. Jedes Plugin fügt PHP-Code hinzu, der ausgeführt werden muss, normalerweise Skripte und Stile enthält und sogar zusätzliche Abfragen gegen die Datenbank ausführen kann. Das bedeutet, dass unnötige Plugins die Geschwindigkeit der Seite beeinträchtigen und sich negativ auf die User Experience und dein Page Ranking auswirken können.

Betrachten wir als Beispiel ein Plugin, das benutzerdefinierte Formulare auf Titelseiten erstellt und anzeigt, wie z.B. Contact Form 7. Typischerweise benötigt man nur ein Formular auf einer einzigen Seite, aber im Idealfall kann man ein Formular auf jeder Seite mit dem Shortcode des Plugins einbetten. Aus diesem Grund lädt das Contact Form 7 Skripte und Stile auf jeder Seite deiner Website.

Aber willst du wirklich den Plugin-Code ausführen und Scripts und Styles auf jeder Seite deiner WordPress Website einbinden?

In diesem Beitrag zeige ich dir, wie du das Laden von unnötigen Plugins auf bestimmten Beiträgen/Seiten verhindern kannst, so dass du zusätzliche Plugins installieren kannst (natürlich nicht verrückt werden) und deine WordPress Website trotzdem schnell laden kannst. Um diese Aufgabe zu erfüllen, werden wir die WordPress-Plugins auf bestimmten Beiträgen und Seiten programmatisch deaktivieren. Dies ist ein vierstufiger Prozess:

Tauchen wir tief ein.

Drei allgemeine Regeln, die bei der Auswahl eines Plugins zu beachten sind

Die folgenden allgemeinen Regeln können bei der Auswahl eines Plugins hilfreich sein:

  • Installiere nur gut programmierte Plugins von vertrauenswürdigen Entwicklern: Berücksichtige aktive Installationen, Benutzerbewertung, Kundensupport, Aktualisierungshäufigkeit und alle nützlichen Informationen aus der WordPress-Community.
  • Bevorzuge skalierbare Plugins: Vergleiche ähnliche Plugins in Bezug auf die Leistung und nutze Browser-Development-Tools und/oder Online-Dienste wie Google Pagespeed Insights, Pingdom und GTmetrix, um die Auswirkungen der einzelnen Plugins auf die Seitenladezeit zu bewerten.
  • Installiere keine unnötigen Plugins: es sollte offensichtlich sein, aber es ist erwähnenswert, dass du niemals ein Plugin installieren solltest, das du aus Sicherheits- und Performance-Gründen nicht wirklich brauchst. Stelle außerdem sicher, dass du deine Plugins von Zeit zu Zeit überprüfst und die nicht benötigten und nicht mehr verwendeten deinstallierst.
WordPress Plugin Verzeichnis bietet relevante Informationen, die wir bei der Auswahl eines Plugins immer berücksichtigen sollten
WordPress Plugin Verzeichnis bietet relevante Informationen, die wir bei der Auswahl eines Plugins immer berücksichtigen sollten

Ein Praxisbeispiel

Contact Form 7 ist ein großartiges Plugin, das Formulare in WordPress erstellt und anzeigt. Es ist ein perfektes Beispiel für unsere Zwecke, da es die folgenden Dateien auf jeder Seite beinhaltet, auch wenn die Seite kein Formular enthält:

  • style.css
  • scripts.js
Das Chrome DevTools Netzwerk-Panel bietet detaillierte Informationen über die Netzwerkanfragen, die beim Laden einer Seite gemacht werden
Das Chrome DevTools Netzwerk-Panel bietet detaillierte Informationen über die Netzwerkanfragen, die beim Laden einer Seite gemacht werden

Ein Plugin kann deine Website verlangsamen, aber wir können WordPress zwingen, Plugins je nach Anfrage-URL selektiv zu deaktivieren. Wenn du ein Entwickler bist, lies über den nächsten Abschnitt, wo wir lernen, wie man Plugins programmatisch verwaltet und ein mu-Plugin erstellt, das unnötige Plugins filtert. Wenn du kein Entwickler bist, kannst du in den Abschnitt über Plugins, die das Filtern und Organisieren von Plugins ermöglichen, gehen.

Wie man eine Liste aller aktiven Plugins programmgesteuert erhält

Als erstes kannst du eine Liste aller aktiven Plugins auf deiner WordPress Webseite mit einem einfachen Schnipsel PHP-Code erhalten. Du kannst den folgenden Code entweder in einem eigenen Plugin oder im Editor eines kostenlosen WordPress-Plugins wie Code Snippets hinzufügen. Wenn du dich für dein eigenes Plugin entscheiden würdest, vergiss nur nicht, den Plugin-Header wie unten gezeigt hinzuzufügen.

Aktive Plugins in der Tabelle wp_options
Aktive Plugins in der Tabelle wp_options

Jedes aktive Plugin wird in der Tabelle wp_options gespeichert, wobei options_name active_plugins ist. So können wir die Liste dieser Plugins mit einem einfachen get_option-Aufruf extrahieren. Hier ist der Code:

<?php
/**
 * @package active-plugins
 * @version 1.0
 *
 * Plugin Name: Active Plugins
 * Plugin URI: http://wordpress.org/extend/plugins/#
 * Description: This is a development plugin 
 * Author: Your Name
 * Version: 1.0
 * Author URI: https://example.com/
 */

add_shortcode( 'activeplugins', function(){
	
	$active_plugins = get_option( 'active_plugins' );
	$plugins = "";
	if( count( $active_plugins ) > 0 ){
		$plugins = "<ul>";
		foreach ( $active_plugins as $plugin ) {
			$plugins .= "<li>" . $plugin . "</li>";
		}
		$plugins .= "</ul>";
	}
	return $plugins;
});

Ändere die Plugin-Details, speichere dann die Datei active-plugins.php und lade sie in deinen /wp-content/plugins/ Ordner hoch. Erstelle einen neuen Blog-Eintrag und füge den Shortcode [activeplugins] ein. Es sollte nun eine Liste aller aktiven Plugins angezeigt werden.

Liste der aktiven Plugins
Die Liste der aktiven Plugins zeigt den Ordner und den Namen des jeweiligen Plugins

With that being done, we can go a step further and add or remove plugins programmatically by taking advantage of the option_active_plugins filter. This filter belongs to the option_$option_name group of filters, which allow to filter any option after it’s been retrieved from the database. Since all active plugins are stored in wp_options table where option_value is active_plugins, the option_active_plugins filter provides a way to programmatically activate or deactivate plugins.

Wenn das getan ist, können wir einen Schritt weiter gehen und Plugins programmgesteuert hinzufügen oder entfernen, indem wir den option_active_plugins Filter ausnutzen. Dieser Filter gehört zur Gruppe der Filter option_$option_name, die es erlauben, jede Option zu filtern, nachdem sie aus der Datenbank geholt wurde. Da alle aktiven Plugins in der Tabelle wp_options gespeichert sind, in der option_value active_plugins ist, bietet der Filter option_active_plugins einen Weg, um Plugins programmgesteuert zu aktivieren oder zu deaktivieren.

Wir können also ein Plugin programmgesteuert aktivieren. Nehmen wir als Beispiel an, du möchtest das ACF-Plugin aktivieren. Hier ist der Code:

add_filter( 'option_active_plugins', function( $plugins ){

	$myplugin = "advanced-custom-fields/acf.php";

	if( !in_array( $myplugin, $plugins ) ){
		$plugins[] = $myplugin;
	}

	return $plugins;

} );

In diesem Beispiel gehen wir davon aus, dass das Plugin installiert und noch nicht aktiviert wurde.

Der obige Code fügt das Plugin einfach in die Liste der aktiven Plugins auf jeder Seite unserer Website ein. Nicht sehr nützlich, aber du verstehst den Punkt.

Außerdem sollte das Plugin vor jedem anderen Plugin geladen werden, sonst könnte unser Code nicht wie erwartet funktionieren. Um unsere Plugin-Ladung zu priorisieren, müssen wir unser Skript in einem Must-Use-Plugin hinzufügen.

Wie man ein Must-use-Plugin zur programmatischen Deaktivierung von Plugins erstellt

Wir werden ein Must Use Plugin bauen, welches ein Plugin ist, das in einem bestimmten /wp-content Unterordner liegt und vor jedem regulären Plugin läuft.

Leider ist es uns in dieser Situation nicht erlaubt, bedingte Tags zu verwenden, da bedingte Abfrage-Tags nicht funktionieren, bevor die Abfrage ausgeführt wird. Davor geben sie immer false zurück. Wir müssen also unsere Bedingungen anderweitig überprüfen, z.B. durch Parsen der Anfrage-URI und Überprüfung des entsprechenden URL-Pfades.

Füge den folgenden Code in die Datei active-plugins.php ein und verschiebe ihn dann nach /wp-content/mu-plugins:

$request_uri = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );

$is_admin = strpos( $request_uri, '/wp-admin/' );

if( false === $is_admin ){
	add_filter( 'option_active_plugins', function( $plugins ){

		global $request_uri;

		$is_contact_page = strpos( $request_uri, '/contact/' );

		$myplugin = "contact-form-7/wp-contact-form-7.php";

		$k = array_search( $myplugin, $plugins );

		if( false !== $k && false === $is_contact_page ){
			unset( $plugins[$k] );
		}

		return $plugins;

	} );
}

Tauchen wir in diesen Code ein:

  • parse_url gibt den Pfad der angeforderten URL zurück.
  • strpos findet die Position des ersten Vorkommens von ‚/wp-admin/‚ und gibt false zurück, wenn der String nicht gefunden wird. Die Variable $is_admin speichert den zurückgegebenen Wert.
  • Die Bedingung verhindert, dass der Filter im Admin-Panel ausgeführt wird, so dass wir sicher auf die Plugin-Einstellungsseiten zugreifen können. Wenn die Anfrage-URI nicht ‚/wp-admin/‚ enthält, rufen wir den option_active_plugins Filter auf.
  • Schließlich, wenn das aktuelle Plugin nicht im Array der aktiven Plugins ist und die URI der aktuellen Seite nicht /contact/ enthält, entfernen wir das Plugin aus $plugins.

Speichere nun dein Plugin und lade es in deinen /wp-content/mu-plugins/ Ordner hoch. Leere den Cache und füge den Shortcode [activeplugins] auf mehreren Seiten hinzu. Er sollte in der Liste nur auf der Seite /contact/ angezeigt werden.

Keine CF7 script
Die Datei script.js verschwand aus der Liste der Seitenobjekte

Wir können dann ein Array von Plugins auf einmal mit nur ein wenig zusätzlichem PHP aufheben.

$request_uri = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );

$is_admin = strpos( $request_uri, '/wp-admin/' );

if( false === $is_admin ){
	add_filter( 'option_active_plugins', function( $plugins ){

		global $request_uri;

		$is_contact_page = strpos( $request_uri, '/contact/' );

		$myplugins = array( 
			"contact-form-7/wp-contact-form-7.php", 
			"code-snippets/code-snippets.php",
			"query-monitor/query-monitor.php",
			"autoptimize/autoptimize.php" 
		);

		if( false === $is_contact_page ){
			$plugins = array_diff( $plugins, $myplugins );
		}

		return $plugins;

	} );
}

In diesem Beispiel haben wir zuerst ein Array von Plugins definiert, die entfernt werden sollen, dann entfernen wir sie mit array_diff. Diese Funktion „vergleicht array1 mit einem oder mehreren anderen Arrays und gibt die Werte in array1 zurück, die in keinem der anderen Arrays vorhanden sind“.

Du kannst den vollständigen Code dieses Plugins von Gist herunterladen.

Nun kannst du das Plugin in den mu-plugins Ordner hochladen und jede Seite deiner Webseite inspizieren. Das mu-Plugin kann stark angepasst werden, indem mehr Bedingungen hinzugefügt und mehr URIs überprüft werden, aber jede Bedingung muss manuell in den Code eingefügt werden, und auf lange Sicht könnte dieses einfache mu-Plugin schwierig und mühsam zu warten sein.

Aus diesem Grund solltest du die folgenden Plugins ausprobieren.

Plugins die Plugins filtern

Als Alternative können wir uns eine Reihe von guten Plugins ansehen, die es uns erlauben, Filter hinzuzufügen, die über das WordPress-Administrationspanel verwaltet werden können.

Plugin Load Filter

Plugin Load Filter ist eine kostenlose Option für WordPress-Benutzer, die Plugins unter verschiedenen Bedingungen filtern müssen.

Plugin Load Filter
Plugin Load Filter ermöglicht es, Plugins sowohl im Admin-Panel als auch in den Seiten der Website zu filtern

Derzeit unterstützt es die folgenden Funktionen:

  • Post-Formate
  • Benutzerdefinierte Posttypen
  • Jetpack-Module
  • WP Inhaltskarte einbetten
  • URL-Filter für Experten (REST API / Heartbeat / AJAX / AMP / etc)

Sobald ein Filter aktiviert wurde, kann der Admin-Benutzer angeben, wo auf der Website er angewendet werden soll, wie im Bild unten gezeigt.

Page Type Filter Activation tab
Sobald können die Site-Administratoren ihre Ausnahmen im Tab „Page Type Filter Activation“ festlegen

Plugin Organizer

Der Plugin Organizer ist ein beliebtes Plugin mit über 10.000 aktiven Installationen und einer beeindruckenden Bewertung von 5 von 5 Sternen. Es ist ein umfassenderes Plugin, das den Site-Admins die Möglichkeit gibt, diese zu installieren:

  • Selektive Deaktivierung von Plugins nach Posttyp und Anfrage-URL
  • Selektive Deaktivierung von Plugins nach Benutzerrollen
  • Gruppen von Plugins erstellen
  • Ändere die Ladefolge des Plugins
  • Weitere Merkmale
Plugin Organizer Einstellungen
Plugin Organizer Einstellungen

Die Seite mit den Optionen für globale Plugins bietet eine Drag&Drop-Möglichkeit, die es dem Admin-Benutzer erlaubt, Plugins global zu deaktivieren, wodurch verhindert wird, dass WordPress ein oder mehrere Plugins irgendwo auf der Website ausführen kann, es sei denn, es ist für einzelne Beiträge oder Seiten anders angegeben. Das gleiche Feature ist für die Suchseite und die Beitragsarten verfügbar.

CF7 wurde global deaktiviert
CF7 wurde global deaktiviert

Das Plugin fügt eine Metabox im Post-Editing-Screen hinzu, so dass der Admin die globalen und Posttyp-Einstellungen überschreiben kann. Dieses Feature kann auch für Posttypen aktiviert werden, indem man den entsprechenden Punkt im Bildschirm Allgemeine Einstellungen markiert. Ein großartiges Feature ist die Plugin Organizer Debug Message, die dem Site-Administrator nützliche Informationen über Plugins, die jede Site-Seite betreffen, zur Verfügung stellt.

Weitere Informationen findet man in deren Dokumentation.

Plugin Organizer benutzerdefinierte Metabox auf der Kontaktseite
Plugin Organizer benutzerdefinierte Metabox auf der Kontaktseite

Perfmatters Plugin

Ein teilweise anderer Ansatz kommt vom Perfmatters-Plugin. Es ist eine Premium-Alternative, die es dem Site-Administrator erlaubt, Theme- und Plugin-Assets selektiv zu laden, je nach URL oder benutzerdefiniertem Posttyp. Es ist ein großartiges Werkzeug für die Optimierung von Plugins und Themes. Tatsächlich wurde es von einem Teammitglied von Kinsta entwickelt!

Perfmatters Script Manager
Perfmatters Script Manager

Das Plugin hat eine Funktion namens Script Manager, bei der alles nach dem Plugin- oder Theme-Namen gruppiert wird. Dadurch ist es sehr einfach, ein ganzes Plugin auf einmal oder einzelne CSS– und JavaScript-Dateien innerhalb des Plugins zu deaktivieren.

Du kannst sogar Skripte mit regex deaktivieren. Dies ist besonders hilfreich für Seiten, die eine komplexere URL-Struktur haben oder dynamisch generierte Seiten.

Dies ist sehr mächtig und kann die Geschwindigkeit auf deinen WordPress Seiten (insbesondere deiner Homepage) drastisch erhöhen. Ein paar Beispiele, wofür dies genutzt werden kann:

  • Social-Media-Sharing-Plugins sollten nur auf deine Beiträge geladen werden. Du kannst es einfach überall deaktivieren und nur auf Posttypen oder sogar auf benutzerdefinierte Posttypen laden.
  • Das beliebte Contact Form 7 Plugin lädt sich auf jeder Seite und jedem Beitrag selbst. Du kannst es einfach überall mit einem Klick deaktivieren und nur auf deiner Kontaktseite aktivieren.
  • Wenn du auf WordPress 5.0 upgegradet hast, aber nicht den Gutenberg-Block-Editor benutzt, vielleicht benutzt du immer noch den klassischen Editor, es gibt zwei zusätzliche Front-End-Skripte, die site-weit hinzugefügt werden und die du deaktivieren kannst: /wp-includes/css/dist/block-library/style.min.css und /wp-includes/css/dist/block-library/theme.min.css

Du kannst aus diesem Bericht über Perfmatters sehen, es hat ihre gesamten Ladezeiten um 20,2% reduziert. Allein auf ihrer Homepage konnten sie die Anzahl der HTTP-Anfragen von 46 auf 30 reduzieren! Auch die Seitengröße schrumpfte von 506,3 KB auf 451,6 KB.

Speedtest mit dem Perfmatters Plugin
Speedtest mit dem Perfmatters Plugin

Wie man die Leistung verfolgt: Die Dev-Tools des Browsers

Ein grundlegender Schritt auf dem Weg zur Leistungsoptimierung ist die Messung der Ladezeit. Wir verfügen über eine Reihe von Plugins und Online-Tools, mit denen wir die Performance der Website verfolgen können, wie z.B. Google Pagespeed Insights und Pingdom. Vor allem aber können wir die Dev Tools des Browsers nutzen, die uns viele aussagekräftige Informationen liefern.

Jeder Browser-Inspektor verfügt über ein Netzwerk-Panel, das eine Liste von Netzwerkanfragen und zugehörigen Informationen anzeigt. Folge diesen Links für eine ausführliche Dokumentation:

In einer WordPress-Installation mit achtzehn aktiven Plugins haben wir wiederholt eine Post-Seite mit den Firefox-Dev-Tools inspiziert. Wir haben zunächst die Geschwindigkeit der Seite gemessen und die angeforderten Ressourcen aufgelistet, bevor wir ein Filter-Plugin installiert haben. Das folgende Bild zeigt die Ausgabe des im Firefox Netzwerkmonitor verfügbaren Performance-Analyse-Tools.

Firefox Leistungsanalyse-Tool
Firefox Leistungsanalyse-Tool

Der Netzwerkmonitor liefert die folgenden Ergebnisse (leerer Cache):

  • Größe: 255.19 Kb
  • Ladezeit: 1,24 Sekunden
  • Anfragen: 12

Nachfolgend haben wir den Plugin Organizer installiert, um zu verhindern, dass WordPress das CF7-Plugin ausführt. Das Tortendiagramm ändert sich ein wenig.

Firefox Leistungsanalyse-Tool
Firefox Leistungsanalyse-Tool

Jetzt wird die Seite schneller geladen (leerer Cache):

  • Größe: 104.21 Kb
  • Ladezeit: 0,80 Sekunden
  • Anfragen: 8

Als nächstes haben wir einige unnötige Plugins deaktiviert, und das nächste Bild zeigt, wie sehr wir die Leistung der Seite verbessert haben.

Firefox Leistungsanalyse-Tool
Firefox Leistungsanalyse-Tool

Nachdem alle unnötigen Plugins deaktiviert wurden, liefert der leere Browser-Cache des Netzwerkmonitors die folgenden Daten:

  • Größe: 101.98 Kb
  • Ladezeit: 0,46 Sekunden
  • Anfragen: 8

Wir können die Ergebnisse unserer Tests vergleichen. Die Ressourcengröße wurde um 60,04% reduziert, die Ladezeit von 1,24 Sekunden auf 0,46 Sekunden verringert und die Anzahl der HTTP-Anfragen von 12 auf 8 reduziert. Dies bestätigt, dass Plugins die Seitenleistung beeinflussen können und dass wir die Seitengeschwindigkeit durch die Nutzung eines Plugin-Filters erhöhen können.

Zusammenfassung

Ob du deine eigenen Skripte erstellst oder Tools von Drittanbietern installierst, das Organisieren und Filtern von Plugins ist etwas, das du immer in Betracht ziehen solltest, wenn es um Leistungsoptimierung geht. Denke daran, dass nicht alle Plugins mit Blick auf die Performance entwickelt werden. Daher kann es sinnvoll sein, sich etwas Zeit zu nehmen und festzustellen, welche Plugin-Assets (CSS und JS) wo geladen werden.

Aber zu lernen, wie man WordPress-Plugins deaktiviert, ist nur eine von vielen anderen Techniken, die darauf abzielen, die Geschwindigkeit der Website zu erhöhen. Hier ist eine Liste mit einigen anderen hilfreichen Anleitungen und Tutorials, die sich auf die Leistung der Website beziehen:

Carlo Daniele Kinsta

Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.