Zum Hauptinhalt springen

Wer WordPress anpasst, sollte das fast immer über Hooks tun, nicht durch Änderungen an Core-, Theme- oder Plugin-Dateien. Für site-weite Logik sind Must-Use-Plugins der richtige Ort.

Actions vs. Filter

  • Action (add_action): „Mach an dieser Stelle etwas.“ Kein Rückgabewert.
  • Filter (add_filter): „Verändere diesen Wert.“ Muss den (geänderten) Wert immer zurückgeben.
add_filter( 'xmlrpc_enabled', '__return_false' );

add_action( 'init', function () {
    remove_action( 'wp_head', 'wp_generator' );
} );

add_filter( 'upload_mimes', function ( array $mimes ): array {
    unset( $mimes['svg'] ); // SVG-Uploads unterbinden
    return $mimes;
}, 20 );

Prioritäten und Argumente

Standardpriorität ist 10; tiefere Zahlen laufen früher. Der vierte Parameter von add_filter bestimmt, wie viele Argumente übergeben werden. Um einen Hook entfernen zu können, muss remove_action mit derselben Callback-Referenz und Priorität aufgerufen werden. Anonyme Funktionen lassen sich deshalb nicht sauber entfernen; für wiederverwendbaren Code benannte Funktionen oder Klassenmethoden verwenden.

Hooks finden und debuggen

  • Query Monitor zeigt pro Request alle ausgeführten Hooks, Callbacks und deren Herkunft.
  • wp profile hook init --spotlight (WP-CLI-Paket profile-command) zeigt langsame Callbacks.
  • did_action( 'init' ) prüft, ob ein Hook schon gefeuert hat.

Must-Use-Plugins (mu-plugins)

Dateien in wp-content/mu-plugins/ werden automatisch und vor regulären Plugins geladen. Sie lassen sich im Backend nicht deaktivieren.

Geeignet für:

  • Härtungsregeln (XML-RPC aus, Header, Login-Anpassungen)
  • Umgebungsspezifische Logik (z. B. Mails auf Staging abfangen)
  • Custom Post Types und Taxonomien, die nicht vom Theme abhängen dürfen
  • Plugin-Load-Steuerung pro Request (z. B. schwere Plugins auf REST-Endpunkten nicht laden)

Zu beachten: Nur PHP-Dateien direkt im Ordner werden geladen, keine Unterordner. Für grössere MU-Plugins einen Loader verwenden:

<?php
// wp-content/mu-plugins/loader.php
require_once __DIR__ . '/flake-core/flake-core.php';

MU-Plugins erhalten keine automatischen Updates und erscheinen nicht in der normalen Plugin-Liste. Angreifer nutzen genau das gerne als Versteck. Deshalb gehört mu-plugins/ bei jeder Malware-Prüfung zur Pflichtkontrolle.

Best Practices

  • Funktionalität nie in die functions.php eines Themes, wenn sie einen Theme-Wechsel überleben muss.
  • Prefixes oder Namespaces verwenden, um Kollisionen zu vermeiden.
  • Code in Git versionieren, auch MU-Plugins.

Weiterführende Artikel

Quellen und Dokumentation