WordPress-Hooks-Verzeichnis
Ein durchsuchbares Verzeichnis der WordPress-Actions und -Filter, die Entwickler wirklich nutzen – mit der exakten add_action/add_filter-Signatur, dem Zeitpunkt, zu dem der Hook ausgelöst wird, einem funktionierenden Beispiel und dem Detail, über das man am häufigsten stolpert.
39 Hooks — mit der exakten add_action- / add_filter-Signatur, dem Zeitpunkt, zu dem sie ausgelöst werden, einem funktionierenden Beispiel und der Sache, über die man leicht stolpert. 1 sind als ungeprüft markiert — wir haben ihre Argumentanzahl nicht mit dem WordPress-Quellcode abgeglichen, und das kennzeichnen wir lieber, als eine Vermutung als Tatsache auszugeben.
Das ist nicht vollständig und gibt auch nicht vor, es zu sein — WordPress hat Tausende Hooks. Abgedeckt sind die, zu denen man tatsächlich greift.
Läuft, nachdem WordPress vollständig geladen ist, aber bevor irgendwelche Header gesendet werden. Der übliche Ort, um Custom Post Types, Taxonomien und Rewrite-Regeln zu registrieren.
Wird ausgelöst
Bei jeder Anfrage, im Frontend wie im Admin-Bereich, nachdem Core, Plugins und Theme geladen sind.
Signatur
add_action( 'init', 'my_callback' );Beispiel
add_action( 'init', function () {
register_post_type( 'book', array(
'public' => true,
'label' => 'Books',
'show_in_rest' => true, // required for the block editor
) );
} );Die Stolperfalle
init läuft bei JEDER Anfrage, auch bei AJAX, REST und Cron. Alles Langsame an dieser Stelle (eine HTTP-Anfrage, eine schwere Abfrage) belastet jeden einzelnen Seitenaufruf. Außerdem: Der aktuelle Benutzer ist hier verfügbar, aber du kannst noch nichts ausgeben – die Header sind noch nicht gesendet, stehen aber unmittelbar bevor.
Läuft, sobald das Theme geladen ist. Der richtige Ort für add_theme_support(), add_image_size() und das Registrieren von Navigationsmenüs.
Wird ausgelöst
Nachdem die functions.php des Themes geladen ist, VOR init.
Signatur
add_action( 'after_setup_theme', 'my_callback' );Beispiel
add_action( 'after_setup_theme', function () {
add_theme_support( 'post-thumbnails' );
add_theme_support( 'title-tag' );
add_image_size( 'card', 600, 400, true ); // true = hard crop
} );Die Stolperfalle
Bildgrößen auf init statt hier zu registrieren funktioniert in den meisten Fällen zufällig und scheitert dann in manchen auf rätselhafte Weise. Nutze after_setup_theme – genau dafür ist es da.
Läuft, sobald alle aktiven Plugins geladen sind. Der früheste sichere Zeitpunkt, um mit einem anderen Plugin zu interagieren.
Wird ausgelöst
Nachdem jede Plugin-Datei eingebunden ist, bevor das Theme geladen wird.
Signatur
add_action( 'plugins_loaded', 'my_callback' );Die Stolperfalle
Der aktuelle Benutzer ist hier NOCH NICHT verfügbar – wp_get_current_user() funktioniert nicht zuverlässig. Wenn du den Benutzer brauchst, nutze init.
Läuft, nachdem WordPress vollständig geladen ist – Plugins, Theme, init und der Benutzer sind alle bereit.
Wird ausgelöst
Nach init und nachdem der aktuelle Benutzer eingerichtet ist.
Signatur
add_action( 'wp_loaded', 'my_callback' );Läuft zu Beginn jeder Admin-Anfrage. Wird für register_setting(), Berechtigungsprüfungen und Weiterleitungen im Admin-Bereich verwendet.
Wird ausgelöst
Bei jeder Anfrage im Admin-Bereich.
Signatur
add_action( 'admin_init', 'my_callback' );Die Stolperfalle
Es wird auch bei admin-ajax.php-Anfragen ausgelöst, die eigentlich keine „Admin-Seiten“ sind. Wenn dein Callback davon ausgeht, dass eine Seite existiert, sichere ihn mit wp_doing_ajax() ab.
Der einzig richtige Ort, um CSS und JavaScript für das Frontend einzubinden.
Wird ausgelöst
Bei Seitenaufrufen im Frontend, bevor der Head gerendert wird.
Signatur
add_action( 'wp_enqueue_scripts', 'my_callback' );Beispiel
add_action( 'wp_enqueue_scripts', function () {
wp_enqueue_style(
'child-style',
get_stylesheet_uri(),
array( 'parent-style' ), // load AFTER the parent
wp_get_theme()->get( 'Version' ) // cache-bust on version change
);
} );Die Stolperfalle
Trotz des Namens kümmert es sich um STYLES ebenso wie um Skripte – einen Hook wp_enqueue_styles gibt es nicht, und Leute verschwenden echte Zeit mit der Suche danach. Außerdem: Es wird nicht im Admin-Bereich ausgelöst (nutze dort admin_enqueue_scripts) und nicht im Block-Editor (nutze enqueue_block_editor_assets).
Bindet CSS/JS im Admin-Bereich ein. Erhält das Hook-Suffix der aktuellen Seite, sodass du Assets nur auf einer einzigen Seite laden kannst.
Wird ausgelöst
Bei Seitenaufrufen im Admin-Bereich.
Signatur
add_action( 'admin_enqueue_scripts', 'my_callback' ); // receives $hook_suffixBeispiel
add_action( 'admin_enqueue_scripts', function ( $hook ) {
if ( 'settings_page_my-plugin' !== $hook ) {
return; // do not load our JS on every admin screen
}
wp_enqueue_script( 'my-admin', plugins_url( 'admin.js', __FILE__ ), array(), '1.0', true );
} );Die Stolperfalle
Nicht auf $hook zu prüfen ist die mit Abstand häufigste Ursache dafür, dass ein Plugin unbeteiligte Admin-Seiten kaputt macht. Lade deine Assets nur dort, wo sie gebraucht werden, und sonst nirgends.
Bindet Assets ausschließlich in den Block-Editor (Gutenberg) ein – nicht ins Frontend und nicht in den übrigen Admin-Bereich.
Wird ausgelöst
Wenn der Block-Editor geladen wird.
Signatur
add_action( 'enqueue_block_editor_assets', 'my_callback' );Gibt Inhalte in den <head> aus. Wird für Meta-Tags und inline eingebundenes kritisches CSS verwendet.
Wird ausgelöst
Innerhalb von <head>, im Frontend.
Signatur
add_action( 'wp_head', 'my_callback' );Die Stolperfalle
Binde hier KEINE Skripte oder Styles ein – nutze wp_enqueue_scripts, damit WordPress Abhängigkeiten und Deduplizierung übernimmt. Ein <script>-Tag direkt in wp_head auszugeben umgeht das alles und ist der Grund, warum so viele Seiten jQuery dreimal laden.
Gibt Inhalte unmittelbar vor </body> aus. Der richtige Ort für Analytics-Snippets und verzögert geladenes Markup.
Wird ausgelöst
Am Ende der Frontend-Seite.
Signatur
add_action( 'wp_footer', 'my_callback' );Die Stolperfalle
Ein Theme, das wp_footer() zu rufen vergisst, macht die Adminleiste kaputt, bricht jedes Plugin, das ein Footer-Skript einbindet, und wird im Theme-Review von wordpress.org automatisch abgelehnt.
Filtert den Beitragsinhalt unmittelbar vor der Ausgabe. Der übliche Ort, um Markup vor oder nach einem Beitrag anzufügen.
Wird ausgelöst
Jedes Mal, wenn the_content() aufgerufen wird.
Signatur
add_filter( 'the_content', 'my_callback' ); // receives $contentBeispiel
add_filter( 'the_content', function ( $content ) {
if ( ! is_singular( 'post' ) || ! in_the_loop() || ! is_main_query() ) {
return $content; // <- the guard everyone forgets
}
return $content . '<p class="cta">Enjoyed this? Read more.</p>';
} );Die Stolperfalle
Das läuft weit häufiger, als man denkt – in Widgets, in REST-Antworten, bei der Auszugserzeugung mancher Plugins und einmal pro Beitrag in einer Schleife auf einem Archiv. Ohne die Absicherung mit is_singular / in_the_loop / is_main_query erscheint dein CTA fünfzehnmal auf der Blog-Übersicht und im RSS-Feed. Das ist der am häufigsten missbrauchte Filter in WordPress.
Filtert den Beitragstitel vor der Ausgabe.
Wird ausgelöst
Jedes Mal, wenn the_title() oder get_the_title() aufgerufen wird.
Signatur
add_filter( 'the_title', 'my_callback', 10, 2 ); // receives $title, $post_idDie Stolperfalle
Es wird auch für Titel im Admin-Menü, in Navigationsmenüs und im Dokument-<title> ausgelöst. Es bedingungslos zu filtern benennt Dinge an Stellen um, die du nicht beabsichtigt hast.
Legt fest, wie viele WÖRTER ein automatisch erzeugter Auszug enthält. Standard ist 55.
Wird ausgelöst
Wenn WordPress einen Auszug für einen Beitrag erzeugt, der keinen manuellen Auszug hat.
Signatur
add_filter( 'excerpt_length', 'my_callback' ); // receives $length (words)Beispiel
add_filter( 'excerpt_length', function ( $length ) {
return 25;
}, 999 ); // high priority: many themes set this too, and last one winsDie Stolperfalle
Auf Beiträge mit einem MANUELLEN Auszug hat es keine Wirkung – die werden wortwörtlich verwendet. Und viele Themes setzen diesen Filter selbst, sodass du oft eine hohe Prioritätszahl brauchst, um dich durchzusetzen.
Ändert die Zeichenkette, die an einen gekürzten Auszug angehängt wird. Standard ist „ […]“.
Wird ausgelöst
Wenn ein automatisch erzeugter Auszug gekürzt wird.
Signatur
add_filter( 'excerpt_more', 'my_callback' ); // receives $moreVerändert eine Abfrage, BEVOR sie ausgeführt wird. Der richtige Weg, um zu ändern, was auf einem Archiv erscheint – weit besser als eine zweite WP_Query.
Wird ausgelöst
Nachdem die Query-Variablen ausgewertet sind, bevor das SQL zusammengebaut wird.
Signatur
add_action( 'pre_get_posts', 'my_callback' ); // receives WP_Query $query (by reference)Beispiel
add_action( 'pre_get_posts', function ( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return; // <- both guards are mandatory
}
if ( $query->is_category() ) {
$query->set( 'posts_per_page', 12 );
}
} );Die Stolperfalle
Es läuft auch im ADMIN-Bereich, und es läuft für JEDE Abfrage, einschließlich Menüs, Widgets und Mediathek. Lässt du die Absicherungen is_admin() und is_main_query() weg, änderst du unbemerkt, was die Beitragsliste im Admin anzeigt – ein Fehler, der wirklich schwer zurückzuverfolgen ist. Beachte außerdem: Verändere $query, gib nichts zurück.
Filtert die rohe SQL-WHERE-Klausel einer Abfrage.
Wird ausgelöst
Während das SQL der Abfrage zusammengebaut wird.
Signatur
add_filter( 'posts_where', 'my_callback', 10, 2 ); // receives $where, WP_Query $queryDie Stolperfalle
Du schreibst rohes SQL. Sichere immer mit $query->is_main_query() ab und nutze für jede Benutzereingabe immer $wpdb->prepare(). Das ist der schnellste Weg, eine SQL-Injection in eine WordPress-Seite einzubauen.
Filtert die Gesamtzahl der von einer Abfrage gefundenen Beiträge – daraus wird die Seitennummerierung berechnet.
Wird ausgelöst
Nachdem die Abfrage gelaufen ist, bevor die Seitennummerierung berechnet wird.
Signatur
add_filter( 'found_posts', 'my_callback', 10, 2 ); // receives $found_posts, WP_Query $queryLegt die Pixelgröße fest, ab der WordPress einen Upload herunterskaliert und statt deines Originals eine „-scaled“-Kopie ausliefert. Standard 2560.
Wird ausgelöst
Beim Upload, wenn WordPress entscheidet, ob ein Bild „groß“ ist.
Signatur
add_filter( 'big_image_size_threshold', 'my_callback' ); // receives int $thresholdBeispiel
// Serve originals at full resolution — no -scaled copy.
add_filter( 'big_image_size_threshold', '__return_false' );
// Or just raise the ceiling:
add_filter( 'big_image_size_threshold', function () {
return 3840;
} );Die Stolperfalle
Das ist die mit Abstand häufigste Ursache für „mein Bild sieht nach dem Upload zu WordPress unscharf aus“, und kaum jemand weiß, dass es das gibt. Dein Original liegt weiterhin auf der Festplatte – es wird nur nie ausgeliefert. Beachte: Es gilt für die LÄNGSTE Kante und betrifft nur Bilder, die hochgeladen werden, nachdem der Filter aktiv ist.
Filtert das Array der Bildgrößen, die WordPress für einen Upload erzeugen will. Entferne eine Größe aus dem Array, damit sie nicht mehr erzeugt wird.
Wird ausgelöst
Beim Upload, bevor die abgeleiteten Dateien erstellt werden.
Signatur
add_filter( 'intermediate_image_sizes_advanced', 'my_callback', 10, 2 ); // receives $sizes, $metadataBeispiel
add_filter( 'intermediate_image_sizes_advanced', function ( $sizes ) {
unset( $sizes['1536x1536'] );
unset( $sizes['2048x2048'] );
return $sizes;
} );Die Stolperfalle
Eine Größe zu entfernen, die dein Theme tatsächlich NUTZT, führt dazu, dass WordPress auf das Original in voller Größe zurückgreift – was schlimmer ist als der eingesparte Speicherplatz. Und das verhindert nur, dass NEUE Dateien erzeugt werden; die vorhandenen bleiben, bis du sie neu generierst.
Legt die JPEG-Qualität fest, mit der WordPress hochgeladene Bilder neu kodiert. Standard 82.
Wird ausgelöst
Immer wenn WordPress ein JPEG schreibt.
Signatur
add_filter( 'jpeg_quality', 'my_callback', 10, 2 ); // receives $quality, $contextDie Stolperfalle
Qualität 82 ist für Fotografien in Ordnung und sichtbar schlecht für Screenshots, Logos und flächige Grafiken – die haben harte Kanten und kein fotografisches Rauschen, in dem sich Artefakte verstecken. Außerdem: wp_editor_set_quality ist der modernere Filter und deckt die Bildeditor-Klassen direkt ab; beide zu setzen ist üblich.
Legt die Ausgabequalität fest, die die WP_Image_Editor-Klassen (GD und Imagick) verwenden.
Wird ausgelöst
Wenn eine Bildeditor-Instanz ihre Qualität festlegt.
Signatur
add_filter( 'wp_editor_set_quality', 'my_callback', 10, 2 ); // receives $quality, $mime_typeFügt deine eigenen Bildgrößen zur Größenauswahl im Medien-Dialog und im Block-Editor hinzu.
Wird ausgelöst
Wenn die Medien-Oberfläche ihre Größenauswahl aufbaut.
Signatur
add_filter( 'image_size_names_choose', 'my_callback' ); // receives $sizesBeispiel
add_filter( 'image_size_names_choose', function ( $sizes ) {
return array_merge( $sizes, array( 'card' => __( 'Card', 'textdomain' ) ) );
} );Die Stolperfalle
add_image_size() registriert die Größe, macht sie aber NICHT im Editor auswählbar. Jede Frage vom Typ „meine eigene Bildgröße erscheint nicht im Dropdown“ liegt daran, dass dieser Filter fehlt.
Prüft oder lehnt eine Datei ab, BEVOR sie in den Uploads-Ordner verschoben wird.
Wird ausgelöst
Während des Uploads, bevor die Datei geschrieben wird.
Signatur
add_filter( 'wp_handle_upload_prefilter', 'my_callback' ); // receives $fileDie Stolperfalle
Um eine Datei abzulehnen, setze $file['error'] auf eine Nachrichten-Zeichenkette und gib $file zurück. false zurückzugeben oder eine Exception zu werfen bewirkt nicht das, was du willst.
Filtert das Metadaten-Array (einschließlich der erzeugten Größen), nachdem ein Anhang verarbeitet wurde.
Wird ausgelöst
Nachdem beim Upload die abgeleiteten Bilder erstellt wurden.
Signatur
add_filter( 'wp_generate_attachment_metadata', 'my_callback', 10, 2 ); // receives $metadata, $attachment_idDie Stolperfalle
Das ist der Hook, den Plugins zur Bildoptimierung nutzen. Er kann langsam sein – er läuft, nachdem jede Bildgröße geschrieben wurde, und eine HTTP-Anfrage an dieser Stelle lässt jeden Upload darauf warten.
Filtert die srcset-Kandidaten, die WordPress für ein responsives Bild erzeugt.
Wird ausgelöst
Wenn ein responsives Bild gerendert wird.
Signatur
add_filter( 'wp_calculate_image_srcset', 'my_callback', 10, 5 );Die Stolperfalle
Removing the medium_large (768w) size elsewhere silently degrades srcset — that size exists almost entirely to serve it.
Wir haben die genaue Argumentanzahl dieses Hooks nicht mit dem WordPress-Quellcode abgeglichen. Prüfe developer.wordpress.org, bevor du dich darauf verlässt. Wir kennzeichnen die Unsicherheit lieber, als klammheimlich eine Vermutung als Tatsache auszugeben.
Registriert Menü- und Untermenüseiten im Admin-Bereich.
Wird ausgelöst
Wenn das Admin-Menü aufgebaut wird.
Signatur
add_action( 'admin_menu', 'my_callback' );Beispiel
add_action( 'admin_menu', function () {
add_options_page(
'My Plugin',
'My Plugin',
'manage_options', // capability — NOT a role
'my-plugin',
'my_render_settings_page'
);
} );Die Stolperfalle
Das Capability-Argument ist eine CAPABILITY, keine Rolle. „administrator“ zu übergeben scheint zu funktionieren (weil Administratoren in manchen Setups eine Capability dieses Namens haben) und gewährt dann stillschweigend den falschen Leuten Zugriff. Nutze manage_options.
Gibt einen Hinweis am oberen Rand einer Admin-Seite aus.
Wird ausgelöst
Beim Rendern einer Admin-Seite.
Signatur
add_action( 'admin_notices', 'my_callback' );Die Stolperfalle
Es wird auf JEDER Admin-Seite ausgelöst. Ein Plugin, das auf allen einen bedingungslosen „Danke für die Installation!“-Hinweis zeigt, ist das meistgehasste Muster im WordPress-Admin. Sichere ihn ab und mache ihn schließbar.
Läuft immer, wenn ein Beitrag erstellt oder aktualisiert wird. Der übliche Ort, um Daten aus Meta-Boxen zu speichern.
Wird ausgelöst
Nachdem ein Beitrag in die Datenbank geschrieben wurde.
Signatur
add_action( 'save_post', 'my_callback', 10, 3 ); // receives $post_id, $post, $updateBeispiel
add_action( 'save_post', function ( $post_id ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
if ( wp_is_post_revision( $post_id ) ) return;
if ( ! current_user_can( 'edit_post', $post_id ) ) return;
// ... now it is safe to save
}, 10, 1 );Die Stolperfalle
Es wird bei AUTOSPEICHERUNGEN und REVISIONEN ebenso ausgelöst wie bei echten Speichervorgängen. Ohne die drei oben genannten Absicherungen werden deine Metadaten bei jeder automatischen Speicherung des Editors mit leeren Werten überschrieben – ein Fehler, der so aussieht, als würden Daten zufällig verschwinden.
Registriert Meta-Boxen auf der Beitragsbearbeitungsseite.
Wird ausgelöst
Wenn die Bearbeitungsseite aufgebaut wird.
Signatur
add_action( 'add_meta_boxes', 'my_callback', 10, 2 ); // receives $post_type, $postDie Stolperfalle
Klassische Meta-Boxen erscheinen nicht im Block-Editor, es sei denn, der Block-Editor fällt in den Kompatibilitätsmodus zurück. Für eine block-editor-native Seite registriere Post-Meta stattdessen mit show_in_rest und baue ein Seitenleisten-Panel.
Läuft, nachdem sich ein Benutzer erfolgreich angemeldet hat.
Wird ausgelöst
Bei erfolgreicher Authentifizierung.
Signatur
add_action( 'wp_login', 'my_callback', 10, 2 ); // receives $user_login, WP_User $userLäuft unmittelbar, nachdem ein neuer Benutzer angelegt wurde.
Wird ausgelöst
Bei der Registrierung.
Signatur
add_action( 'user_register', 'my_callback', 10, 2 ); // receives $user_id, $userdataFiltert das Ergebnis der Authentifizierung. Gib ein WP_Error zurück, um eine Anmeldung zu blockieren.
Wird ausgelöst
Während des Anmeldeversuchs.
Signatur
add_filter( 'authenticate', 'my_callback', 30, 3 ); // receives $user, $username, $passwordDie Stolperfalle
Die Priorität ist hier sehr wichtig. Der WordPress-Core hängt seine eigenen Prüfungen bei den Prioritäten 20 und 30 ein – hängst du dich zu früh ein, läufst du, bevor überhaupt das Passwort geprüft wurde.
Registriert REST-Routen und -Felder.
Wird ausgelöst
Wenn die REST-API initialisiert wird.
Signatur
add_action( 'rest_api_init', 'my_callback' );Beispiel
add_action( 'rest_api_init', function () {
register_rest_route( 'myplugin/v1', '/items', array(
'methods' => 'GET',
'callback' => 'my_get_items',
'permission_callback' => '__return_true', // BE DELIBERATE ABOUT THIS
) );
} );Die Stolperfalle
permission_callback ist ERFORDERLICH – seit WP 5.5 löst das Weglassen einen Hinweis aus, und es auf __return_true zu setzen macht den Endpunkt vollständig öffentlich. Das ist für wirklich öffentliche Daten in Ordnung und für alles andere ein ernstes Sicherheitsloch. Entscheide bewusst, verlasse dich nicht auf den Standard.
Fügt ein eigenes Wiederholungsintervall für wp_schedule_event() hinzu.
Wird ausgelöst
Wenn WordPress seine Liste der verfügbaren Zeitpläne aufbaut.
Signatur
add_filter( 'cron_schedules', 'my_callback' ); // receives $schedulesBeispiel
add_filter( 'cron_schedules', function ( $schedules ) {
$schedules['every_five_minutes'] = array(
'interval' => 300, // seconds
'display' => __( 'Every 5 minutes', 'textdomain' ),
);
return $schedules;
} );Die Stolperfalle
WP-Cron ist kein echter Cron. Es wird nur ausgelöst, wenn jemand die Seite besucht, sodass eine Seite mit wenig Traffic einen Fünf-Minuten-Zeitplan nicht alle fünf Minuten ausführt. Wenn das Timing wirklich zählt, deaktiviere WP-Cron (DISABLE_WP_CRON) und rufe wp-cron.php über einen echten System-Cron auf.
Läuft unmittelbar, nachdem ein Kommentar gespeichert wurde.
Wird ausgelöst
Beim Absenden eines Kommentars.
Signatur
add_action( 'comment_post', 'my_callback', 10, 3 ); // receives $comment_id, $approved, $commentdataFiltert die Kommentardaten, bevor sie gespeichert werden. Wird für Spam-Prüfungen und Validierung verwendet.
Wird ausgelöst
Bevor der Kommentar geschrieben wird.
Signatur
add_filter( 'preprocess_comment', 'my_callback' ); // receives $commentdataDie Stolperfalle
Um einen Kommentar hier abzulehnen, rufe wp_die() mit einer Nachricht auf – false zurückzugeben hält ihn nicht auf.
Läuft auf der Bestellbestätigungsseite nach einem erfolgreichen Checkout.
Wird ausgelöst
Wenn der Kunde auf der Dankeseite landet.
Signatur
add_action( 'woocommerce_thankyou', 'my_callback' ); // receives $order_idDie Stolperfalle
Das ist KEIN zuverlässiger Ort, um die Auftragsabwicklung auszulösen. Es wird nur ausgelöst, wenn der Kunde die Dankeseite tatsächlich erreicht – schließt er nach dem Bezahlen den Tab, läuft es nie. Nutze woocommerce_payment_complete oder einen Hook für den Wechsel des Bestellstatus für alles, was zwingend passieren muss.
Gibt Markup unmittelbar vor dem „In den Warenkorb“-Button auf einer Produktseite aus.
Wird ausgelöst
Während die Produktseite gerendert wird.
Signatur
add_action( 'woocommerce_before_add_to_cart_button', 'my_callback' );Fügt Felder im klassischen Checkout hinzu, entfernt sie oder ordnet sie neu an.
Wird ausgelöst
Wenn das Checkout-Formular aufgebaut wird.
Signatur
add_filter( 'woocommerce_checkout_fields', 'my_callback' ); // receives $fieldsDie Stolperfalle
Das betrifft nur den KLASSISCHEN (Shortcode-)Checkout. Der neuere block-basierte Checkout ignoriert es vollständig und wird über Slot & Fill in JavaScript angepasst. Darüber stolpert beim ersten Mal fast jeder.