Kurz gesagt: Die offizielle, vollständige Übersicht aller Hooks steht in der WordPress Code Reference unter „Hooks“, mit Suchfunktion, Parametern und Fundstelle im Quellcode. Welche Hooks auf einer konkreten Seite deiner Installation tatsächlich laufen, zeigt dir das Plugin Query Monitor. Hooks von Plugins und Themes findest du in deren Dokumentation oder im Code, indem du nach do_action und apply_filters suchst.
Actions und Filter: der Unterschied
Hooks sind Einstiegspunkte, an denen WordPress fremden Code ausführt. So erweitern Plugins und Themes WordPress, ohne den Core zu verändern. Es gibt zwei Arten:
| Action | Filter | |
|---|---|---|
| Zweck | Etwas tun an einem bestimmten Zeitpunkt | Einen Wert verändern und zurückgeben |
| Ausgelöst mit | do_action( 'name', ... ) | apply_filters( 'name', $wert, ... ) |
| Einhängen mit | add_action() | add_filter() |
| Rückgabewert | keiner nötig | Pflicht, sonst ist der Wert weg |
| Beispiel | wp_head: Code in den Kopfbereich schreiben | the_content: Beitragsinhalt vor der Ausgabe ändern |
Ein Beispiel für beide Arten:
// Action: Hinweis in den Footer schreiben
add_action( 'wp_footer', function () {
echo '<!-- Hallo aus dem Footer -->';
} );
// Filter: unter jedem Beitrag einen Satz anhängen
add_filter( 'the_content', function ( $content ) {
if ( is_singular( 'post' ) && in_the_loop() && is_main_query() ) {
$content .= '<p>Danke fürs Lesen!</p>';
}
return $content; // niemals vergessen
} );
Wo du Hooks findest
- Code Reference (Core): developer.wordpress.org/reference/hooks/ listet alle Hooks des Cores. Jede Seite zeigt Parameter, Version („Since“), Fundstelle und oft Beispiele aus der Community.
- Plugin Handbook: Die Einführung in Hooks mit Erklärungen zu Priorität und Parametern steht im Plugin Handbook.
- Query Monitor: Das kostenlose Plugin zeigt im Bereich „Hooks & Actions“ für die aktuelle Seite, welche Hooks gelaufen sind und welche Funktionen daran hängen, jeweils mit Priorität und Herkunft (Core, Plugin, Theme).
- Plugins und Themes: Große Plugins wie WooCommerce haben eigene Hook-Referenzen in ihrer Entwicklerdokumentation. Sonst hilft die Suche im Code.
Die wichtigsten Hooks in Ladereihenfolge
Bei einem normalen Seitenaufruf im Frontend laufen unter anderem diese Actions in dieser Reihenfolge. Die Reihenfolge ist wichtig: Wer zu früh einsteigt, findet manches noch nicht vor.
| Hook | Wofür typisch |
|---|---|
muplugins_loaded | Must-Use-Plugins sind geladen |
plugins_loaded | Alle Plugins sind geladen. Prüfen, ob andere Plugins vorhanden sind |
after_setup_theme | Theme-Unterstützung registrieren (add_theme_support) |
init | Beitragstypen, Taxonomien, Blöcke, Shortcodes registrieren, Übersetzungen laden |
wp_loaded | WordPress ist vollständig geladen, Formulare verarbeiten |
parse_request / pre_get_posts | Anfrage auswerten, Hauptabfrage anpassen |
wp | Abfrage ist fertig, bedingte Tags wie is_single() funktionieren |
template_redirect | Weiterleitungen, bevor das Template geladen wird |
wp_enqueue_scripts | CSS und JavaScript einbinden |
wp_head / wp_footer | Ausgabe im Kopf- bzw. Fußbereich |
shutdown | Kurz vor Ende der Anfrage |
Im Backend kommen unter anderem admin_init, admin_menu und admin_enqueue_scripts hinzu. Wer Header senden oder weiterleiten will, muss das vor der ersten Ausgabe tun, also spätestens bei template_redirect. Sonst gibt es die Meldung aus Cannot modify header information.
Für Fortgeschrittene: Priorität, Parameter, Entfernen und Debugging
// Priorität 20 (Standard 10, kleiner = früher), 2 Parameter annehmen
add_filter( 'the_title', 'wpde_titel_anpassen', 20, 2 );
function wpde_titel_anpassen( $title, $post_id ) {
return $title;
}
// Fremde Funktion entfernen: gleicher Hook, gleiche Priorität
remove_action( 'wp_head', 'wp_generator' );
// Hilfsfunktionen
did_action( 'init' ); // wie oft ist init schon gelaufen?
has_filter( 'the_content' ); // hängt etwas daran?
current_filter(); // welcher Hook läuft gerade?
Anonyme Funktionen (Closures) lassen sich mit remove_action() nicht gezielt entfernen, weil du keine Referenz auf sie hast. Wenn andere deinen Code anpassen können sollen, häng benannte Funktionen oder Methoden ein.
Alle Hooks eines Seitenaufrufs protokollierst du nur in einer Testumgebung mit dem Spezial-Hook all, der bei jedem Hook feuert:
add_action( 'all', function () {
static $gesehen = array();
$hook = current_filter();
if ( ! isset( $gesehen[ $hook ] ) ) {
$gesehen[ $hook ] = true;
error_log( $hook );
}
} );
In Plugin- oder Theme-Code findest du Hooks per Shell mit:
grep -rnoE "(do_action|apply_filters)\(\s*'[^']+'" wp-content/plugins/plugin-name | sort -u
Frage dazu? Du suchst den passenden Hook für eine bestimmte Aufgabe? Frag im WPDE-Forum unter „Plugins“ und beschreibe, was an welcher Stelle passieren soll.
Den Einstieg in die Plugin-Entwicklung findest du unter Wo finde ich eine Anleitung zur Plugin-Programmierung?, ein praktisches Beispiel mit widgets_init in Eigene Widgets schreiben. Den Überblick bietet der Hub WordPress-Plugins.
Häufige Fragen
Wo schreibe ich meinen Hook-Code hin?
Am besten in ein eigenes kleines Plugin oder in ein Code-Snippets-Plugin. Die functions.php des Themes geht auch, dann ist der Code bei einem Theme-Wechsel aber weg, und bei einem fremden Theme überschreibt ihn das nächste Update (dafür gibt es Child-Themes).
Mein Filter hat den ganzen Inhalt gelöscht. Warum?
Die Funktion hat nichts zurückgegeben. Ein Filter muss den (veränderten) Wert immer mit return zurückgeben, auch wenn er ihn in manchen Fällen gar nicht ändert.
Gibt es Hooks auch in JavaScript?
Ja. Der Block-Editor nutzt das Paket @wordpress/hooks mit addFilter() und addAction(), etwa um Blöcke um Einstellungen zu erweitern. Das Prinzip ist dasselbe wie in PHP.