WordPress hooks-index
Een doorzoekbare index van de WordPress-actions en -filters die ontwikkelaars daadwerkelijk gebruiken — met de exacte add_action/add_filter-signature, wanneer de hook afgaat, een werkend voorbeeld en het addertje onder het gras.
39 hooks, met de exacte add_action / add_filter-signatuur, wanneer de hook afgaat, een werkend voorbeeld en het detail waar mensen op stuklopen. 1 zijn gemarkeerd als niet-geverifieerd — we hebben hun aantal argumenten niet gecontroleerd tegen de WordPress-broncode, en dat melden we liever dan een gok als feit te presenteren.
Dit is niet volledig en doet ook niet alsof — WordPress heeft duizenden hooks. Het behandelt de hooks die mensen daadwerkelijk gebruiken.
Draait nadat WordPress volledig geladen is, maar voordat er headers verzonden zijn. De standaardplek om aangepaste berichttypen, taxonomieën en rewrite-regels te registreren.
Wanneer het afgaat
Bij elk verzoek, zowel front-end als beheer, nadat de core, plugins en het thema geladen zijn.
Signatuur
add_action( 'init', 'my_callback' );Voorbeeld
add_action( 'init', function () {
register_post_type( 'book', array(
'public' => true,
'label' => 'Books',
'show_in_rest' => true, // required for the block editor
) );
} );De valkuil
init draait bij ELK verzoek, inclusief AJAX, REST en cron. Iets traags hier doen (een HTTP-verzoek, een zware query) belast elke afzonderlijke paginalading. Let ook op: de huidige gebruiker is hier al beschikbaar, maar je kunt nog niets naar de uitvoer sturen — de headers zijn nog niet verzonden, maar dat gebeurt zo.
Draait zodra het thema geladen is. De juiste plek voor add_theme_support(), add_image_size() en het registreren van navigatiemenu's.
Wanneer het afgaat
Nadat de functions.php van het thema geladen is, VÓÓR init.
Signatuur
add_action( 'after_setup_theme', 'my_callback' );Voorbeeld
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
} );De valkuil
Afbeeldingsformaten registreren op init in plaats van hier werkt in de meeste gevallen bij toeval en faalt dan in sommige gevallen op onverklaarbare wijze. Gebruik after_setup_theme — daar is het voor bedoeld.
Draait zodra alle actieve plugins geladen zijn. Het vroegste veilige moment om met een andere plugin te communiceren.
Wanneer het afgaat
Nadat elk pluginbestand is ingeladen, voordat het thema geladen wordt.
Signatuur
add_action( 'plugins_loaded', 'my_callback' );De valkuil
De huidige gebruiker is hier NOG NIET beschikbaar — wp_get_current_user() werkt hier niet betrouwbaar. Heb je de gebruiker nodig, gebruik dan init.
Draait nadat WordPress volledig geladen is — plugins, thema, init en de gebruiker zijn allemaal gereed.
Wanneer het afgaat
Na init en nadat de huidige gebruiker is ingesteld.
Signatuur
add_action( 'wp_loaded', 'my_callback' );Draait aan het begin van elk beheerverzoek. Gebruikt voor register_setting(), rechtencontroles en redirects in het beheer.
Wanneer het afgaat
Bij elk verzoek aan de beheerkant.
Signatuur
add_action( 'admin_init', 'my_callback' );De valkuil
Hij gaat ook af bij admin-ajax.php-verzoeken, die niet echt "beheerschermen" zijn. Gaat je callback ervan uit dat er een scherm bestaat, bescherm hem dan met wp_doing_ajax().
De enige juiste plek om front-end-CSS en -JavaScript in de wachtrij te plaatsen.
Wanneer het afgaat
Bij het laden van front-end-pagina's, voordat de head wordt gerenderd.
Signatuur
add_action( 'wp_enqueue_scripts', 'my_callback' );Voorbeeld
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
);
} );De valkuil
Ondanks de naam verwerkt hij zowel STIJLEN als scripts — er is geen wp_enqueue_styles-hook, en mensen verliezen serieus tijd met zoeken naar een. Let ook op: hij gaat niet af in het beheer (gebruik admin_enqueue_scripts) of in de blok-editor (gebruik enqueue_block_editor_assets).
Plaats CSS/JS in de wachtrij in het beheer. Ontvangt de hook-suffix van het huidige scherm, zodat je assets op slechts één scherm kunt laden.
Wanneer het afgaat
Bij het laden van beheerpagina's.
Signatuur
add_action( 'admin_enqueue_scripts', 'my_callback' ); // receives $hook_suffixVoorbeeld
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 );
} );De valkuil
Niet controleren op $hook is verreweg de meest voorkomende oorzaak van een plugin die ongerelateerde beheerschermen kapotmaakt. Laad je assets waar ze nodig zijn en nergens anders.
Plaats assets in de wachtrij, uitsluitend in de blok-editor (Gutenberg) — niet op de front-end, niet in de rest van het beheer.
Wanneer het afgaat
Wanneer de blok-editor laadt.
Signatuur
add_action( 'enqueue_block_editor_assets', 'my_callback' );Print uitvoer in de <head>. Gebruikt voor meta-tags en inline kritieke CSS.
Wanneer het afgaat
Binnen <head>, op de front-end.
Signatuur
add_action( 'wp_head', 'my_callback' );De valkuil
Plaats hier GEEN scripts of styles in de wachtrij — gebruik wp_enqueue_scripts, waarmee WordPress afhankelijkheden en ontdubbeling afhandelt. Een <script>-tag rechtstreeks in wp_head echoën omzeilt dat allemaal en is de reden waarom zoveel sites jQuery drie keer laden.
Print uitvoer vlak vóór </body>. De juiste plek voor analytics-snippets en uitgestelde opmaak.
Wanneer het afgaat
Aan het einde van de front-end-pagina.
Signatuur
add_action( 'wp_footer', 'my_callback' );De valkuil
Een thema dat vergeet wp_footer() aan te roepen, maakt de beheerbalk kapot, breekt elke plugin die een footer-script in de wachtrij plaatst en wordt automatisch afgekeurd in de themabeoordeling van wordpress.org.
Filtert de berichtinhoud vlak voordat deze wordt weergegeven. De gebruikelijke plek om opmaak vóór of achter een bericht te plaatsen.
Wanneer het afgaat
Elke keer dat the_content() wordt aangeroepen.
Signatuur
add_filter( 'the_content', 'my_callback' ); // receives $contentVoorbeeld
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>';
} );De valkuil
Dit draait veel vaker dan je denkt — in widgets, in REST-responses, bij het genereren van samenvattingen in sommige plugins en één keer per bericht in een loop op een archief. Zonder de controle is_singular / in_the_loop / is_main_query verschijnt je CTA vijftien keer op de blogindex en in de RSS-feed. Dit is het meest misbruikte filter in WordPress.
Filtert de berichttitel vóór weergave.
Wanneer het afgaat
Elke keer dat the_title() of get_the_title() wordt aangeroepen.
Signatuur
add_filter( 'the_title', 'my_callback', 10, 2 ); // receives $title, $post_idDe valkuil
Hij gaat ook af voor titels in het beheermenu, in navigatiemenu's en in de document-<title>. Hem onvoorwaardelijk filteren hernoemt dingen op plekken waar je dat niet bedoeld had.
Bepaalt uit hoeveel WOORDEN een automatisch gegenereerde samenvatting bestaat. Standaard is 55.
Wanneer het afgaat
Wanneer WordPress een samenvatting genereert voor een bericht zonder handmatige samenvatting.
Signatuur
add_filter( 'excerpt_length', 'my_callback' ); // receives $length (words)Voorbeeld
add_filter( 'excerpt_length', function ( $length ) {
return 25;
}, 999 ); // high priority: many themes set this too, and last one winsDe valkuil
Het heeft geen effect op berichten met een HANDMATIGE samenvatting — die worden letterlijk gebruikt. En veel thema's stellen dit filter zelf in, dus vaak heb je een hoog prioriteitsnummer nodig om te winnen.
Wijzigt de tekenreeks die achter een afgekapte samenvatting wordt geplaatst. Standaard is " […]".
Wanneer het afgaat
Wanneer een automatisch gegenereerde samenvatting wordt afgekapt.
Signatuur
add_filter( 'excerpt_more', 'my_callback' ); // receives $moreWijzigt een query VOORDAT deze draait. De juiste manier om te veranderen wat er op een archief verschijnt — veel beter dan een tweede WP_Query.
Wanneer het afgaat
Nadat de query-variabelen zijn geparseerd, voordat de SQL wordt opgebouwd.
Signatuur
add_action( 'pre_get_posts', 'my_callback' ); // receives WP_Query $query (by reference)Voorbeeld
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 );
}
} );De valkuil
Hij draait óók in het BEHEER, en hij draait voor ELKE query, inclusief menu's, widgets en de mediabibliotheek. Laat je de controles is_admin() en is_main_query() weg, dan verander je ongemerkt wat de berichtenlijst in het beheer toont — een bug die echt lastig te herleiden is. Let ook op: pas $query aan, geef niets terug.
Filtert de ruwe SQL WHERE-clausule van een query.
Wanneer het afgaat
Terwijl de SQL van de query wordt samengesteld.
Signatuur
add_filter( 'posts_where', 'my_callback', 10, 2 ); // receives $where, WP_Query $queryDe valkuil
Je schrijft ruwe SQL. Bescherm altijd met $query->is_main_query() en gebruik altijd $wpdb->prepare() voor elke gebruikersinvoer. Dit is de snelste manier om SQL-injectie in een WordPress-site te introduceren.
Filtert het totale aantal berichten dat een query heeft gevonden — waarop de paginering wordt berekend.
Wanneer het afgaat
Nadat de query is uitgevoerd, voordat de paginering wordt berekend.
Signatuur
add_filter( 'found_posts', 'my_callback', 10, 2 ); // receives $found_posts, WP_Query $queryBepaalt de pixelgrootte waarboven WordPress een upload verkleint en een "-scaled"-kopie serveert in plaats van je origineel. Standaard 2560.
Wanneer het afgaat
Bij het uploaden, wanneer WordPress bepaalt of een afbeelding "groot" is.
Signatuur
add_filter( 'big_image_size_threshold', 'my_callback' ); // receives int $thresholdVoorbeeld
// 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;
} );De valkuil
Dit is verreweg de meest voorkomende oorzaak van "mijn afbeelding ziet er wazig uit na het uploaden naar WordPress", en bijna niemand weet dat het bestaat. Je origineel staat nog gewoon op de schijf — het wordt alleen nooit geserveerd. Let op: het geldt voor de LANGSTE zijde en beïnvloedt alleen afbeeldingen die zijn geüpload nadat het filter actief is.
Filtert de array met afbeeldingsformaten die WordPress voor een upload gaat genereren. Verwijder een formaat uit de array om het niet meer te genereren.
Wanneer het afgaat
Bij het uploaden, voordat de afgeleide bestanden worden aangemaakt.
Signatuur
add_filter( 'intermediate_image_sizes_advanced', 'my_callback', 10, 2 ); // receives $sizes, $metadataVoorbeeld
add_filter( 'intermediate_image_sizes_advanced', function ( $sizes ) {
unset( $sizes['1536x1536'] );
unset( $sizes['2048x2048'] );
return $sizes;
} );De valkuil
Een formaat verwijderen dat je thema daadwerkelijk GEBRUIKT, betekent dat WordPress terugvalt op het origineel op volledige grootte — wat erger is dan de schijfruimte die je bespaarde. En dit voorkomt alleen dat er NIEUWE bestanden worden gemaakt; de bestaande blijven staan totdat je ze opnieuw genereert.
Bepaalt de JPEG-kwaliteit waarmee WordPress geüploade afbeeldingen opnieuw codeert. Standaard 82.
Wanneer het afgaat
Telkens wanneer WordPress een JPEG wegschrijft.
Signatuur
add_filter( 'jpeg_quality', 'my_callback', 10, 2 ); // receives $quality, $contextDe valkuil
Kwaliteit 82 is prima voor foto's en zichtbaar slecht voor screenshots, logo's en vlakke afbeeldingen — die hebben harde randen en geen fotografische ruis om artefacten in te verbergen. Let ook op: wp_editor_set_quality is het modernere filter en dekt de klassen van de afbeeldingseditor rechtstreeks; beide instellen komt vaak voor.
Bepaalt de uitvoerkwaliteit die de WP_Image_Editor-klassen (GD en Imagick) gebruiken.
Wanneer het afgaat
Wanneer een instantie van de afbeeldingseditor zijn kwaliteit instelt.
Signatuur
add_filter( 'wp_editor_set_quality', 'my_callback', 10, 2 ); // receives $quality, $mime_typeVoegt je aangepaste afbeeldingsformaten toe aan het formaat-dropdownmenu in de mediamodal en de blok-editor.
Wanneer het afgaat
Wanneer de media-interface zijn formaatkiezer opbouwt.
Signatuur
add_filter( 'image_size_names_choose', 'my_callback' ); // receives $sizesVoorbeeld
add_filter( 'image_size_names_choose', function ( $sizes ) {
return array_merge( $sizes, array( 'card' => __( 'Card', 'textdomain' ) ) );
} );De valkuil
add_image_size() registreert het formaat, maar maakt het NIET selecteerbaar in de editor. Elke vraag "mijn aangepaste afbeeldingsformaat verschijnt niet in de dropdown" komt doordat dit filter ontbreekt.
Inspecteert of weigert een bestand VOORDAT het naar de uploadsmap wordt verplaatst.
Wanneer het afgaat
Tijdens het uploaden, voordat het bestand wordt weggeschreven.
Signatuur
add_filter( 'wp_handle_upload_prefilter', 'my_callback' ); // receives $fileDe valkuil
Om een bestand te weigeren, stel je $file['error'] in op een berichttekst en geef je $file terug. false teruggeven of een exception gooien doet niet wat je wilt.
Filtert de metadata-array (inclusief de gegenereerde formaten) nadat een bijlage is verwerkt.
Wanneer het afgaat
Nadat de afgeleide afbeeldingen bij het uploaden zijn aangemaakt.
Signatuur
add_filter( 'wp_generate_attachment_metadata', 'my_callback', 10, 2 ); // receives $metadata, $attachment_idDe valkuil
Dit is de hook die plugins voor afbeeldingsoptimalisatie gebruiken. Hij kan traag zijn — hij draait nadat elk afbeeldingsformaat is weggeschreven, en een HTTP-verzoek hier laat elke upload erop wachten.
Filtert de srcset-kandidaten die WordPress genereert voor een responsieve afbeelding.
Wanneer het afgaat
Wanneer een responsieve afbeelding wordt gerenderd.
Signatuur
add_filter( 'wp_calculate_image_srcset', 'my_callback', 10, 5 );De valkuil
Removing the medium_large (768w) size elsewhere silently degrades srcset — that size exists almost entirely to serve it.
We hebben het exacte aantal argumenten van deze hook niet geverifieerd tegen de WordPress-broncode. Controleer developer.wordpress.org voordat je erop vertrouwt. We geven de onzekerheid liever aan dan stilletjes een gok als feit te presenteren.
Registreert menu- en submenupagina's in het beheer.
Wanneer het afgaat
Wanneer het beheermenu wordt opgebouwd.
Signatuur
add_action( 'admin_menu', 'my_callback' );Voorbeeld
add_action( 'admin_menu', function () {
add_options_page(
'My Plugin',
'My Plugin',
'manage_options', // capability — NOT a role
'my-plugin',
'my_render_settings_page'
);
} );De valkuil
Het capability-argument is een CAPABILITY, geen rol. "administrator" doorgeven lijkt te werken (omdat beheerders in sommige configuraties een capability met die naam hebben) en geeft vervolgens ongemerkt de verkeerde mensen toegang. Gebruik manage_options.
Print een melding bovenaan een beheerscherm.
Wanneer het afgaat
Bij het renderen van een beheerpagina.
Signatuur
add_action( 'admin_notices', 'my_callback' );De valkuil
Hij gaat af op ELK beheerscherm. Een plugin die op allemaal een onvoorwaardelijke melding "bedankt voor het installeren!" toont, is verreweg het meest gehate patroon in het WordPress-beheer. Bescherm hem en maak hem sluitbaar.
Draait telkens wanneer een bericht wordt aangemaakt of bijgewerkt. De gebruikelijke plek om metabox-gegevens op te slaan.
Wanneer het afgaat
Nadat een bericht naar de database is weggeschreven.
Signatuur
add_action( 'save_post', 'my_callback', 10, 3 ); // receives $post_id, $post, $updateVoorbeeld
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 );De valkuil
Hij gaat af bij AUTOMATISCH OPSLAAN en bij REVISIES, net als bij echte opslagacties. Zonder de drie bovenstaande controles worden je meta-gegevens overschreven met lege waarden telkens wanneer de editor automatisch opslaat — een bug die eruitziet alsof gegevens willekeurig verdwijnen.
Registreert metaboxen op het bewerkscherm van een bericht.
Wanneer het afgaat
Wanneer het bewerkscherm wordt opgebouwd.
Signatuur
add_action( 'add_meta_boxes', 'my_callback', 10, 2 ); // receives $post_type, $postDe valkuil
Klassieke metaboxen verschijnen niet in de blok-editor, tenzij de blok-editor terugvalt op de compatibiliteitsmodus. Voor een site die native met de blok-editor werkt, registreer je post-meta met show_in_rest en bouw je in plaats daarvan een zijbalkpaneel.
Draait nadat een gebruiker succesvol is ingelogd.
Wanneer het afgaat
Bij succesvolle authenticatie.
Signatuur
add_action( 'wp_login', 'my_callback', 10, 2 ); // receives $user_login, WP_User $userDraait direct nadat een nieuwe gebruiker is aangemaakt.
Wanneer het afgaat
Bij registratie.
Signatuur
add_action( 'user_register', 'my_callback', 10, 2 ); // receives $user_id, $userdataFiltert het authenticatieresultaat. Geef een WP_Error terug om een login te blokkeren.
Wanneer het afgaat
Tijdens de inlogpoging.
Signatuur
add_filter( 'authenticate', 'my_callback', 30, 3 ); // receives $user, $username, $passwordDe valkuil
Prioriteit is hier heel belangrijk. De WordPress-core hangt zijn eigen controles op prioriteiten 20 en 30 — hang je hem te vroeg op, dan draai je nog voordat het wachtwoord überhaupt is gecontroleerd.
Registreert REST-routes en -velden.
Wanneer het afgaat
Wanneer de REST API initialiseert.
Signatuur
add_action( 'rest_api_init', 'my_callback' );Voorbeeld
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
) );
} );De valkuil
permission_callback is VERPLICHT — sinds WP 5.5 levert het weglaten ervan een notice op, en hem instellen op __return_true maakt het endpoint volledig openbaar. Dat is prima voor werkelijk openbare gegevens en een serieus lek voor al het andere. Maak een keuze, ga niet af op de standaardwaarde.
Voegt een aangepast herhalingsinterval toe voor wp_schedule_event().
Wanneer het afgaat
Wanneer WordPress zijn lijst met beschikbare schema's opbouwt.
Signatuur
add_filter( 'cron_schedules', 'my_callback' ); // receives $schedulesVoorbeeld
add_filter( 'cron_schedules', function ( $schedules ) {
$schedules['every_five_minutes'] = array(
'interval' => 300, // seconds
'display' => __( 'Every 5 minutes', 'textdomain' ),
);
return $schedules;
} );De valkuil
WP-Cron is geen echte cron. Hij gaat alleen af wanneer iemand de site bezoekt, dus een site met weinig verkeer draait een vijfminutenschema niet elke vijf minuten. Als de timing er echt toe doet, schakel WP-Cron dan uit (DISABLE_WP_CRON) en roep wp-cron.php aan vanuit een echte systeem-cron.
Draait direct nadat een reactie is opgeslagen.
Wanneer het afgaat
Bij het plaatsen van een reactie.
Signatuur
add_action( 'comment_post', 'my_callback', 10, 3 ); // receives $comment_id, $approved, $commentdataFiltert reactiegegevens voordat ze worden opgeslagen. Gebruikt voor spamcontroles en validatie.
Wanneer het afgaat
Voordat de reactie wordt weggeschreven.
Signatuur
add_filter( 'preprocess_comment', 'my_callback' ); // receives $commentdataDe valkuil
Om hier een reactie te weigeren, roep je wp_die() aan met een bericht — false teruggeven stopt hem niet.
Draait op de bedankpagina (order ontvangen) na een geslaagde afrekening.
Wanneer het afgaat
Wanneer de klant op de bedankpagina belandt.
Signatuur
add_action( 'woocommerce_thankyou', 'my_callback' ); // receives $order_idDe valkuil
Dit is GEEN betrouwbare plek om de afhandeling te starten. Hij gaat alleen af als de klant de bedankpagina daadwerkelijk bereikt — sluit hij het tabblad na het betalen, dan draait hij nooit. Gebruik woocommerce_payment_complete of een hook voor een orderstatusovergang voor alles wat gebeuren moet.
Geeft opmaak weer vlak vóór de knop 'In winkelwagen' op een productpagina.
Wanneer het afgaat
Terwijl de productpagina wordt gerenderd.
Signatuur
add_action( 'woocommerce_before_add_to_cart_button', 'my_callback' );Voegt velden toe, verwijdert ze of wijzigt de volgorde op de klassieke afrekenpagina.
Wanneer het afgaat
Wanneer het afrekenformulier wordt opgebouwd.
Signatuur
add_filter( 'woocommerce_checkout_fields', 'my_callback' ); // receives $fieldsDe valkuil
Dit heeft alleen effect op de KLASSIEKE (shortcode) afrekenpagina. De nieuwere blokgebaseerde afrekenpagina negeert het volledig en wordt aangepast via Slot & Fill in JavaScript. Bijna iedereen loopt hier de eerste keer tegenaan.