WordPress mu-plugin erstellen: So geht’s

Ein WordPress-mu-plugin (Must-Use-Plugin) ist eine PHP-Datei im Verzeichnis wp-content/mu-plugins/, die WordPress bei jedem Aufruf automatisch lädt. Es lässt sich nicht über den Admin-Bereich deaktivieren und wird vor jedem regulären Plugin ausgeführt. Nutzen Sie es für Code, der immer vorhanden sein muss: eigene Hooks, Sicherheitsregeln, Performance-Anpassungen oder früh geladene Konstanten.

Ein weiterer Anwendungsfall für ein mu-plugin besteht darin, einem Plugin oder dem WP-Core zusätzliche Funktionen hinzuzufügen. WP STAGING verfügt beispielsweise über zahlreiche Filter und Hooks, die der Staging- oder Backup-Funktion von WP STAGING weitere Möglichkeiten verleihen können. All diese dokumentierten Filter können in ein eigenes mu-plugin aufgenommen werden.

Kurze Antwort: Legen Sie eine .php-Datei mit einem Plugin-Header in wp-content/mu-plugins/ ab. WordPress erkennt sie beim nächsten Seitenaufruf, ganz ohne Aktivierung. Prüfen Sie unter Plugins → Must-Use-Plugins, ob sie geladen wurde.

Einführung in Must-Use-Plugins

Mu-plugins liegen im Verzeichnis wp-content/mu-plugins/ (der Pfad wird über die Konstante WPMU_PLUGIN_DIR gesteuert) und werden von WordPress vor jedem Plugin in wp-content/plugins/ geladen. Sie erscheinen nicht in der Standard-Plugin-Liste und lassen sich nicht über die Admin-Oberfläche deaktivieren.

Das häufigste Szenario, in dem Entwickler zu einem mu-plugin greifen: Sie haben eine Funktion oder einen Filter, der immer wieder ausfällt, weil ein anderer Administrator das Plugin deaktiviert, das ihn enthielt, oder weil ein Plugin-Update eine Anpassung überschreibt. Ein mu-plugin beseitigt beide Risiken auf einen Schlag.

Die offizielle WordPress-Dokumentation behandelt Must-Use-Plugins unter wordpress.org/documentation/article/must-use-plugins/.

Wie schneidet ein mu-plugin im Vergleich zu anderen Orten ab, an denen Sie denselben Code ablegen könnten?

Option Lädt automatisch Übersteht Plugin-Updates Admin kann deaktivieren Am besten geeignet für
mu-plugin Ja Ja Nein Immer benötigte Hooks, Konstanten, Sicherheitsregeln
Reguläres Plugin Nur wenn aktiv Ja Ja Optionale Funktionen unter Kontrolle des Website-Betreibers
wp-config.php Ja Ja Nein Nur PHP-define()-Konstanten
.htaccess / php.ini Ja (Serverebene) Ja Nein Server-Rewrites und PHP-ini-Einstellungen

Vorteile von Mu-Plugins

Der wichtigste Vorteil gegenüber einem regulären Plugin ist die Manipulationssicherheit. Ein reguläres Plugin kann von jedem Benutzer mit Administratorrechten deaktiviert oder bei kompromittierten Zugangsdaten entfernt werden. Ein mu-plugin nicht.

Nutzen Sie ein mu-plugin, wenn:

  • Code auch dann laufen muss, wenn alle regulären Plugins deaktiviert sind (eine Wartungs-Weiterleitung, ein Sicherheits-Header, eine erzwungene HTTPS-Regel)
  • Sie WP STAGING-Aktionen und -Filter registrieren, die vor der Initialisierung des Plugins selbst geladen werden müssen
  • Sie mehrere WordPress-Sites verwalten und seitenspezifisches Verhalten außerhalb versionierter Plugins wünschen
  • Sie PHP-Laufzeiteinstellungen (etwa memory_limit) früh im Request-Lebenszyklus anwenden möchten

Nutzen Sie ein reguläres Plugin, wenn:

  • Die Funktion vom Website-Betreiber oder einem Entwickler ein- und ausschaltbar sein soll
  • Die Funktionalität als installierbares Produkt mit Auto-Updates ausgeliefert wird
  • Sie etwas entwickeln, das andere Plugins über is_plugin_active() erkennen

So erstellen Sie ein WordPress-mu-plugin

Schritt 1: Auf die Dateien Ihrer Website zugreifen

Verbinden Sie sich mit Ihrer Website per FTP, SFTP oder über den Dateimanager Ihres Webhosts.

Schritt 2: Das Verzeichnis mu-plugins finden oder erstellen

Navigieren Sie zu wp-content/. Suchen Sie den Ordner mu-plugins/. Falls er nicht existiert, erstellen Sie ihn. WordPress lädt PHP-Dateien aus diesem Verzeichnis sofort, ohne weitere Konfiguration.

Schritt 3: Ihre Plugin-Datei erstellen

Erstellen Sie eine neue PHP-Datei, zum Beispiel my-mu-plugin.php. Verwenden Sie im Dateinamen Kleinbuchstaben und Bindestriche (keine Leerzeichen). Der Dateiname erscheint im WordPress-Admin unter Plugins → Must-Use-Plugins, wählen Sie also einen aussagekräftigen Namen.

Schritt 4: Den Plugin-Header und Ihren Code hinzufügen

Jedes mu-plugin benötigt am Anfang einen Plugin-Header-Kommentar, genau wie ein reguläres Plugin. Nachfolgend die minimale Struktur:

PHP
<?php
/*
Plugin Name: My Custom Mu-Plugin
Description: A custom must-use plugin to enhance my WordPress site.
Version: 1.0
Author: Mickey Mouse
*/

// Your custom code goes here

Schritt 5: Ihr Mu-Plugin hochladen

Laden Sie die .php-Datei in das Verzeichnis wp-content/mu-plugins/ auf Ihrem Server hoch.

Schritt 6: Aktivierung überprüfen

Es gibt keinen Aktivierungsschritt. Öffnen Sie im WordPress-Admin Plugins → Must-Use-Plugins, um zu bestätigen, dass die Datei geladen wurde. Erscheint sie nicht, prüfen Sie, ob die Datei direkt in mu-plugins/ liegt (und nicht in einem Unterverzeichnis).

Beispiel-Mu-Plugin: Eigener Admin-Footer-Text

Hier ist ein vollständiges, funktionierendes Beispiel, das den Footer-Text am unteren Rand jeder WordPress-Admin-Seite ändert:

PHP
<?php
/*
Plugin Name: Custom Admin Footer
Description: Changes the footer text in the WordPress admin area.
Version: 1.0
Author: Your Name
*/

add_filter('admin_footer_text', function () {
    echo 'Customized by Tony Stark - Powered by WordPress';
});

Häufige Anwendungsfälle für mu-plugins

Dies sind die Muster, die in WP STAGING-Support-Tickets und in Entwicklerforen am häufigsten auftauchen:

1. Debug-Logging erzwingen, ohne wp-config.php zu bearbeiten

<?php
/*
Plugin Name: Enable Debug Log
*/
if ( ! defined( 'WP_DEBUG' ) ) {
    define( 'WP_DEBUG', true );
}
if ( ! defined( 'WP_DEBUG_LOG' ) ) {
    define( 'WP_DEBUG_LOG', true );
}
if ( ! defined( 'WP_DEBUG_DISPLAY' ) ) {
    define( 'WP_DEBUG_DISPLAY', false );
}

Das ist nützlich in Staging- oder Entwicklungsumgebungen, in denen Sie das Logging aktivieren möchten, ohne die produktive wp-config.php anzufassen. Den vollständigen Debugging-Workflow finden Sie unter Enable WordPress Debug Log Mode.

2. Das PHP-Speicherlimit erhöhen

Die ini-Direktive memory_limit lässt sich zur Laufzeit über ini_set() ändern, was ein mu-plugin zu einem sauberen Ort macht, um sie anzuwenden, bevor reguläre Plugins geladen werden:

<?php
/*
Plugin Name: Increase Memory Limit
*/
@ini_set( 'memory_limit', '256M' );

Hinweis: Einige PHP-Einstellungen sind auf Serverebene fixiert und können zur Laufzeit nicht über ini_set() geändert werden. Eine vollständige Referenz, welche Direktiven Laufzeitänderungen akzeptieren, finden Sie unter php.net/manual/en/ini.list.php.

3. WP STAGING-Filtercode

WP STAGING stellt dokumentierte Aktionen und Filter bereit, um das Backup- und Staging-Verhalten zu steuern. Da diese vor der Initialisierung von WP STAGING selbst geladen werden müssen, ist ein mu-plugin der richtige Ort, um sie zu registrieren. Platzieren Sie beliebige add_filter()– oder add_action()-Aufrufe in einer mu-plugin-Datei, und sie sind unabhängig von der Aktivierungsreihenfolge der Plugins immer vorhanden. Alle verfügbaren Hooks finden Sie in der WP STAGING-Dokumentation zu Aktionen und Filtern, die unten unter „Verwandte Artikel“ verlinkt ist.

4. Erzwungene HTTPS-Weiterleitung

<?php
/*
Plugin Name: Force HTTPS
*/
add_action( 'template_redirect', function () {
    if ( ! is_ssl() ) {
        wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301 );
        exit;
    }
} );

5. XML-RPC deaktivieren

<?php
/*
Plugin Name: Disable XML-RPC
*/
add_filter( 'xmlrpc_enabled', '__return_false' );

Einschränkungen und Fallstricke

Bevor Sie sich für ein mu-plugin entscheiden, sollten Sie einige Verhaltensweisen kennen:

Kein Deaktivierungs- oder Deinstallations-Hook. WordPress löst für mu-plugins niemals deactivate_{plugin} oder uninstall_{plugin} aus. Wenn Ihr Plugin Optionen, eigene Tabellen oder geplante Cron-Events anlegt, müssen Sie diese manuell aufräumen: die Datei löschen und anschließend die gespeicherten Daten von Hand entfernen.

Laden aus Unterverzeichnissen erfordert eine Loader-Datei. WordPress lädt nur PHP-Dateien, die direkt in wp-content/mu-plugins/ liegen. Wenn Sie Code in ein Unterverzeichnis legen (zum Beispiel mu-plugins/my-plugin/my-plugin.php), erkennt WordPress ihn nicht. Das übliche Muster besteht darin, eine schlanke Loader-Datei im Stammverzeichnis von mu-plugins/ anzulegen, die die Datei im Unterverzeichnis per require_once einbindet.

Verhalten im Multisite-Betrieb. In einem WordPress-Multisite-Netzwerk werden mu-plugins bei jedem Request über alle Sites hinweg geladen. Es gibt keinen Schalter pro Site. Verwenden Sie is_main_site() oder get_current_blog_id() innerhalb des Plugins, wenn Sie das Verhalten auf eine bestimmte Site im Netzwerk beschränken möchten.

Ladereihenfolge. Mu-plugins werden in aufsteigender alphabetischer Reihenfolge nach Dateiname geladen, vor jedem Plugin in wp-content/plugins/. Wenn die Reihenfolge zwischen Ihren mu-plugins wichtig ist, stellen Sie dem Dateinamen ein Präfix voran: 00-runs-first.php, 10-runs-second.php.

Sichtbarkeit im Admin-Bereich. Mu-plugins erscheinen unter Plugins → Must-Use-Plugins, zeigen aber keine Details an, sofern der Plugin-Header nicht Plugin Name, Description und Version enthält. Fügen Sie stets einen Header hinzu; das beschleunigt die Diagnose erheblich, wenn etwas schiefgeht.

Kein Update-Mechanismus. WordPress hat keine eingebaute Möglichkeit, Sie über mu-plugins zu informieren oder sie zu aktualisieren. Wenn Sie Fremdcode für ein mu-plugin anpassen, sind Sie selbst dafür verantwortlich, Updates zu verfolgen und manuell einzuspielen. Bei intern entwickelten mu-plugins ist das kein Problem, aber es ist erwähnenswert, falls Sie erwägen, ein Community-Plugin in ein mu-plugin umzuwandeln.

Wohin gehört dieser Code?

Szenario Bester Ort
PHP-Konstante oder define() wp-config.php
Server-Rewrite-Regel .htaccess
PHP-Speicher- oder Ausführungslimit .htaccess (über php_value) oder php.ini
Code mit WordPress-Funktionen, der immer laufen muss mu-plugin in wp-content/mu-plugins/
Optionale Funktion unter Kontrolle des Website-Betreibers Reguläres Plugin in wp-content/plugins/
Theme-spezifische Ausgabe oder Style-Änderungen functions.php des Child-Themes

Eine nützliche Faustregel: Wenn Ihr Code eine WordPress-Funktion aufruft (add_filter, get_option, wp_redirect usw.), gehört er in ein mu-plugin. Handelt es sich um ein reines PHP-define() oder eine Anpassung, die laufen muss, bevor WordPress startet, ist wp-config.php der richtige Ort.

Fazit

Ein mu-plugin ist das richtige Werkzeug für Code, der immer laufen muss und nicht Gefahr laufen darf, versehentlich abgeschaltet zu werden. Die Einrichtung dauert nur wenige Minuten: Erstellen Sie wp-content/mu-plugins/, fügen Sie eine .php-Datei mit einem Plugin-Header hinzu, und WordPress erledigt den Rest.

Wenn Sie eigenen mu-plugin-Code entwickeln oder testen, empfehlen wir, ihn in einer Staging-Umgebung zu überprüfen, bevor Sie ihn in Produktion einsetzen. Mit WP STAGING klonen Sie Ihre Live-Site unkompliziert und stellen sicher, dass sich das mu-plugin wie erwartet verhält, bevor Ihre Änderungen live gehen.

Verwandte Artikel

Rene Hermenau

Autor: Rene Hermenau

Über den Autor: René Hermenau ist Gründer von WP STAGING. Er arbeitet an WordPress-Backups, Staging, Migrationen, Datenbankverarbeitung und sicheren Deployment-Workflows.