WordPress-Hooks: Wo finde ich eine Übersicht aller Actions und Filter?

Veröffentlicht am

· von Norbert Hofmann

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:

ActionFilter
ZweckEtwas tun an einem bestimmten ZeitpunktEinen Wert verändern und zurückgeben
Ausgelöst mitdo_action( 'name', ... )apply_filters( 'name', $wert, ... )
Einhängen mitadd_action()add_filter()
Rückgabewertkeiner nötigPflicht, sonst ist der Wert weg
Beispielwp_head: Code in den Kopfbereich schreibenthe_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.

HookWofür typisch
muplugins_loadedMust-Use-Plugins sind geladen
plugins_loadedAlle Plugins sind geladen. Prüfen, ob andere Plugins vorhanden sind
after_setup_themeTheme-Unterstützung registrieren (add_theme_support)
initBeitragstypen, Taxonomien, Blöcke, Shortcodes registrieren, Übersetzungen laden
wp_loadedWordPress ist vollständig geladen, Formulare verarbeiten
parse_request / pre_get_postsAnfrage auswerten, Hauptabfrage anpassen
wpAbfrage ist fertig, bedingte Tags wie is_single() funktionieren
template_redirectWeiterleitungen, bevor das Template geladen wird
wp_enqueue_scriptsCSS und JavaScript einbinden
wp_head / wp_footerAusgabe im Kopf- bzw. Fußbereich
shutdownKurz 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.

Quellen

Über den Autor: Norbert Hofmann

Norbert betreibt das WPDE-Forum und hat jahrelang im technischen Support eines Webhosters täglich WordPress-Seiten betreut. Heute arbeitet er als Cyber Defense Analyst, hat Sicherheitslücken in WordPress-Plugins gefunden (veröffentlichte CVEs) und engagiert sich mit deepfake.de gegen Betrug mit Deepfakes. Mehr auf norberthofmann.com.

Weitere Antworten