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.phpeines 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
- Block-Themes, theme.json und Full Site Editing für Profis
- Anzeichen einer kompromittierten WordPress-Site
- Theme- und Plugin-Entwicklung im KI-Zeitalter