{"id":32545,"date":"2020-06-11T00:03:03","date_gmt":"2020-06-11T07:03:03","guid":{"rendered":"https:\/\/kinsta.com\/?p=72202"},"modified":"2023-08-09T08:40:17","modified_gmt":"2023-08-09T06:40:17","slug":"wordpress-hooks","status":"publish","type":"post","link":"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/","title":{"rendered":"WordPress hooks bootcamp: zo gebruik je actions, filters en custom hooks"},"content":{"rendered":"<p>Hooks zijn \u00e9\u00e9n van de belangrijkste tools in het <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-ontwikkelaar-huren\/\">arsenaal van de WordPress ontwikkelaar<\/a>. Ze vormen de basis van het ontwikkelen van WordPress plugins en thema&#8217;s. Je kunt de vele ingebouwde hooks van WordPress gebruiken om je eigen code te &#8220;aan te haken&#8221; bij de WordPress Core en iets te <strong>doen<\/strong> of te <strong>bewerken<\/strong>.<\/p>\n<p>Er zijn twee soorten WordPress hooks: <strong>actions<\/strong> en <strong>filters<\/strong>. Hooks zijn zo veelvoorkomend dat ook de WordPress Core zelf ze veel gebruikt. WordPress bevat een manier om je eigen <strong>custom hooks<\/strong> te defini\u00ebren zodat andere ontwikkelaars weer kunnen aanhaken bij jouw code.<\/p>\n<p>Leer hier hoe het werken met actions, filters en custom hooks essentieel is om een expert te worden in WordPress development.<\/p>\n<p>De eerste helft van dit artikel behandelt de basics van WordPress hooks en legt uit hoe ze werken, aan de hand van praktische voorbeelden. In de tweede helft zul je leren hoe je hooks kunt gebruiken om WordPress te customizen, je eigen custom hooks te maken en ze te gebruiken om je eigen, uitbreidbare plugins te bouwen.<\/p>\n<p>Klinkt spannend, toch? Laten er dan meteen induiken!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Wat zijn WordPress hooks?<\/h2>\n<p>Een <a href=\"https:\/\/kinsta.com\/nl\/blog\/pagina-of-bericht-in-wordpress-dupliceren\/\">WordPress<\/a> pagina is opgebouwd uit busladingen functions en database-query\u2019s. De WordPress kern, plugins en het thema werken allemaal samen om de elementen op een pagina te produceren, zoals de tekst, <a href=\"https:\/\/kinsta.com\/nl\/blog\/jpg-vs-jpeg\/\">afbeeldingen<\/a>, scripts en styling. Als alles is opgebouwd, stelt de browser alles samen en geeft de pagina weer.<\/p>\n<p>WordPress hooks maken het mogelijk om op specifieke punten &#8220;aan te haken&#8221; bij dit bouwproces en daarin je eigen custom code te draaien. De voornaamste functie van hooks is om het mogelijk te maken om features aan WordPress toe te voegen of te bewerken, zonder dat je de <a href=\"https:\/\/kinsta.com\/nl\/docs\/ondersteuning\/mogelijkheden-support\/managed-wordpress-supportmogelijkheden\/#what-is-wordpress-core\">kernbestanden<\/a> hoeft aan te passen.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/hooks-kunnen-zodoende-helpen-breiden-eigen-code.png\" alt=\"Hooks kunnen je zodoende helpen om WordPress uit te breiden met je eigen code.\" width=\"1100\" height=\"502\"><figcaption class=\"wp-caption-text\">Hooks kunnen je zodoende helpen om WordPress uit te breiden met je eigen code.<\/figcaption><\/figure>\n<p>De <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/\">WordPress Plugin API<\/a> maakt de functionaliteit van WordPress hooks mogelijk. Je kunt hooks gebruiken door specifieke WordPress functions aan te roepen (te callen), die <strong>hook functions<\/strong> worden genoemd, binnen specifieke instances tijdens de WordPress runtime.<\/p>\n<p>Door hook functions te gebruiken kun je je eigen custom code bundelen met een <strong>callback function<\/strong> en dat registeren met elke hook die je wilt. Als die eenmaal geregistreerd is, zal deze callback function altijd gaan draaien waar de hook is, waardoor je de standaard features van WordPress kunt vervangen of veranderen.<\/p>\n<p>De positie van de hook binnen het uitvoeringsproces van de code is een belangrijke factor. In de komende secties zul je hier meer over leren.<\/p>\n\n<h3>Twee typen WordPress hooks: Actions en Filters<\/h3>\n<p>WordPress heeft twee verschillende typen hooks, die <strong>actions<\/strong> en <strong>filters<\/strong> genoemd worden. Actions laten je iets <strong>doen<\/strong> op bepaalde vooraf gedefinieerde punten in de WordPress runtime. Filters <strong>bewerken<\/strong> de data die door WordPress worden verwerkt en <strong><code>return<\/code><\/strong>deze.<\/p>\n<p>Actions worden zo gedefinieerd binnen de WordPress code:<\/p>\n<pre><code class=\"language-php\">do_action( 'action_name', [optional_arguments] );<\/code><\/pre>\n<p>De string <code><strong>action_name<\/strong><\/code> is de naam van de action. Je kunt de variabele <code><strong>[optional_arguments]<\/strong><\/code> specificeren om extra arguments naar de callback function te sturen. Als je dit veld niet specificeert, zal de default value deze leeg laten.<\/p>\n<p><strong>Voorbeeld:<\/strong> De <code><strong>do_action('wp_head')<\/strong><\/code> action kan gehookt worden om custom code uit te laten voeren elke keer dat WordPress de <a href=\"https:\/\/kinsta.com\/nl\/blog\/code-toevoegen-aan-de-wordpress-header-en-footer\/\">site header<\/a> verwerkt. Deze action heeft geen andere arguments.<\/p>\n<p>Filters worden zo gedefinieerd binnen de WordPress code:<\/p>\n<pre><code class=\"language-php\">apply_filters( 'filter_name', 'value_to_be_filtered', [optional_arguments] );<\/code><\/pre>\n<p>De string <code><strong>filter_name<\/strong><\/code> is de naam van het filter, de variable <code><strong>value_to_be_filtered<\/strong><\/code> is de value waarop gefilterd wordt en die geretourneerd wordt en de variable <code><strong>[optional_arguments]<\/strong><\/code> kan net als bij actions extra arguments doorgeven.<\/p>\n<p><strong>Voorbeeld:<\/strong> Het filter <strong><code>apply_filters( 'admin_footer_text' , string $text )<\/code><\/strong> kan gehookt worden aan de tekst die in de admin footer wordt weergegeven om de footer te bewerken. Sinds WordPress 5.4 zal de default value de zin <code><em>Thank you for creating with <\/em><a href=\"https:\/\/wordpress.org\/\"><em>WordPress<\/em><\/a><em>.<\/em><\/code> weergeven in de footer van het admin-gebied.<\/p>\n<p>Je zult verderop leren hoe je actions en filters kun aanhaken met allerlei voorbeelden uit de WordPress kern.<\/p>\n<p>Als je code eenmaal gehookt is, kun je je code iets laten <strong>doen<\/strong> of <strong>bewerken<\/strong> op je site. Zo kun je bijvoorbeeld hooks gebruiken om een <a href=\"https:\/\/kinsta.com\/nl\/blog\/emailmarketing-best-practices\/#email-marketing-platform\">automatische mail<\/a> te versturen nadat je een artikel hebt gepubliceerd, of <a href=\"https:\/\/kinsta.com\/nl\/blog\/child-thema-wordpress\/#the-files-in-a-wordpress-child-theme\">custom stylesheets<\/a> te laden om de weergave van je site te veranderen.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/hooks-helpen-website-bewerken-iets-laten-doen.png\" alt=\"WordPress hooks helpen je om je website te bewerken of iets te laten doen\" width=\"1100\" height=\"600\"><figcaption class=\"wp-caption-text\">WordPress hooks helpen je om je website te bewerken of iets te laten doen<\/figcaption><\/figure>\n<p>De eenvoudigste manier om hooks te begrijpen is door je <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-site-voorbeelden\/\">WordPress website<\/a> voor te stellen als het bouwen van een huis.<\/p>\n<p>Hooks lijken dan op een hijskraan waarmee onderdelen worden verplaatst. De items die verplaatst worden zijn de <strong>callback functions<\/strong>, waaronder jouw <a href=\"https:\/\/kinsta.com\/nl\/blog\/bewerken-wordpress-code\/\">custom code<\/a>. Deze items (of functions) kunnen je helpen bij het bouwen of veranderen van je huis.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/voorbeeld-aanhaken-wp_head-action.png\" alt=\"Voorbeeld van aanhaken bij de 'wp_head' action in WordPress\" width=\"1100\" height=\"636\"><figcaption class=\"wp-caption-text\">Voorbeeld van aanhaken bij de &#8216;wp_head&#8217; action in WordPress<\/figcaption><\/figure>\n<p>Callback functions kunnen normale PHP functions zijn, standaard WordPress functions of custom functions die je zelf gedefinieerd hebt.<\/p>\n<p>We kunnen alleen de bijpassende items hangen aan dragers die bij specifieke hooks horen. Zo kunnen actions alleen gehookt worden met <strong>action functions<\/strong>. En kunnen filters alleen gehookt worden aan <strong>filter functions<\/strong>.<\/p>\n<p>Bij een hijskraan is het een hoop gedoe om dragers te veranderen, maar WordPress maakt dit gelukkig supersimpel doordat het meer dan <a href=\"https:\/\/adambrown.info\/p\/wp_hooks\">2200 types standaard hooks<\/a> bevat.<\/p>\n<figure style=\"width: 900px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/wordpress-5-1-heeft-2200-native-hooks.png\" alt=\"WordPress 5.1 heeft 2200+ native hooks (bron: Adam Brown)\" width=\"900\" height=\"357\"><figcaption class=\"wp-caption-text\">WordPress 5.1 heeft 2200+ native hooks (bron: Adam Brown)<\/figcaption><\/figure>\n<p>Je kunt hooks door de hele WordPress kern vinden, waardoor je aan kunt haken op de positie waar jij dat wilt, en precies op die plek je custom code kunt uitvoeren.<\/p>\n\n<h2>Hooks vs actions vs filters<\/h2>\n<p>Het <a href=\"https:\/\/developer.wordpress.org\/plugins\/hooks\/\">WordPress Plugin Handbook<\/a> zegt het volgende:<\/p>\n<blockquote><p>&#8220;<em>Hooks zijn een manier waarop een stukje code een ander stukje code kan bewerken&#8230; Er zijn twee soorten hooks: Actions en Filters.<\/em>&#8220;<\/p><\/blockquote>\n<p>Er bestaat veel verwarring over hoe de termen <strong>hook<\/strong>, <strong>action<\/strong> en <strong>filter<\/strong> gebruikt moeten worden. Een aantal tutorials en gidsen verwarren ze namelijk met de bijbehorende functions. Een belangrijke oorzaak van deze verwarring is de complexe werking van hooks.<\/p>\n<p>Wanneer je goed in de WordPress kern kijkt, zul je zien dat er weinig verschil zit in het toevoegen van een action of een filter. Dit is bijvoorbeeld de <a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/5.4\/src\/wp-includes\/plugin.php#L403\">broncode voor de add_action() function<\/a> van het bestand <code><strong>wp-includes\/plugin.php<\/strong><\/code>:<\/p>\n<pre><code class=\"language-php\">function add_action( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {\u00a0 \u00a0 \u00a0 \n    return add_filter( $tag, $function_to_add, $priority, $accepted_args );\n}<\/code><\/pre>\n<p>De <code><strong>add_action()<\/strong><\/code> function vraagt de <code><strong>add_filter()<\/strong><\/code> function op en retourneert die value. Waarom? Omdat ze fundamenteel gezien op dezelfde manier werken, op \u00e9\u00e9n belangrijk verschil na.<\/p>\n<p>De <code><strong>apply_filters()<\/strong><\/code> function retourneert een value die bestaande data types kan veranderen, terwijl de <code><strong>do_action()<\/strong><\/code> function niks retourneert (<a href=\"https:\/\/www.php.net\/manual\/en\/functions.returning-values.php\">NULL value binnen PHP<\/a>).<\/p>\n<p>Als je het nog niet begrijpt, geen zorgen! Als je eenmaal de eerste helft van dit artikel gelezen hebt zal het helemaal duidelijk zijn. Wij zullen ons in dit artikel houden aan de offici\u00eble WordPress Codex terminologie, aangezien die duidelijk, precies en universeel is. Zoals je waarschijnlijk gemerkt hebt, gebruiken we vaktermen als value (waarde), function (functie) in het Engels. Dit doen we om verwarring te voorkomen, aangezien verreweg de meeste ontwikkelaars (uitsluitend) bekend zijn met de Engelse terminologie.<\/p>\n<p>Voor nu is vooral belangrijk om vertrouwd te raken met de hook-routine hieronder.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/hooks-hook-functions-callback-functions.png\" alt=\"De hook routine: hooks, hook functions en callback functions\" width=\"1100\" height=\"1161\"><figcaption class=\"wp-caption-text\">De hook routine: hooks, hook functions en callback functions<\/figcaption><\/figure>\n<p>Laten we eerst het verschil bekijken tussen actions en hooks.<\/p>\n<table>\n<tbody>\n<tr>\n<td style=\"text-align: center\" colspan=\"2\"><strong>WordPress Hooks<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\"><strong>Actions<\/strong><\/td>\n<td style=\"text-align: center\"><strong>Filters<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Actions worden gebruikt om custom functions uit te voeren op een specifiek punt tijdens de uitvoering van de WordPress kern.<\/td>\n<td>Filters worden gebruikt om data te bewerken of customizen die door andere functions worden gebruikt.<\/td>\n<\/tr>\n<tr>\n<td>Actions worden gedefinieerd\/gemaakt via de function <strong><code>do_action('action_name')<\/code><\/strong> in de WordPress kern.<\/td>\n<td>Filters worden gedefinieerd\/gemaakt via de function <strong><code>apply_filters('filter_name','value_to_be_filtered; )<\/code><\/strong> in de WordPress kern.<\/td>\n<\/tr>\n<tr>\n<td>Actions worden ook wel <strong>action hooks<\/strong> genoemd.<\/td>\n<td>Filters worden ook wel <strong>filter hooks<\/strong> genoemd.<\/td>\n<\/tr>\n<tr>\n<td>Actions kunnen alleen gehookt worden aan action functions. Bijv.\u00a0<strong><code>add_action()<\/code><\/strong>,\u00a0<strong><code>remove_action()<\/code><\/strong>.<\/td>\n<td>Filters kunnen alleen gehookt worden aan filter functions. Bijv. \u00a0<strong><code>add_filter()<\/code><\/strong>,\u00a0<strong><code>remove_filter()<\/code><\/strong>.<\/td>\n<\/tr>\n<tr>\n<td>Action functions hoeven niet per se arguments door te geven aan hun callback functions.<\/td>\n<td>Filter functions moeten tenminste \u00e9\u00e9n argument doorgeven aan hun callback functions.<\/td>\n<\/tr>\n<tr>\n<td>Action functions kunnen allerlei soorten taken uitvoeren, waaronder het gedrag van hoe WordPress werkt.<\/td>\n<td>Filter functions bestaan alleen om de data die ze krijgen door hun filters te laten gaan.<\/td>\n<\/tr>\n<tr>\n<td>Actions functions moeten niks <strong><code>return<\/code><\/strong>. Maar ze kunnen wel de output <strong><code>echo<\/code><\/strong>&#8216;en of met de database werken.<\/td>\n<td>Filter functions moeten hun veranderingen <strong><code>return<\/code><\/strong> als output. Zelf als een filter niks verandert, moet de niet-aangepaste input nog altijd <strong><code>return<\/code><\/strong> worden.<\/td>\n<\/tr>\n<tr>\n<td>Actions kunnen bijna alles uitvoeren, zolang de code maar logisch is.<\/td>\n<td>Filters moeten op een ge\u00efsoleerde manier werken, waardoor ze bijna nooit onbedoelde bijeffecten hebben.<\/td>\n<\/tr>\n<tr>\n<td><strong>Samenvatting:<\/strong> Een action onderbreekt de normale uitvoering van de code om iets te doen met de informatie die de function krijgt, maar retourneert verder niks, en sluit dan af.<\/td>\n<td><strong>Samenvatting:<\/strong> Een filter verandert de informatie die het krijgt en stuurt deze terug naar de calling hook function, en eventuele andere functions kunnen deze value ook gebruiken.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Soms kun je zowel een action als een filter gebruiken om een bepaald doel te bereiken. Als je bijvoorbeeld de tekst van een artikel wilt aanpassen, kun je een callback function registreren bij de <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/publish_post\">publish_post<\/a> action en de inhoud van het artikelen veranderen op het moment dat het opgeslagen wordt in de <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-database\/\">database<\/a>.<\/p>\n<pre><code class=\"language-php\">\/\/ definieer de callback function om de tekst te veranderen\nfunction change_text_callback() { \n    \/\/ voeg de code hier toe om de tekst te veranderen\n}\n\n\/\/ haak hier aan bij de 'publish_post' action met de add_action() function\nadd_action( 'publish_post', 'change_text_callback' );<\/code><\/pre>\n<p>Of je kunt een andere callback function registreren met de <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/the_content\/\">the_content<\/a> filter om de inhoud van het artikel aan te passen voor het wordt weergegeven in de browser.<\/p>\n<pre><code class=\"language-php\">\/\/ definieer de callback function om de tekst te veranderen\nfunction change_text_another_callback( $content ) { \n    \/\/ voeg code toe om de tekst te veranderen en het vervolgens te retourneren\n    return $filtered_content;\n}\n\n\/\/ haak aan bij de 'the_content' filter met de add_filter() function\nadd_filter( 'the_content', 'change_text_another_callback');<\/code><\/pre>\n<p>De twee verschillende manieren geven uiteindelijk hetzelfde resultaat. Weten wanneer je beter de ene en wanneer beter de andere kunt gebruiken is de sleutel om een <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-ontwikkelaar-salaris\/\">echt goede WordPress ontwikkelaar<\/a> te worden.<\/p>\n<h2>Hoe werken WordPress hooks?<\/h2>\n<p>Het eerdere voorbeeld van het huis legt een beetje uit hoe je de basis van hooks kunt zien, maar geeft nog niet de complexiteit weer van h\u00f3e ze precies functioneren. De belangrijkste concepten daarbij zijn hook position en hook specificity, oftewel de plek van een hook en hoe specifiek een hoek is.<\/p>\n<p>Een beter voorbeeld is door je het proces van het samenstellen van een WordPress webpagina voor te stellen als het productieproces van een auto. Maar anders dan bij het produceren van een auto, dat een tijdje kan duren, is het in elkaar zetten van een webpagina nagenoeg onmiddellijk gedaan.<\/p>\n<figure style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/elkaar-zetten-webpagina-lijkt-assembleren-auto.png\" alt=\"Het in elkaar zetten van een webpagina lijkt op het assembleren van een auto\" width=\"1100\" height=\"1223\"><figcaption class=\"wp-caption-text\">Het in elkaar zetten van een webpagina lijkt op het assembleren van een auto<\/figcaption><\/figure>\n<p>Net zoals er steeds een onderdeel toegevoegd wordt aan een auto in een moderne assemblagelijn, wordt een WordPress webpagina ook per element opgebouwd door de server en client samen.<\/p>\n<p>De WordPress kern is te vergelijken met de motor, het chassis en de andere essenti\u00eble onderdelen, die de &#8220;kern&#8221;-functionaliteit mogelijk maken.<\/p>\n<p>Je kunt wel een functionele website maken met alleen maar de WordPress kern, maar dat zou vrij saai zijn. Je hebt daarnaast gave features nodig. En dat is waarbij <a href=\"https:\/\/kinsta.com\/nl\/onderwerpen\/wordpress-plugins\/\">WordPress plugins<\/a> en <a href=\"https:\/\/kinsta.com\/nl\/blog\/snelste-wordpress-thema\/\">thema&#8217;s<\/a> om de hoek komen kijken, die trouwens allebei veel hooks gebruiken.<\/p>\n<p>In het voorbeeld hierboven kun je elk genummerd station binnen de productielijn zien als een hook binnen de WordPress kern. Er zijn twee soorten stations, net zoals de actions en filters. Elk station bevat een specifiek type sleuf waar alleen bepaalde tools in passen, te vergelijken met de action functions en filter functions.<\/p>\n<p>Al deze stations worden op regelmatige intervallen neergezet om zo effici\u00ebnt en modulair mogelijk te zijn.<\/p>\n<p>Afhankelijk van de benodigdheden op een specifieke plek, kunnen we het meest geschikte stuk gereedschap aanhaken op dat specifieke stations. Deze tools zijn de callback functions die gebruikt worden om met WordPress te communiceren.<\/p>\n<p>Sommige tools kunnen de werking van een auto aanzienlijk veranderen, net zoals callback die bij actions geregistreerd zijn. Andere tools zijn er alleen maar om het uiterlijk van een auto te veranderen, zoals callbacks van filters.<\/p>\n<p>Het is cruciaal om op het juiste station het juiste gereedschap te gebruiken als je een functionele auto wilt maken. Op dezelfde manieren helpen hooks ons om WordPress aan te passen aan onze unieke behoeften.<\/p>\n<p>Als je deze vergelijking verder doortrekt, kun je plugins vergelijken met het toevoegen van handige features aan de auto, zoals airbags, een radio, sleutelloos beveiligingssysteem, etc (zoals bijvoorbeeld deze <a href=\"https:\/\/kinsta.com\/nl\/blog\/woocommerce-plugins\/\">om de functionaliteit van WordPress uit te breiden<\/a>). Thema&#8217;s kun je dan vergelijken met het aanpassen van het uiterlijk van de auto, zoals het algehele design, de kleur, wieldoppen, etc (hier lees je <a href=\"https:\/\/kinsta.com\/nl\/blog\/hoe-je-je-wordpress-thema-kan-customizen\/\">hoe je het WordPress thema kunt customizen<\/a>).<\/p>\n<h2>Waar registreer je hooks en hun functions?<\/h2>\n<p>Er zijn twee aanbevolen manieren om hooks toe te voegen binnen WordPress:<\/p>\n<ul>\n<li><strong>Plugins:<\/strong> Maak je eigen plugin en zet al je eigen code daarin.<\/li>\n<li><strong>Child-thema&#8217;s:<\/strong> Registreer de hooks en callback functions binnen je <a href=\"https:\/\/kinsta.com\/nl\/blog\/child-thema-wordpress\/\">child-thema&#8217;s <code><strong>functions.php<\/strong><\/code> bestand<\/a>.<\/li>\n<\/ul>\n<p>Voor deze tutorial beginnen we met het maken van een plugin. Om dat te doen maak je een nieuwe map aan binnen <code><strong>\/wp-content\/plugins\/<\/strong><\/code>.<\/p>\n<p>Ik noem mijn plugin <code><strong>salhooks<\/strong><\/code>, maar je kunt het zo noemen als je zelf wilt. Volgens de WordPress richtlijnen moet je een PHP bestand met dezelfde naam (<code><strong>salhooks.php<\/strong><\/code>) hebben binnen je plugin directory.<\/p>\n<p>Voeg de volgende headervelden toe aan je pluginbestand om het te registreren bij WordPress. Je kunt meer info krijgen over <a href=\"https:\/\/developer.wordpress.org\/plugins\/plugin-basics\/header-requirements\/\">plugin header-eisen<\/a> in de WordPress-Codex<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n\/*\nPlugin Name:  Salhooks\nVersion    :  1.0\nDescription:  Demonstrating WordPress Hooks (Actions and Filters) with multiple examples.\nAuthor     :  Salman Ravoof\nAuthor URI :  https:\/\/www.salmanravoof.com\/\nLicense    :  GPLv2 or later\nLicense URI:  https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\nText Domain:  salhooks\n*\/\n\n\/\/=================================================\n\/\/ Security: Abort if this file is called directly\n\/\/=================================================\nif ( !defined('ABSPATH') ) { \n    die;\n}<\/code><\/pre>\n<p>Sla dit bestand op en activeer de plugin vervolgens binnen je <a href=\"https:\/\/kinsta.com\/blog\/wordpress-admin\/\">WordPress dashboard<\/a>. Ik zal deze plugin gebruiken binnen een <a href=\"https:\/\/kinsta.com\/nl\/blog\/lokale-wordpress-installatie\/\">lokale WordPress installatie<\/a> om te demonstreren hoe hooks werken.<\/p>\n<p>Je kunt trouwens ook bestanden van de WordPress kern direct bewerken om hooks te registreren. Maar dit is niet aanbevolen omdat al je eigen code wordt overschreven zodra je <a href=\"https:\/\/kinsta.com\/nl\/blog\/automatische-wordpress-updates\/\">WordPress update<\/a>t. Hierdoor heeft het ook weinig zin om hooks toe te voegen binnen je parent-thema.<\/p>\n<h2>WordPress hooks gebruiken<\/h2>\n<p>Een WordPress-hook alleen doet helemaal niks. Deze is in feite aan het wachten binnen de code, totdat deze gecalld wordt door een hook function. Om een hook te gebruiken, moet je nog tenminste twee andere functions callen.<\/p>\n<p>Allereerst moet je de hook registreren met een hook function en een callback function erheen laten refereren. Vervolgens moet je de callback function die je eerder in de hook function gebruikte defini\u00ebren. WordPress zal deze callback function vervolgens elke keer uitvoeren als de hook geactiveerd wordt.<\/p>\n<p>De volgorde waarin je deze functions definieert maakt niet uit, maar het is wel uit praktisch oogpunt slim om ze dicht bij elkaar te zetten.<\/p>\n<p>Actions en filters hebben specifieke hook functions. Vanaf hier zullen we daar dan ook aan refereren als <strong>action functions<\/strong> en <strong>filter functions<\/strong>. Zoals je ziet hebben ze allebei hun eigen syntax en eisen qua parameters.<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Hooken van een action<\/h3>\n<p>Actions bieden een manier om je eigen custom code uit te voeren op een specifiek punt tijdens het uitvoeren van de WordPress kern, plugins of thema&#8217;s.<\/p>\n<h4>De add_action() action function<\/h4>\n<p>Je kunt een callback function met een action registreren door de volgende stappen te volgen:<\/p>\n<ol>\n<li>Definieer een <strong>callback function<\/strong> met daarbinnen je eigen code. Deze callback function zal uitgevoerd worden wanneer de action waarmee het is geregistreerd wordt geactiveerd binnen de uitvoering van WordPress.<\/li>\n<li>Hook je callback function aan de action die je wilt via de <code><strong>add_action()<\/strong><\/code> function. Volgens de WordPress Codex moet de <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_action\/\">add_action()<\/a> function tenminste twee parameters doorgeven:<\/li>\n<\/ol>\n<ul>\n<li>Naam van de action waaraan het moet hooken.<\/li>\n<li>Naam van de callback function die uitgevoerd wordt wanneer de action getriggerd wordt.<\/li>\n<\/ul>\n<ol start=\"2\">\n<li>De <code><strong>add_action()<\/strong><\/code> function accepteert daarnaast ook nog twee optionele parameters voor het instellen van <code><strong>priority<\/strong><\/code> en het <code><strong>number of\u00a0arguments<\/strong><\/code>. Hier zullen we het later over hebben.<\/li>\n<\/ol>\n<p>Het is good practice om de parameters van je callback function te benoemen, zo dicht mogelijk bij de parameters die door de hook function doorgegeven worden.<\/p>\n<p>Laten we eens kijken naar een voorbeeld hoe je de <code><strong>add_action()<\/strong><\/code> function kunt gebruiken.<\/p>\n<pre><code class=\"language-php\">\/\/ definieer de callback function, de arguments zijn optioneel\nfunction example_callback( $arg1, $arg2 ) {\n\u00a0 \u00a0 \/\/ laat je code iets doen met de arguments\n}\n\n\/\/ haak de callback function aan de 'example_action'\nadd_action( 'example_action', 'example_callback', [priority], [no_of_args] );\n\n\/\/ 'priority' en 'number of arguments' zijn optionele parameters<\/code><\/pre>\n<h4>Voorbeeld van &#8220;hooking&#8221; van een action<\/h4>\n<p>WordPress heeft een ingebouwde action die <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/init\/\">init<\/a> heet. Deze wordt geactiveerd nadat WordPress klaar is met laden en de gebruiker geverifieerd heeft, nog voordat er headers worden verstuurd. Veel plugins gebruiken deze hook als startpunt om hun code te initialiseren aangezien bijna alle grotere WordPress features geladen zijn tegen de tijd dat WordPress deze action uitvoert.<\/p>\n<p>WordPress heeft nog een soortgelijke action die <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/admin_init\/\">admin_init<\/a> heet. Deze activeert wanneer het adminscherm ge\u00efnitialiseerd wordt, terwijl de <code><strong>init<\/strong><\/code> action pas geactiveerd wordt als WordPress helemaal klaar is met laden.<\/p>\n<p>Laten we onze eigen code uitvoeren om een eenvoudig bericht te <code><strong>echo<\/strong><\/code>-en tijdens de uitvoering van de <code><strong>init<\/strong><\/code> action. Dat doen we zo:<\/p>\n<pre><code class=\"language-php\">function custom_callback_function(){\n\u00a0 \u00a0 \/\/ voeg je custom code toe om iets te doen\n\u00a0 \u00a0 echo 'I will be fired on WordPress initialization';\n}\nadd_action( 'init', 'custom_callback_function' );<\/code><\/pre>\n<p>Je kunt het bericht zien bovenin links binnen mijn <a href=\"https:\/\/kinsta.com\/nl\/blog\/lokale-wordpress-installatie\/\">lokale WordPress installatie<\/a>.<\/p>\n<figure id=\"attachment_72244\" aria-describedby=\"caption-attachment-72244\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72244 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/voorbeeld-hooking-action.jpg\" alt=\"Het ziet er verder niet uit, maar het gaat om het idee.\" width=\"1100\" height=\"500\"><figcaption id=\"caption-attachment-72244\" class=\"wp-caption-text\">Het ziet er verder niet uit, maar het gaat om het idee.<\/figcaption><\/figure>\n<h4>Actions vinden die ondersteund worden door WordPress<\/h4>\n<p>WordPress bevat actions voor elk moment dat het iets doet, zoals wanneer <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-login-url\/\">een gebruiker inlogt<\/a> of <a href=\"https:\/\/kinsta.com\/nl\/blog\/missed-schedule-foutmelding-lossen\/\">een nieuw artikel publiceert<\/a>. Je kunt een volledige lijst met actions die WordPress ondersteunt, vinden in de <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\">Plugin API\/Action Reference<\/a> pagina.<\/p>\n<figure id=\"attachment_72247\" aria-describedby=\"caption-attachment-72247\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72247 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/er-een-action-voor-elk-moment.png\" alt=\"Er is een action voor elk moment\" width=\"1100\" height=\"500\"><figcaption id=\"caption-attachment-72247\" class=\"wp-caption-text\">Er is een action voor elk moment<\/figcaption><\/figure>\n<p>De Codex heeft alle actions die hier genoemd worden opgesplitst in diverse categorie\u00ebn en op volgorde gerangschikt waarin ze binnen WordPress uitgevoerd worden.<\/p>\n<p>In de meeste gevallen zullen deze actions niks doen, omdat er niks aan gehookt is. Maar indien nodig, kan je er dus iets aan hooken.<\/p>\n<p>Krijg je keuzestress van zoveel actions? Dat is normaal. Naarmate je hier meer ervaring in krijgt en vaker de broncode van de WordPress kern doorneemt, wordt het steeds makkelijker om de perfecte hook voor je toepassing te vinden. Zoek op de term &#8220;<strong>do_action<\/strong>&#8221; en je zal allerlei actions vinden waarop je kunt hooken.<\/p>\n<h4>Additionele parameters voor add_action()<\/h4>\n<p>De <code><strong>add_action()<\/strong><\/code> function kan nog twee parameters verwerken: \u00e9\u00e9n voor<strong> <code>priority<\/code><\/strong> en de andere voor het <code><strong>number of arguments<\/strong><\/code>. Alhoewel ze slechts optioneel zijn, kun ze superhandig zijn, als je ze goed gebruikt.<\/p>\n<h5>Priority<\/h5>\n<p>De eerste extra parameter die <code><strong>add_action()<\/strong><\/code> ondersteunt, stelt<strong><code>priority<\/code><\/strong> in. Deze parameter kan alleen een positieve integer (geheel getal) zijn. Hoe lager het getal, hoe hoger priority (zie het als een ranglijst) en hoe eerder de function uitgevoerd wordt. De standaard value is 10 als je deze niet verder definieert.<\/p>\n<p>Om te zien hoe dit werkt, registreren we drie callback functions met de <code><strong>init<\/strong><\/code> action, maar elk met verschillen priorityen.<\/p>\n<pre><code class=\"language-php\">\/\/ priority is ingesteld op 9, wat lager is dan 10, waardoor het hoger is gerankt\nadd_action( 'init', 'i_am_high_priority', 9 );\n\n\/\/ als er geen priority is ingesteld, dan wordt de standaard value 10 gebruikt\nadd_action( 'init', 'i_am_default_priority');\n\n\/\/ priority is ingesteld op 11, wat lager is dan 10, waardoor het lager is gerankt\nadd_action( 'init', 'i_am_low_priority', 11 );<\/code><\/pre>\n<p>In de voorbeelden hierboven zal de callback function met het laagste getal (dus hoogste prioriteit) als eerste uitgevoerd worden, en die met het hoogste getal als laatste. Als priorityen gelijk zijn (bijvoorbeeld wanneer je ze niet gespecificeerd hebt), worden ze uitgevoerd in de volgorde waarin je ze registreert.<\/p>\n<p>Prioriteit is vooral erg belangrijk wanneer een enkele hook geregistreerd is met diverse callback functions. Om onverwachte resultaten te voorkomen, kun je het beste een prioriteit voor elke callback function instellen, zodat ze in een gecontroleerde volgorde draaien.<\/p>\n<h5>Number of Arguments<\/h5>\n<p>Standaard krijgt elke callback function die je registreert via de <code><strong>add_action()<\/strong><\/code> function slechts \u00e9\u00e9n argument. Maar soms wil je extra data doorgeven aan de callback function.<\/p>\n<p>Daarom accepteert de <code><strong>add_action()<\/strong><\/code> function een optionele parameter voor het instellen van het number of arguments.<\/p>\n<p>Een goed voorbeeld om dit te illustreren is de <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/comment_post\/\">comment_post<\/a> action. Deze action wordt direct uitgevoerd nadat <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-reactie-plugins\/\">WordPress een reactie (comment) toevoegt aan de database<\/a>. Als je de parameter voor het <strong><code>number of arguments<\/code><\/strong> niet instelt, zal deze slechts \u00e9\u00e9n value doorgeven aan de callback function, wat in dit geval het <code><strong>comment_ID<\/strong><\/code> zou zijn.<\/p>\n<pre><code class=\"language-php\">\/\/ registreer de hook met 'priority' en 'number of arguments' parameters\nadd_action( 'comment_post', 'show_message_function', 10, 3 );\n\n\/\/ definieer de callback function\nfunction show_message_function( $comment_ID, $comment_approved, $commentdata ) {\n\u00a0 \u00a0 \/\/ checkt met de tweede parameter of een reactie is goedgekeurd\n\u00a0 \u00a0 if( 1 === $comment_approved ){\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ runt de code alleen als de reactie is goedgekeurd\n\u00a0 \u00a0 }\n}<\/code><\/pre>\n<p>Als je de parameter voor het <strong>number of arguments<\/strong> op <strong>3<\/strong> instelt zoals in het voorbeeld hierboven, zal de action function drie values doorgeven: <code><strong>comment_ID<\/strong><\/code>, <code><strong>comment_approved<\/strong><\/code>, en <code><strong>commentdata<\/strong><\/code>.<\/p>\n<p>WordPress zet de value van <code><strong>comment_approved<\/strong><\/code> op <strong>1<\/strong> voor goedgekeurde reacties, op <strong>0<\/strong> als ze niet goedgekeurd zijn, en op &#8216;<strong>spam<\/strong>&#8216; als de<a href=\"https:\/\/kinsta.com\/nl\/blog\/spamreacties-wordpress\/\"> reactie gemarkeerd is als spam<\/a>.<\/p>\n<p>De variabele <code><strong>commentdata<\/strong><\/code> is een array die alle data over de reactie bevat, zoals de naam van de auteur, e-mailadres, website en de daadwerkelijke inhoud van de reactie. Je kunt in de WordPress Codex alle <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_new_comment\/#parameters\">key-value pairs vinden die in de &#8216;commentdata&#8217; array<\/a> zitten.<\/p>\n<p>Je kunt zoveel arguments toevoegen als je wilt, maar de callback function en de <code><strong>add_action()<\/strong><\/code> function moeten hetzelfde number of arguments specificeren.<\/p>\n<p>Door meer parameters door te geven aan de callback function kun je meer doen met je code. Zo kun je bijvoorbeeld controleren of een reaction is goedgekeurd en <a href=\"https:\/\/kinsta.com\/nl\/blog\/spamreacties-wordpress\/#3-enable-comment-moderation\">automatisch de tekst van de reactie naar een admin mailen als dat zo is<\/a>. Dat kun je niet doen zonder extra arguments te specificeren, aangezien je callback function dan geen toegang heeft tot de <code><strong>comment_content<\/strong><\/code> data.<\/p>\n<p>Als je priority niet wilt instellen, maar alleen het number of arguments wilt veranderen, zul je nog steeds priority moeten instellen. Gebruik dan gewoon de standaard value (10).<\/p>\n<h4>Zo gebruikt de WordPress kern actions<\/h4>\n<p>De WordPress kern gebruikt zelf ook veel ingebouwde actions om bepaalde functionaliteit uit te voeren.<\/p>\n<p>Neem bijvoorbeeld de <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/wp_head\/\">wp_head<\/a> action. Deze wordt uitgevoerd wanneer WordPress de header van de webpagina&#8217;s maakt (de code die gaat tussen <code><strong>&lt;head&gt;<\/strong><\/code> en <code><strong>&lt;\/head&gt;<\/strong><\/code>.<\/p>\n<p>Je kunt de meeste action function van de WordPress Core die met de <code><strong>wp_head<\/strong><\/code> hook te maken hebben, vinden in het bestand \u00a0<code><strong>wp-includes\/default-filters.php<\/strong><\/code>. Ik <a href=\"https:\/\/github.com\/WordPress\/WordPress\/blob\/master\/wp-includes\/default-filters.php\">heb de code doorzocht<\/a> en heb een lijst gemaakt met alle <code><strong>add_action()<\/strong><\/code> functions die de <code><strong>wp_head<\/strong><\/code> action activeren.<\/p>\n<pre><code class=\"language-php\">add_action( 'wp_head', 'rest_output_link_wp_head', 10, 0 );\nadd_action( 'wp_head', '_wp_render_title_tag', 1 );\nadd_action( 'wp_head', 'wp_enqueue_scripts', 1 );\nadd_action( 'wp_head', 'wp_resource_hints', 2 );\nadd_action( 'wp_head', 'feed_links', 2 );\nadd_action( 'wp_head', 'feed_links_extra', 3 );\nadd_action( 'wp_head', 'rsd_link' );\nadd_action( 'wp_head', 'wlwmanifest_link' );\nadd_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );\nadd_action( 'wp_head', 'locale_stylesheet' );\nadd_action( 'wp_head', 'noindex', 1 );\nadd_action( 'wp_head', 'print_emoji_detection_script', 7 );\nadd_action( 'wp_head', 'wp_print_styles', 8 );\nadd_action( 'wp_head', 'wp_print_head_scripts', 9 );\nadd_action( 'wp_head', 'wp_generator' );\nadd_action( 'wp_head', 'rel_canonical' );\nadd_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );\nadd_action( 'wp_head', 'wp_custom_css_cb', 101 );\nadd_action( 'wp_head', 'wp_site_icon', 99 );\nadd_action( 'wp_head', 'wp_no_robots' );<\/code><\/pre>\n<p>Zoals je ziet, zijn dit een hoop callback functions die gehookt zijn aan slechts \u00e9\u00e9n action. Hierbij is het instellen van de <code><strong>priority<\/strong><\/code> van cruciaal belang zodat de belangrijkste functions eerst uitgevoerd worden.<\/p>\n<p>In het voorbeeld hierboven is het laden van de scripts met de <code><strong>wp_enqueue_scripts()<\/strong><\/code> callback function belangrijker (priority=1) dan het laden van de meta tags van het site-icoon met de <code><strong>wp_site_icon()<\/strong><\/code> callback function (priority=99).<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Alle callback functions die in het voorbeeld hierboven gebruikt worden, zijn WordPress functions. Die kun je dus ook in je eigen code gebruiken. Kijk op de <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\">Function Reference pagina in de WordPress Codex<\/a> voor meer informatie.<\/p>\n<\/aside>\n\n<h4>Andere Action Functions<\/h4>\n<p>Alhoewel <code><strong>add_action()<\/strong><\/code> de meest gebruikte action function is, zijn er nog allerlei andere die net zo handig kunnen zijn. Laten we eens kijken hoe die allemaal werken.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/has_action\">has_action()<\/a><\/li>\n<\/ul>\n<p>Deze action function kijkt of er een action aan gehookt is. Het accepteert twee parameters. De eerste is de naam van de action. De tweede parameter is optioneel en is de naam van de callback function.<\/p>\n<pre><code class=\"language-php\">has_action( 'action_name', 'function_to_check' );<\/code><\/pre>\n<p>Als je alleen de eerste parameter specificeert, zal het <code><strong>true<\/strong><\/code> teruggeven als er <em>welke function dan ook<\/em> gehookt is aan de <code><strong>action_name<\/strong><\/code> parameter.<\/p>\n<p>Maar als je ook de tweede parameter specificeert, zal het <code><strong>false<\/strong><\/code> retourneren als de gespecificeerde callback function niet geregistreerd is met de action die genoemd wordt.<\/p>\n<p>Maar als het de gespecificeerde callback function bij de action hook vindt, zal het de <code><strong>priority<\/strong><\/code> (integer) terugsturen die voor deze function aan deze hook is ingesteld.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/do_action\/\">do_action()<\/a><\/li>\n<\/ul>\n<p>We hebben deze action function al eerder gezien. WordPress gebruikt deze om alle standaard actions te defini\u00ebren, waardoor je andere functions daaraan vast kan haken. Net als WordPress kan ook jij de <code><strong>do_action()<\/strong><\/code> function gebruiken om een nieuwe custom action te maken door een nieuwe action naam te specificeren als de parameter.<\/p>\n<pre><code class=\"language-php\">do_action( 'action_name', [argument1], [argument2] );<\/code><\/pre>\n<p>Door deze function te defini\u00ebren, gebeurt er verder niks. Maar het zal in de code zitten wachten tot het geactiveerd wordt door andere action functions. Het is optioneel om extra arguments door te geven, maar dat is wel belangrijk als je wilt dat jouw callback functions die gebruiken.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/do_action_ref_array\">do_action_ref_array()<\/a><\/li>\n<\/ul>\n<p>Deze action function is identiek aan <code><strong>do_action()<\/strong><\/code>, op \u00e9\u00e9n verschil na. Alle arguments die het ontvangt moeten arrays zijn. Wanneer je veel arguments door moeten geven, of deze arguments van zichzelf al arrays zijn, is dit een superhandige function.<\/p>\n<pre><code class=\"language-php\">\/\/ dit is een voorbeeld-array\n$arguments_array = array( 'arg_1', 'foo', true, 'arg_4' );\n\ndo_action_ref_array( 'example_action', $arguments_array );<\/code><\/pre>\n<p>Aangezien PHP-arrays een ordered map zijn, moet je ervoor zorgen dat de arguments die je doorgeeft dus ook in de juiste volgorde staan.<\/p>\n<p>Een voorbeeld van het gebruik van deze action function is de <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/admin_bar_menu\/\">admin_bar_menu<\/a> action. Deze kan gehookt worden om verschillende items in de admin-toolbar te veranderen, toe te voegen of te verwijderen. Alle items van de toolbar zijn gedefinieerd als elements van een array.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/did_action\">did_action()<\/a><\/li>\n<\/ul>\n<p>Als je wilt tellen hoe vaak een action is geactiveerd, kun je deze action function gebruiken.<\/p>\n<pre><code class=\"language-php\">did_action( 'action_name' );<\/code><\/pre>\n<p>Deze function geeft een geheel getal (integer) terug.<\/p>\n<p>De <code><strong>did_action()<\/strong><\/code> function is superhandig als je bijvoorbeeld wil dat een callback function alleen loopt de eerste keer dat een action wordt uitgevoerd, en daarna nooit weer.<\/p>\n<pre><code class=\"language-php\">function example_callback_function() {\n    if( did_action( 'example_action' ) === 1 ) {\n    \/\/ checkt of de 'example_action' hook eenmaal is geactiveerd, en runt alleen dan en nooit meer erna!\n    }\n}\nadd_action('example_action', 'example_callback_function');<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/remove_action\">remove_action()<\/a><\/li>\n<\/ul>\n<p>Deze action function verwijdert een callback function die gehookt is aan de gespecificeerde action. Je kunt deze function bijvoorbeeld gebruiken om de standaard WordPress functions die aan ingebouwde actions gehookt zijn, te verwijderen en te vervangen met je eigen functions.<\/p>\n<pre><code class=\"language-php\">remove_action( 'action_name', 'function_to_be_removed', [priority] );<\/code><\/pre>\n<p>Er zijn een paar voorwaarden voordat je de <code><strong>remove_action()<\/strong><\/code> function kunt callen:<\/p>\n<ol>\n<li>De <code><strong>function_to_be_removed<\/strong><\/code> en <code><strong>priority<\/strong><\/code> parameters moeten hetzelfde zijn als die gebruikt werden in de originele <code><strong>add_action()<\/strong><\/code> function.<\/li>\n<li>Je kunt de <code><strong>remove_action()<\/strong><\/code> function niet direct callen. Je moet deze vanuit een andere function callen.<\/li>\n<li>Als de callback function geregistreerd is met een <em>class<\/em>, dan zijn er nog meer voorwaarden om deze te kunnen verwijderen. Je kunt de documentatie in de WordPress Codex bekijken voor meer details.<\/li>\n<li>Je kunt de callback function niet verwijderen voordat deze \u00fcberhaupt geregistreerd is, of nadat deze al uitgevoerd is.<\/li>\n<\/ol>\n<p>Hier een voorbeeld van hoe <a href=\"https:\/\/kinsta.com\/nl\/blog\/woocommerce-handleiding\/\">WooCommerce<\/a> deze action function gebruikt om de standaard productthumbnail te verwijderen op de hoofdpagina van een webshop.<\/p>\n<pre><code class=\"language-php\">remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10 );<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/remove_all_actions\">remove_all_actions()<\/a><\/li>\n<\/ul>\n<p>Deze action function verwijdert alles dat gehookt is aan een action. De priority parameter is optioneel.<\/p>\n<pre><code class=\"language-php\">remove_all_actions( 'action_name', [priority] );<\/code><\/pre>\n<p>Onthoud dat deze function niet aangeroepen kan worden vanuit de action van waaruit je graag de callback functions wilt verwijderen. Dat zou een oneindige loop veroorzaken. Je kunt aanhaken bij een action die eerder uitgevoerd wordt om deze function zonder fouten uit te voeren.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/doing_action\/\">doing_action()<\/a><\/li>\n<\/ul>\n<p>Deze function checkt of een bepaalde action uitgevoerd wordt of niet. Het retourneert vervolgens een boolean value (<code><strong>true<\/strong><\/code> of <code><strong>false<\/strong><\/code>).<\/p>\n<pre><code class=\"language-php\">\/\/ check of de 'action_name' action wordt uitgevoerd\nif ( doing_action( 'action_name' ) ) {\n\u00a0 \u00a0 \/\/ voer je code hier uit\n}<\/code><\/pre>\n<p>Je kunt de <code><strong>action_name<\/strong><\/code> parameter leeg laten om te checken of er \u00fcberhaupt <em>een<\/em> action uitgevoerd wordt. Dit zal <code><strong>true<\/strong><\/code> retourneren elke keer dat er een action geactiveerd wordt.<\/p>\n<pre><code class=\"language-php\">\/\/ check of welke code dan ook runt en iets doet\nif ( doing_action() ) {\n  \u00a0 \/\/ de code hier wordt uitgevoerd wanneer elke action dan ook wordt geactiveerd\n}<\/code><\/pre>\n<h4>Actions voorbeeld 1: toon je bezoekers een onderhoudsmededeling<\/h4>\n<p>Soms is het nodig om je website tijdelijk offline te halen en een <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-onderhoudsmodus\/\">Under Maintenance pagina<\/a> te activeren. Gelukkig biedt WordPress daarvoor een eenvoudige manier.<\/p>\n<pre><code class=\"language-php\">\/\/ laat een onderhoudsmedeling zien voor alle sitebezoekers\nadd_action( 'get_header', 'maintenance_message' );\nfunction maintenance_message() {\n    if (current_user_can( 'edit_posts' )) return;\n    wp_die( '&lt;h1&gt;Stay Pawsitive!&lt;\/h1&gt;&lt;br&gt;Sorry, we\\'re temporarily down for maintenance right meow.' );\n}<\/code><\/pre>\n<p>Laten we deze code stap-voor-stap bekijken.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/get_header\/\">get_header<\/a> is een action die geactiveerd wordt voordat het header templatebestand van de website geladen wordt. Dit is een perfecte action om aan te hooken, als je wilt voorkomen dat de hoofdsite geladen wordt.<\/li>\n<li>Hook aan de <code><strong>get_header<\/strong><\/code> action door middel van de <code><strong>add_action()<\/strong><\/code> function met de <code><strong>maintenance_message()<\/strong><\/code> callback function.<\/li>\n<li>Definieer de <code><strong>maintenance_message()<\/strong><\/code> callback function.<\/li>\n<li><code><strong>current_user_can('edit_posts')<\/strong><\/code> is een <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/current_user_can\/\">user capability test function<\/a>, die dus controleert of de huidige gebruiker ingelogd is en <a href=\"https:\/\/wordpress.org\/support\/article\/roles-and-capabilities\/#edit_posts\">artikelen kan bewerken<\/a>. <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-registratie-plugins\/\">Elke gebruiker die op een WordPress website geregistreerd is<\/a>, heeft die mogelijkheid, behalve gebruikers met &#8220;Subscriber&#8221;-rol. Er zijn ook andere, meer robuuste manieren om deze check uit te voeren, maar we houden het even bij deze simpelere methode.<\/li>\n<li>Gebruik de standaard <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_die\/\">wp_die()<\/a> function om de WordPress uitvoering netjes te stoppen, en een HTML-pagina met een foutmelding weer te geven. Je kunt HTML syntax binnen de parameter met de foutmelding gebruiken om de melding te stylen.<\/li>\n<\/ul>\n<p>Nadat ik de code heb opgeslagen in mijn custom plugin, laad ik mijn lokale WordPress installatie in private browsing modus. De <strong>Under Maintenance<\/strong> pagina werkt!<\/p>\n<figure id=\"attachment_72274\" aria-describedby=\"caption-attachment-72274\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72274 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/foutmelding-bezoekers-tonen.png\" alt=\"Een foutmelding aan je bezoekers tonen\" width=\"1100\" height=\"500\"><figcaption id=\"caption-attachment-72274\" class=\"wp-caption-text\">Een foutmelding aan je bezoekers tonen<\/figcaption><\/figure>\n<p>De website laadt, als ik ingelogd ben en aan de user capability test voldoe, normaal. Je kunt nu rustig doorwerken aan je website terwijl je bezoekers alleen de onderhoudspagina zien.<\/p>\n<h4>Actions voorbeeld 2: Verberg dashboard menu-items voor niet-admin gebruikers<\/h4>\n<p>Als je een <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-auteur-veranderen\/\">blog met meerdere auteurs<\/a> beheert of een <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-onderhoud\/\">website voor klanten beheert<\/a>, kan het zijn dat je bepaalde admin-menu&#8217;s van het <a href=\"https:\/\/kinsta.com\/blog\/wordpress-admin\/\">WordPress dashboard<\/a> wilt verbergen voor gebruikers die geen admin zijn. Dat kun je doen door aan de <code><strong>admin_menu<\/strong><\/code> action te hooken.<\/p>\n<pre><code class=\"language-php\">\/\/ verwijder specifieke dashboard menu-items voor niet-admin gebruikers\nadd_action( 'admin_menu', 'hide_admin_menus' );\nfunction hide_admin_menus() {\n    if (current_user_can( 'create_users' )) return;\n    if (wp_get_current_user()-&gt;display_name == \"Salman\") return; \n    remove_menu_page( 'plugins.php' ); \n    remove_menu_page( 'themes.php' ); \n    remove_menu_page( 'tools.php' ); \n    remove_menu_page( 'users.php' ); \n    remove_menu_page( 'edit.php?post_type=page' ); \n    remove_menu_page( 'options-general.php' );\n}<\/code><\/pre>\n<p>Laten we ook dit stukje code stap-voor-stap doornemen.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/admin_menu\/\">admin_menu<\/a> is een action die getriggerd wordt voordat het adminmenu laadt binnen het WordPress dashboard.<\/li>\n<li>Hook aan de <code><strong>admin_menu <\/strong><\/code>action door middel van de <code><strong>add_action()<\/strong><\/code> function met de <code><strong>hide_admin_menus()<\/strong><\/code> callback function.<\/li>\n<li>De <code><strong>hide_admin_menus()<\/strong><\/code> callback function definieert de logica van de code. Dit draait elke keer dat de <code><strong>admin_menu<\/strong><\/code> action geactiveerd wordt.<\/li>\n<li>Binnen de callback function controleert de <code><strong>current_user_can('create_users')<\/strong><\/code> function of de ingelogde gebruiker inderdaad een admin is. Aangezien alleen site-admins de <code><strong>create_user<\/strong><\/code> mogelijkheid hebben, eindigt de function met een <code><strong>return<\/strong><\/code> statement als de gebruiker inderdaad een admin is.<\/li>\n<li>De <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_current_user\/\">wp_get_current_user()<\/a> WordPress function haalt het huidige user object op. Met deze function kunnen we controleren of de ingelogde gebruiker een bepaalde <code><strong>display_name<\/strong><\/code> set heeft. Dit is een optionele regel code, voor wanneer je wilt voorkomen dat sommige non-admins ook buitengesloten worden door deze callback function.<\/li>\n<li>De <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/remove_menu_page\/\">remove_menu_page()<\/a>WordPress function verwijdert top-level admin-menu&#8217;s. In het voorbeeld hierboven verwijder ik de volgende admin menu&#8217;s: Plugins, Themes, Tools, Users, Pages en Options.<\/li>\n<\/ul>\n<p>Nadat we het pluginbestand opslaan, zie je in dezehoe het WordPress dashboard er voor de admin uitziet.<\/p>\n<figure id=\"attachment_72251\" aria-describedby=\"caption-attachment-72251\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72251 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/standaard-wordpress-admin-dashboard.png\" alt=\"Het standaard WordPress admin dashboard\" width=\"1100\" height=\"500\"><figcaption id=\"caption-attachment-72251\" class=\"wp-caption-text\">Het standaard WordPress admin dashboard<\/figcaption><\/figure>\n<p>En hier een screenshot van hoe het WordPress dashboard er nu uitziet voor een non-admin-gebruiker.<\/p>\n<figure id=\"attachment_72249\" aria-describedby=\"caption-attachment-72249\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72249 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/verbergen-gevoelige-admin-menu-items-non-admins.png\" alt=\"Verbergen van gevoelige admin menu-items voor non-admins\" width=\"1100\" height=\"500\"><figcaption id=\"caption-attachment-72249\" class=\"wp-caption-text\">Verbergen van gevoelige admin menu-items voor non-admins<\/figcaption><\/figure>\n<p>Deze oplossing verbergt alleen specifieke menu-items binnen het WordPress dashboard. Maar alle gebruikers hebben nog steeds toegang als ze de menu URL&#8217;s gewoon invoeren in hun browser.<\/p>\n<p>Om te voorkomen dat bepaalde <a href=\"https:\/\/kinsta.com\/nl\/blog\/gebruikersrollen-wordpress\/\">gebruikersrollen<\/a> toegang hebben tot specifieke menu-items, moet je hun rechten aanpassen.<\/p>\n<h3>Hooken van een filter<\/h3>\n<p>Filters bieden de mogelijkheid om data die andere WordPress-functions gebruiken, te veranderen. Anders dan bij actions, moeten functions die aan filters gehookt zijn, een bepaalde value retourneren.<\/p>\n<h4>De add_filter() filter function<\/h4>\n<p>Je kunt een callback function aan een filter hooken middels de volgende stappen:<\/p>\n<ol>\n<li>Definieer een <strong>callback function<\/strong> die draait wanneer WordPress het filter activeert. Callback functions voor filters moeten minimaal \u00e9\u00e9n argument gespecificeerd hebben, aangezien alle filters tenminste \u00e9\u00e9n value aan hun callback functions doorgeven.<\/li>\n<li>Registreer de callback function met een filter via de <code><strong>add_filter()<\/strong><\/code> function. Het filter zal nu de callback function aanroepen. Volgens de WordPress Codex, moet de <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_filter\/\">add_filter()<\/a> function tenminste twee parameters doorgeven.\n<ol>\n<li>Naam van het filter waaraan het moet hooken.<\/li>\n<li>Naam van de callback function die uitgevoerd wordt wanneer de filter getriggerd wordt.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<ol start=\"2\">\n<li>De <code><strong>add_filter()<\/strong><\/code> function accepteert ook twee additionele optionele parameters voor het instellen van <code><strong>priority<\/strong><\/code> en het <code><strong>number of arguments<\/strong><\/code>. Deze parameters werken op dezelfde manier als bij de <code><strong>add_action()<\/strong><\/code> function.<\/li>\n<\/ol>\n<p>Hier een voorbeeld voor hoe je de <code><strong>add_filter()<\/strong><\/code> function kunt gebruiken om een callback function aan een filter te hooken.<\/p>\n<pre><code class=\"language-php\">\/\/ definieer de filter callback function met tenminste een ge-passed-e arguments\n\/\/ het aantal arguments die je kan passen hangt af van hoe de filter is gedefinieerd\nfunction filter_callback_function( $arg1, $arg2 ) {\n\u00a0 \u00a0 \/\/ laat je code iets doen met de arguments en retourneert iets\n\u00a0 \u00a0 return $something;\n}\n\n\/\/ haak nu de callback function aan bij de 'example_filter'\nadd_filter( 'example_filter', 'filter_callback_function', [priority], [no_of_args] );\n\n\/\/ '10' is de standaard prioriteit die is ingesteld voor de callback function\n\/\/ en '1' is het standaard getal of ge-passed-e arguments<\/code><\/pre>\n<h4>Voorbeeld voor het hooken van een filter<\/h4>\n<p>WordPress biedt een filter dat <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\/login_message\">login_message<\/a> heet om het bericht te filteren dat bovenaan de inlogpagina wordt weergegeven. De value die dit filter retourneert kan <a href=\"https:\/\/kinsta.com\/nl\/blog\/gratis-html-editors\/\">HTML markup<\/a> bevatten.<\/p>\n<p>Laten we hooken aan het <code><strong>login_message<\/strong><\/code> filter en het inlogbericht veranderen.<\/p>\n<pre><code class=\"language-php\">\/\/ laat een custom loginbericht zien boven het loginformulier\nfunction custom_login_message( $message ) {\n\u00a0 \u00a0 if ( empty( $message ) ) {\n\u00a0 \u00a0 \u00a0 \u00a0 return \"&lt;h2&gt;Welcome to Let's Develop by Salman Ravoof! Please log in to start learning.&lt;\/h2&gt;\";\n\u00a0 \u00a0 } \n    else {\n\u00a0 \u00a0 \u00a0 \u00a0 return $message;\n\u00a0 \u00a0 }\n}\nadd_filter( 'login_message', 'custom_login_message' );<\/code><\/pre>\n<p>Het <code><strong>if-else<\/strong><\/code> statement binnen de callback function checkt of er al een inlogbericht is ingesteld, meestal door een andere plugin of thema. In die gevallen stuurt de callback function de originele value terug zonder veranderingen. Op die manier ontstaan er geen conflicten met andere plugins of thema&#8217;s.<\/p>\n<p>Je kunt het bericht boven het inlogformulier zien binnen de <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-login-url\/\">WordPress inlogpagina<\/a>.<\/p>\n<figure id=\"attachment_72252\" aria-describedby=\"caption-attachment-72252\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72252 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/tonen-eigen-inlogbericht-boven-inlogformulier.png\" alt=\"Tonen van een eigen inlogbericht boven het inlogformulier\" width=\"1100\" height=\"514\"><figcaption id=\"caption-attachment-72252\" class=\"wp-caption-text\">Tonen van een eigen inlogbericht boven het inlogformulier<\/figcaption><\/figure>\n<p>Je kunt alle elementen van de inlogpagina stylen door custom stylesheets in de rij voor het laden te plaatsen. Door dat te doen kun je helemaal je standaard WordPress inlogpagina naar eigen smaak inrichten.<\/p>\n<p>Je leert hoe je custom stylesheets kunt laden via actions, in het gedeelte &#8220;Customize de WordPress inlogpagina met hooks&#8221;.<\/p>\n<h4>Filters vinden die ondersteund worden door WordPress<\/h4>\n<p>Haast overal waar WordPress data verwerkt of bewerkt, kun je een filter vinden waar je een hook op kunt plaatsen en de data kunt bewerken. Zie filters als een interface tussen de <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-database-problemen-oplossen\/\">WordPress database<\/a> en de browser.<\/p>\n<p>Je kunt een volledige lijst met ondersteunde filters vinden op de <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\">Plugin API\/Filter Reference<\/a> pagina.<\/p>\n<figure id=\"attachment_72258\" aria-describedby=\"caption-attachment-72258\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72258 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/wordpress-biedt-allerlei-filters-hook.png\" alt=\"WordPress biedt allerlei filters voor je hook\" width=\"1100\" height=\"514\"><figcaption id=\"caption-attachment-72258\" class=\"wp-caption-text\">WordPress biedt allerlei filters voor je hook<\/figcaption><\/figure>\n<p>Alle filters die je daar vindt zijn opgesplitst in verschillende categorie\u00ebn en gerangschikt op volgorde van uitvoering door WordPress.<\/p>\n<p>Als je filters zoekt om in de WordPress broncode te hooken, zoek op de term &#8220;<strong>apply_filters<\/strong>&#8220;, en dan krijg je direct een hele lading resultaten. De <a href=\"https:\/\/developer.wordpress.org\/reference\/\">WordPress Code Reference<\/a> is ook een goede plek om te zoeken naar alles wat er in WordPress te vinden is, waaronder dus ook actions en filters.<\/p>\n<h4>Zo gebruikt de WordPress kern filters<\/h4>\n<p>WordPress Core gebruikt zelf ook allerlei ingebouwde filters om de data die de verschillende functions gebruiken te veranderen.<\/p>\n<p>Neem het <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/the_content\/\">the_content<\/a> filter als voorbeeld. Het filtert de content van een artikel nadat deze is geladen uit de database en v\u00f3\u00f3rdat deze weergegeven wordt in de browser.<\/p>\n<p>Net als met actions, kun je de meeste filter functions van de WordPress kern die met de <code><strong>the_content <\/strong><\/code>hook te maken hebben vinden in het bestand <code><strong>wp-includes\/default-filters.php<\/strong><\/code>.<\/p>\n<p>Hier is een lijst met alle kern <code><strong>add_filter()<\/strong><\/code> functions die hooken aan het <code><strong>the_content<\/strong><\/code> filter:<\/p>\n<pre><code class=\"language-php\">add_filter( 'the_content', 'do_blocks', 9 );\nadd_filter( 'the_content', 'wptexturize' );\nadd_filter( 'the_content', 'convert_smilies', 20 );\nadd_filter( 'the_content', 'wpautop' );\nadd_filter( 'the_content', 'shortcode_unautop' );\nadd_filter( 'the_content', 'prepend_attachment' );\nadd_filter( 'the_content', 'wp_make_content_images_responsive' );\nadd_filter( 'the_content', 'do_shortcode', 11 ); \/\/ AFTER wpautop().\u00a0<\/code><\/pre>\n<p>Let op de verschillen priorityen die voor sommige callback functions gedefinieerd zijn.<\/p>\n<p>De <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/do_blocks\/\">do_blocks()<\/a> function verwerkt bijvoorbeeld alle dynamische blocks in de content van een artikel en rendert ze weer zodat ze compatibel zijn met de <a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-wordpress-editor\/\">nieuwe blockeditor van WordPress<\/a>. Deze krijgt een hogere prioriteit mee dan de standaard (10) om er zeker van te zijn dat de content klaar is voor de blockeditor, voordat andere functions gaan draaien.<\/p>\n<p>De <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/convert_smilies\/\">convert_smilies()<\/a> function daarentegen krijgt een veel lagere prioriteit aangezien het alleen tekst smilies omzet naar afbeeldingen. Het is dus logisch deze function pas op het einde te draaien nadat alle andere benodigde functions door de inhoud zijn gegaan.<\/p>\n<p>Leuk weetje: shortcodes zijn een subset van filters. Ze gebruiken de input van een shortcode, verwerken deze, en retourneren dan de output naar dezelfde plek. Leer meer over shortcodes in deze <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-shortcodes\/\">ultieme WordPress shortcodes uitleg<\/a>.<\/p>\n<h4>Andere filter functions<\/h4>\n<p>Alhoewel <code><strong>add_filter()<\/strong><\/code> de meest gebruikte filter function is, zijn er nog andere die ook handig zijn. Laten we deze kort bij langs gaan.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/has_filter\">has_filter()<\/a><\/li>\n<\/ul>\n<p>Deze function controleert of een bepaald filter aan een function is gehookt. Het accepteert twee parameters. De eerste parameter is voor de naam van het filter. De tweede parameter is optioneel en is voor de naam van de callback function.<\/p>\n<pre><code class=\"language-php\">has_filter( 'filter_name', 'function_to_check' );<\/code><\/pre>\n<p>Als je alleen de eerste parameter specificeert, zal het <code><strong>true<\/strong><\/code> teruggeven als de <code><strong>filter_name<\/strong><\/code> inderdaad gehookt is aan <em>enige<\/em> andere function (welke dan ook).<\/p>\n<p>Maar als je beide parameters specificeert, zal het <code><strong>false<\/strong><\/code> terugsturen als de specifieke callback function niet geregistreerd is bij het gegeven filter. Als het de gespecificeerde callback function vindt die geregistreerd is met het filter, zal het de <code><strong>priority <\/strong><\/code>(integer) terugsturen die voor deze function aan dit filter is ingesteld.<\/p>\n<p>Een mogelijke toepassing van de <code><strong>has_filter()<\/strong><\/code> function is om te kijken of een filter al gehookt is en op basis daarvan verder te gaan met de uitvoering van de code.<\/p>\n<pre><code class=\"language-php\">\/\/ check om te zien of 'the_content' filter is gehookt\nif ( ! has_filter( 'the_content' ) {\n\u00a0 \u00a0 \/\/ hook het filter alleen als deze nog niet eerder is gehookt\n\u00a0 \u00a0 add_filter( 'the_content', 'modify_the_content' );\n}<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/apply_filters\/\">apply_filters()<\/a><\/li>\n<\/ul>\n<p>Deze filter function lijkt op de <code><strong>do_action()<\/strong><\/code> action function. Callback functions die gehookt worden aan dit filter zullen uitgevoerd worden &#8211; waar deze function zich ook maar bevindt binnen de WordPress code.<\/p>\n<p>Je kunt deze function ook gebruiken om een nieuw custom filter te maken door de filter naam en value te specificeren als parameters.<\/p>\n<pre><code class=\"language-php\">apply_filters( 'filter_name', 'value_to_filter', [argument1], [argument2] );<\/code><\/pre>\n<p>Vergeet niet om extra parameters te specificeren als je wilt dat ze doorgegeven worden aan je callback functions. De meeste filters gebruiken slechts \u00e9\u00e9n argument, dus het defini\u00ebren van extra arguments is snel vergeten.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/apply_filters_ref_array\">apply_filters_ref_array()<\/a><\/li>\n<\/ul>\n<p>Deze function lijkt sterk op de <code><strong>apply_filters()<\/strong><\/code> function, behalve dat alle arguments die het accepteert in een array verzameld moeten zijn.<\/p>\n<pre><code class=\"language-php\">\/\/ een voorbeeld-array\n$arguments_array = array( 'some_value', 'foo', false, 'another_value' );\n\napply_filters_ref_array( 'example_filter', $arguments_array );<\/code><\/pre>\n<p>Deze filter function kan vooral erg handig zijn als je veel arguments wilt doorgeven, of als deze al in een array zitten. Let erop dat de arguments in de array in de goede volgorde zitten.<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/current_filter\">current_filter()<\/a><\/li>\n<\/ul>\n<p>Deze filter function haalt de naam op van de filter of action die op dit moment uitgevoerd wordt. Je hoeft hierbij geen parameters te specificeren aangezien het uitgevoerd wordt binnen de callback function.<\/p>\n<p>Een praktijkvoorbeeld:<\/p>\n<pre><code class=\"language-php\">function example_callback() {\n\u00a0 \u00a0 echo current_filter(); \/\/ 'the_title' will be echoed\n\u00a0 \u00a0 return\n}\nadd_filter( 'the_title', 'example_callback' );<\/code><\/pre>\n<p>Ondanks de wat misleidende naam kan deze function de naam van zowel actions als filters ophalen.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/remove_filter\/\">remove_filter()<\/a><\/li>\n<\/ul>\n<p>Deze filter function verwijdert de callback function die bij het gespecificeerde filter hoort. Het werkt op precies dezelfde manier als de <code><strong>remove_action()<\/strong><\/code> function, maar dan voor filters. Je kunt dit gebruiken om de standaard WordPress-functions die geregistreerd zijn met een bepaald filter te verwijderen, en vervolgens indien nodig te vervangen met je eigen functions.<\/p>\n<pre><code class=\"language-php\">remove_filter( 'filter_name', 'function_to_be_removed', [priority] );<\/code><\/pre>\n<p>Om een callback function die gehookt is aan een filter los te maken, moeten de parameters <code><strong>function_to_be_removed<\/strong><\/code> en <code><strong>priority<\/strong><\/code> precies gelijk zijn aan de arguments die gebruikt zijn bij het hooken van de callback function.<\/p>\n<p>Als het filter toegevoegd is vanuit een class, wat meestal het geval is als plugins dit hebben gedaan, dan zul je <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/remove_filter\/#comment-613\">de class variable in moeten om het filter te kunnen verwijderen<\/a>.<\/p>\n<pre><code class=\"language-php\">\/\/ eerst access krijgen tot de class variable, en vervolgens vanuit hier het filter verwijderen\nglobal $some_class;\n\nremove_filter( 'the_content', array($some_class, 'class_filter_callback') );<\/code><\/pre>\n<p>Laten we een goed voorbeeld van\u00a0<code><strong>remove_filter()<\/strong><\/code>\u00a0in de praktijk bekijken.<\/p>\n<p>De <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-ecommerce-plugins\/#woocommerce\">WooCommerce plugin<\/a> gebruikt de <a href=\"https:\/\/docs.woocommerce.com\/wc-apidocs\/source-function-wc_lostpassword_url.html#13-39\">wc_lostpassword_url()<\/a> call function die gehookt is aan hun <a href=\"https:\/\/docs.woocommerce.com\/wc-apidocs\/source-function-wc_lostpassword_url.html#41\">lostpassword_url<\/a> filter om <em>&#8220;Lost your Password?&#8221;<\/em> verzoeken van gebruikers te redirecten.<\/p>\n<p>Het brengt een gebruiker die op die link klikt naar een custom front-end pagina met de URL <code><strong>\/my-account\/lost-password<\/strong><\/code>. Zonder dit filter zouden gebruikers naar de standaard WordPress login pagina gestuurd worden op <code><strong>\/wp-login.php<\/strong><\/code>.<\/p>\n<p>Stel dat je deze functionaliteit wilt resetten en je gebruikers juist wel naar <a href=\"https:\/\/kinsta.com\/nl\/blog\/verander-wordpress-wachtwoord\/\">de standaardpagina voor wachtwoordherstel<\/a> wilt sturen, of naar een compleet andere pagina. Dan kun je deze callback function zo verwijderen:<\/p>\n<pre><code class=\"language-php\">remove_filter( 'lostpassword_url', 'wc_lostpassword_url', 10 );\u00a0<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/remove_all_filters\">remove_all_filters()<\/a><\/li>\n<\/ul>\n<p>Deze filter function verwijdert alle callback functions die bij een filter geregistreerd zijn.<\/p>\n<pre><code class=\"language-php\">remove_all_filters( 'filter_name', [priority] );<\/code><\/pre>\n<p>Het lijkt sterk op de <code><strong>remove_all_actions()<\/strong><\/code> function, maar dan weer voor filters.<\/p>\n<p>De populaire <a href=\"https:\/\/github.com\/KimcoBlogSC\/Blog\/blob\/master\/wp-content\/plugins\/advanced-excerpt\/functions\/functions.php\">Advanced Excerpts plugin<\/a> gebruikt deze function om alle standaard functions die gehookt zijn aan de <code><strong>the_excerpt<\/strong><\/code> en <code><strong>get_the_excerpt<\/strong><\/code> filters te verwijderen. Nadat dit gelukt is, hookt het de eigen callback function aan het filter.<\/p>\n<pre><code class=\"language-php\">\/\/ Zorg dat het filter is gehookt, ongeacht het page type\nif ( ! has_filter( 'get_the_excerpt', array( $advanced_excerpt, 'filter_excerpt' ) ) ) {\n    remove_all_filters( 'get_the_excerpt' ); \n    remove_all_filters( 'the_excerpt' ); \n    add_filter( 'get_the_excerpt', array( $advanced_excerpt, 'filter_excerpt' ) );\n}<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/doing_filter\/\">doing_filter()<\/a><\/li>\n<\/ul>\n<p>Deze filter function checkt of het gespecificeerde filter op dit moment wordt uitgevoerd.<\/p>\n<pre><code class=\"language-php\">if ( doing_filter( 'save_post' ) ) {\n  \u00a0 \/\/ run hier je code\n}<\/code><\/pre>\n<p>Het retourneert vervolgens een boolean value (<code><strong>true<\/strong><\/code> of <code><strong>false<\/strong><\/code>).<\/p>\n<p>Let op het verschil tussen deze function en de <code><strong>current_filter()<\/strong><\/code> function, die alleen de naam van een filter of action die momenteel uitgevoerd wordt retourneert, in de vorm van een string tekens.<\/p>\n<h4>Filters voorbeeld 1: Toevoegen van een filter voor grove taal in de reactions<\/h4>\n<p>Het kan een forse klus zijn om <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-reactie-plugins\/\">de reacties op je WordPress website<\/a> te beheren. Het <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/comment_text\/\">comment_text<\/a> filter maakt het mogelijk om regels op te stellen om reacties aan te passen voordat ze weergegeven worden.<\/p>\n<figure id=\"attachment_72268\" aria-describedby=\"caption-attachment-72268\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72268 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/ongefilterde-reacties-gemarkeerde-scheldwoorden.png\" alt=\"Ongefilterde reacties met gemarkeerde scheldwoorden\" width=\"1100\" height=\"563\"><figcaption id=\"caption-attachment-72268\" class=\"wp-caption-text\">Ongefilterde reacties met gemarkeerde scheldwoorden<\/figcaption><\/figure>\n<p>Je kunt WordPress zo de opdracht geven om automatisch scheldwoorden te verwijderen voordat ze weergegeven worden aan je bezoekers. Laten we dat eens doen.<\/p>\n<pre><code class=\"language-php\">\/\/ haak aan bij 'comment_text' filter met de callback function\nadd_filter( 'comment_text', 'the_profanity_filter' );\n\n\/\/ definieer een callback function om scheldwoorden te filteren uit de reacties\nfunction the_profanity_filter( $comment_text ) {\n    \/\/ definieert een array met scheldwoorden telt hoeveel er zijn\n    $profaneWords = array('fudge', 'darn', 'pickles', 'blows', 'dangit');\n    $profaneWordsCount = sizeof($profaneWords);\n    \n    \/\/ loop door de scheldwoorden in $comment_text en vervang ze met '*'\n    for($i=0; $i &lt; $profaneWordsCount; $i++) {\n        $comment_text = str_ireplace( $profaneWords[$i], str_repeat('*', strlen( $profaneWords[$i]) ), $comment_text );\n    } \n    \n    return $comment_text;\n}<\/code><\/pre>\n<p>Laten we ook deze code regel-voor-regel doornemen:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/comment_text\/\">comment_text<\/a> is een filter hook die je de mogelijkheid geeft de tekst van een reactie aan te passen voordat de browser het weergeeft. Je kunt je callback function daarmee registreren om de output te gaan filteren.<\/li>\n<li>De <code><strong>add_filter()<\/strong><\/code> function zorgt voor de daadwerkelijke hook aan de <code><strong>comment_text<\/strong><\/code> filter zodat je er een callback function aan kunt hangen.<\/li>\n<li><code><strong>the_profanity_filter()<\/strong><\/code> is de naam van de gekozen callback function. Deze accepteert slechts \u00e9\u00e9n parameter, namelijk de string met daarin de tekst van de reactie. Definieer deze custom function volgens de gewenste logica.<\/li>\n<li>Sla alle scheldwoorden of ongewenste taal op in een PHP array met de naam <code><strong>profaneWords<\/strong><\/code>. Je kunt zoveel woorden als je wilt toevoegen aan deze array. Ik sla ook de grootte van deze array op in de <code><strong>profaneWordsCount<\/strong><\/code> variabele door middel van de <a href=\"https:\/\/www.php.net\/manual\/en\/function.sizeof.php\">sizeof() PHP function<\/a>.<\/li>\n<li>Loop door alle scheldwoorden en gebruik de standaard <a href=\"https:\/\/www.php.net\/manual\/en\/function.str-ireplace.php\">str_ireplace function<\/a> van PHP om gematchte scheldwoorden te vervangen door <code><strong>*<\/strong><\/code> symbolen. Aangezien deze string replacement function case-insensitive is, hoef je dus niet op hoofdletters te letten. Bekijk verschillende manieren om <a href=\"https:\/\/kinsta.com\/nl\/blog\/zoeken-en-vervangen-in-wordpress\/\">zoeken-en-vervangen<\/a> uit te voeren.<\/li>\n<li>Gebruik uiteindelijk <code><strong>return<\/strong><\/code> om de nu gefilterde tekst terug te sturen.<\/li>\n<\/ul>\n<p>Sla de veranderingen op in je custom pluginbestand en laad een artikel met reacties opnieuw. Alle woorden die je in de <code><strong>profaneWords<\/strong><\/code> array had opgenomen zouden nu vervangen moeten zijn door <strong>*<\/strong> symbolen.<\/p>\n<figure id=\"attachment_72256\" aria-describedby=\"caption-attachment-72256\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72256 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/grove-taal-wegfilteren-reacties.png\" alt=\"Grove taal wegfilteren in reacties met '*' symbolen\" width=\"1100\" height=\"563\"><figcaption id=\"caption-attachment-72256\" class=\"wp-caption-text\">Grove taal wegfilteren in reacties met &#8216;*&#8217; symbolen<\/figcaption><\/figure>\n<p>De originele reacties blijven gewoon beschikbaar in de database. Dit filter verandert namelijk alleen de inhoud van de reactie voordat deze wordt weergegeven op de front-end.<\/p>\n<figure id=\"attachment_72263\" aria-describedby=\"caption-attachment-72263\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72263 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/originele-reactie-site-back-end.png\" alt=\"De originele reactie in de site back-end\" width=\"1100\" height=\"498\"><figcaption id=\"caption-attachment-72263\" class=\"wp-caption-text\">De originele reactie in de site back-end<\/figcaption><\/figure>\n<p>Als je eenmaal gehookt bent aan het juiste filter, kun je er allerlei handige dingen mee doen.<\/p>\n<p>Zo kun je bijvoorbeeld ook de <code><strong>comment_text<\/strong><\/code> filter gebruiken om alle URL\u2019s uit de reacties te halen (lees ook deze gedetailleerde uitleg over het <a href=\"https:\/\/kinsta.com\/nl\/blog\/spamreacties-wordpress\/\">stoppen van spamreacties in WordPress<\/a>).<\/p>\n<p>Je kunt ook hooken aan de <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/pre_comment_approved\/\">pre_comment_approved<\/a> filter en reacties als goedgekeurd, spam of troep markeren, gebaseerd op vooraf gedefinieerde criteria.<\/p>\n<h4>Filters voorbeeld 2: content toevoegen na een artikel<\/h4>\n<p>Zoals je al gezien hebt, gebruikt WordPress het <code><strong>the_content<\/strong><\/code> filter om de content van een artikel of pagina aan te passen. Laten we datzelfde filter gebruiken om wat toe te voegen aan het einde van elk artikel.<\/p>\n<pre><code class=\"language-php\">\/\/ haak aan bij 'the_content' filter met een callback function\nadd_filter( 'the_content', 'insert_content_below' );\n\n\/\/ definieer de callback function om iets onder het bericht toe te voegen\nfunction insert_content_below( $content ) {\n    \/\/ check om te zien of we binnen de main loop zijn binnen een single post\n    if ( is_single() && in_the_loop() && is_main_query() ) {\n  \u00a0     return $content . \"&lt;h3 style=\\\"text-align: center;\\\"&gt;Let me insert myself here&lt;\/h3&gt;&lt;p style=\\\"text-align: center;border: 3px solid #5333ed;\\\"&gt;I'll appear after the post. You can insert anything here. Even HTML. Headers, links, images, scripts, I'll take them all and append it to the end of the post content. You can also give me a class, so you can style me easily with CSS style sheets.&lt;\/p&gt;\" ;\n    } \n    \n    return $content;\n}<\/code><\/pre>\n<p>Laten we zorgen dat we de logica van de code hierboven begrijpen:<\/p>\n<ul>\n<li><code><strong>the_content<\/strong><\/code> filter hook helpt je om de content van het huidige artikel te pakken zodat je deze kunt gaan aanpassen.<\/li>\n<li>Gebruik daarna de <code><strong>add_filter()<\/strong><\/code> function om te hooken aan de <code><strong>the_content<\/strong><\/code> filter met de <code><strong>insert_content_below()<\/strong><\/code> callback function.<\/li>\n<li>Definieer de callback function waarbij je de content van het huidige artikel doorgeeft als parameter (<code><strong>$content<\/strong><\/code>).<\/li>\n<li>Binnen de callback function controleer je dat je alleen de content in de belangrijkste query filtert, wat dus in dit geval de content van het artikel is. Als je dit niet eerst verifieert, kan de code soms onbedoeld content filteren vanuit andere plekken, bijvoorbeeld een zijbalk of footer.<\/li>\n<li>De voorwaardelijke statements <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/is_main_query\/\">is_main_query()<\/a>\u00a0en\u00a0<a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/in_the_loop\/#comment-1364\">in_the_loop()<\/a> bepalen of de query inderdaad de hoofd-query is en voortkomen uit de belangrijkste WordPress loop.<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/is_single\/\">is_single()<\/a> is een voorwaardelijk statement dat controleert dat de query een enkel artikel is.<\/li>\n<li>Gebruik de <a href=\"https:\/\/www.php.net\/manual\/en\/language.operators.string.php\">string concatenation operator<\/a> van PHP (<code><strong>$content . \u201cyour additions\u201d<\/strong><\/code>), waarmee je strings kunt samenvoegen, om extra tekst aan de content toe te voegen.<\/li>\n<li><code><strong>return<\/strong><\/code> de gefilterde reaction als alle bovenstaande voorwaardelijke statements waar zijn. Als dat niet zo is, stuur de content dan terug zonder veranderingen.<\/li>\n<\/ul>\n<p>Sla je pluginbestand op, laad een artikel op je website, en scrol naar het einde.<\/p>\n<figure id=\"attachment_72261\" aria-describedby=\"caption-attachment-72261\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72261 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/iets-toevoegen-einde-content-artikel.png\" alt=\"Iets toevoegen aan het einde van de content van een artikel\" width=\"1100\" height=\"491\"><figcaption id=\"caption-attachment-72261\" class=\"wp-caption-text\">Iets toevoegen aan het einde van de content van een artikel<\/figcaption><\/figure>\n<p>Je kunt dezelfde logica toepassen om iets toe te voegen aan het begin van al je artikelen door de positie van de string concatenation parameters om te draaien (<code><strong>\u201cyour additions\u201d . $content<\/strong><\/code>).<\/p>\n<h3>Aanpassen van de WordPress inlogpagina met hooks<\/h3>\n<p>Laten we zowel actions als filters gebruiken om de <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-login-url\/\">standaard inlogpagina van WordPress<\/a> aan te passen. Ik maak een nieuwe plugin met de naam <strong>Sal Custom Login Page<\/strong> om dit te doen. Je kunt de volledige broncode van deze plugin vinden aan het einde van dit stuk.<\/p>\n<figure id=\"attachment_72243\" aria-describedby=\"caption-attachment-72243\" style=\"width: 1110px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72243 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/uiteindelijke-resultaat-aangepast-inlogvenster.jpg\" alt=\"Het uiteindelijke resultaat: een aangepast WordPress inlogvenster\" width=\"1110\" height=\"700\"><figcaption id=\"caption-attachment-72243\" class=\"wp-caption-text\">Het uiteindelijke resultaat: een aangepast WordPress inlogvenster<\/figcaption><\/figure>\n<p>Laten we beginnen door de standaard plugin headervelden toe te voegen en te registreren bij WordPress.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n\/*\nPlugin Name:  Sal Custom Login Page\nVersion:  1.0\nDescription:  Demonstrating WordPress Hooks (Actions and Filters) by customizing the WordPress login page.\nAuthor:  Salman Ravoof\nAuthor URI:  https:\/\/www.salmanravoof.com\/License: GPLv2 or later\nLicense URI: https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\nText Domain:  sal-custom-login-page\n*\/\n\n\/\/ de custom stylesheet van de WordPress login page klaarzetten\nadd_action( 'login_enqueue_scripts', 'salhooks_login_stylesheet');\nfunction salhooks_login_stylesheet() {\n    \/\/ Laad de stylesheet van de pluginmap\n    wp_enqueue_style( 'sal-custom-login-page', plugin_dir_url( __FILE__ ).'sal-custom-login-page-styles.css' );\n}<\/code><\/pre>\n<p>Eerst hooken we aan de <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/login_enqueue_scripts\/\">login_enqueue_scripts<\/a> action om de custom stylesheet in de rij voor het laden te plaatsen. Elke script of style die je hier in de rij plaatst worden opgenomen in de header van je inlogpagina.<\/p>\n<p>Als je ook custom scripts en stylesheets wilt laden aan de frond-end van je site (dus niet alleen aan de admin back-end of de inlogpagina) moet je hooken aan de <code><strong>wp_enqueue_scripts<\/strong><\/code> action in plaats van de login. Je kunt hier meer over lezen in de <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/wp_enqueue_scripts\/\">WordPress Codex<\/a> en<a href=\"https:\/\/kinsta.com\/nl\/blog\/wp-enqueue-scripts\/\"> het artikel van Kinsta hoe je wp_enqueue_scripts kunt gebruiken<\/a>.<\/p>\n<p>Binnen de <code><strong>salhooks_login_stylesheet()<\/strong><\/code> callback function gebruiken we de <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_enqueue_style\/\">wp_enqueue_style()<\/a> function om het custom stylesheet te laden (<code><strong>sal-custom-login-page-styles.css<\/strong><\/code>) die we in dezelfde map als de plugin geplaatst hebben. De ingebouwde WordPress function <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/plugin_dir_url\/\">plugin_dir_url(__FILE__ )<\/a> maakt het makkelijk om het URL pad te krijgen (inclusief de afsluitende slash) van de map van de huidige plugin.<\/p>\n<p>Ik zal de <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-css\/#wordpress-and-css\">CSS styling<\/a> hier niet uitleggen, maar je kunt ze vinden in de broncode aan het eind.<\/p>\n<pre><code class=\"language-php\">\/\/ Custom login ERROR bericht om je site beter te beveiligen\nadd_filter( 'login_errors', 'salhooks_remove_login_errors', 10 );\nfunction salhooks_remove_login_errors() {\n    return 'Incorrect credentials. Please try again!';\n}<\/code><\/pre>\n<p>Vervolgens hooken we aan het <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/login_errors\/\">login_errors<\/a> filter om de foutmelding te veranderen die een bezoeker ziet als er verkeerde gegevens ingevoerd worden. Door de foutmelding te filteren voorkom je dat aanvallers je gebruikersnaam kunnen achterhalen.<\/p>\n<pre><code class=\"language-php\">\/\/ Verwijder de box shake-animatie van de loginbox bij onjuiste logingegevens\nadd_action( 'login_head', 'remove_login_error_shake' );\nfunction remove_login_error_shake() {\n    remove_action( 'login_head', 'wp_shake_js', 12 );\n}<\/code><\/pre>\n<p>Elk keer dat iemand nu de verkeerde gegevens invoert, schudt de inlogbox flink heen en weer. Dit is een optionele stap die ik vooral heb toegevoegd zodat je ook bepaalde features van de inlogpagina kunt verwijderen.<\/p>\n<p>Je leert meer over de <code><strong>remove_action()<\/strong><\/code> en <code><strong>remove_filter()<\/strong><\/code> functions in het laatste deel van dit artikel.<\/p>\n<pre><code class=\"language-php\">\/\/ Verander het logo en headerlink boven het loginformulier\nadd_filter( 'login_headerurl', 'salhooks_login_headerurl');\nfunction salhooks_login_headerurl( $url ) {\n    $url = 'https:\/\/salmanravoof.com';\n    return $url;\n}\n\nadd_filter( 'login_headertext', 'salhooks_login_headertext');\nfunction salhooks_login_headertext( $text ) {\n    $text = 'Salman Ravoof';\n    return $text;\n}<\/code><\/pre>\n<p>De laatste stap is het aanpassen van de URL en tekst van de loginheader. Je kunt aan de <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/login_headerurl\/\">login_headerurl<\/a> en <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/login_headertext\/\">login_headertext<\/a> hooken om ze aan te passen.<\/p>\n<p>Als je verder wilt bouwen met deze plugin en meer wilt experimenteren, kun je de <a href=\"https:\/\/github.com\/SalmanRavoof\/sal-custom-login-page\">broncode van de plugin downloaden<\/a> en meteen bezig gaan.<\/p>\n<h2>Lijsten en resources voor WordPress hooks<\/h2>\n<p>Het is erg lastig om alle hooks die WordPress biedt uit je hoofd te leren. Er zijn letterlijk duizenden ingebouwde actions en filters waaraan je kunt hooken. Dus het zoeken naar precies de juiste hook voor jouw toepassing kan soms als een enorme zoektocht voelen.<\/p>\n<p>Gelukkig zijn er verschillende resources die je kunnen helpen om de goede hook te vinden.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/plugins\/hooks\/\">WordPress Plugin Handbook \u2014 Hooks<\/a><\/li>\n<\/ul>\n<p>De eerste plek waar je meer over hooks kunt lezen is de WordPress Codex, en dan vooral het gedeelte Hooks binnen het Plugin Handbook. Hier kun je essenti\u00eble informatie vinden over hooks, en links naar de complete documentatie van alle actions en filters.<\/p>\n<figure id=\"attachment_72272\" aria-describedby=\"caption-attachment-72272\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72272 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/begin-informatie-hooks-plugin-handbook.png\" alt=\"Begin met de informatie over Hooks in het WordPress Plugin Handbook\" width=\"1100\" height=\"539\"><figcaption id=\"caption-attachment-72272\" class=\"wp-caption-text\">Begin met de informatie over Hooks in het WordPress Plugin Handbook<\/figcaption><\/figure>\n<p>Sla deze handige links van het Plugin Handbook op als favoriet om het zoeken sneller te maken:<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API#Function_Reference\">Plugin API \u2014 Hooks Function Reference<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\">Plugin API \u2014 Action Reference<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\">Plugin API \u2014 Filter Reference<\/a><\/li>\n<\/ul>\n<p>Deze referentiepagina&#8217;s voor actions en filters geven je een lijst met alle hooks die meestal draaien bij bepaalde WordPress-verzoeken.<\/p>\n<p>Zo kun je bijvoorbeeld alle hooks vinden die geactiveerd worden wanneer je naar een admin-pagina gaat, wanneer je bijlagen bij een artikel gebruikt, of bij <a href=\"https:\/\/kinsta.com\/blog\/what-is-taxonomy\/\">categorie\u00ebn<\/a>.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/\">WordPress Code Reference<\/a><\/li>\n<\/ul>\n<p>De WordPress Codex bevat ook een handige zoektool om alle function hooks, methods en classes te vinden. Deze pagina biedt ook een lijst met nieuwe en bijgewerkte componenten in de meest recente WordPress versie. Kijk hier dus als je wilt weten wat er precies onder de motorkap van WordPress gebeurt.<\/p>\n<figure id=\"attachment_72271\" aria-describedby=\"caption-attachment-72271\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72271 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/zoek-hier-alles-binnen-wordpress.png\" alt=\"Zoek hier op alles binnen WordPress \" width=\"1100\" height=\"381\"><figcaption id=\"caption-attachment-72271\" class=\"wp-caption-text\">Zoek hier op alles binnen WordPress<\/figcaption><\/figure>\n<ul>\n<li><a href=\"https:\/\/adambrown.info\/p\/wp_hooks\/hook\">Adam R Brown\u2019s WordPress Hooks Index<\/a><\/li>\n<\/ul>\n<p>Deze index van WordPress hooks sorteert alle hooks per type, WordPress-versie waar ze eerst in kwamen, en of ze nog actionf zijn.<\/p>\n<figure id=\"attachment_72248\" aria-describedby=\"caption-attachment-72248\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72248 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/adam-r-brown-wordpress-hooks-index.png\" alt=\"Adam R Brown\u2019s WordPress Hooks Index\" width=\"1100\" height=\"363\"><figcaption id=\"caption-attachment-72248\" class=\"wp-caption-text\">Adam R Brown\u2019s WordPress Hooks Index<\/figcaption><\/figure>\n<p>Als je de hooks sorteert op basis van hoe vaak ze voorkomen dan zul je zien dat de oudste WordPress hooks ook nog altijd het meest gebruikt worden. Als je <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-tutorials\/\">net begint met WordPress development<\/a> is de snelste manier om alles in te halen het leren omgaan met deze populaire actions en filters.<\/p>\n<p>Alhoewel deze index helaas niet bijgewerkt is sinds WordPress 5.1, kan het nog steeds erg handig zijn om alle grotere hooks door te nemen.<\/p>\n<p>Nog altijd moeite de juiste hook te vinden? Het is altijd een goed idee om te beginnen met online te zoeken op de juiste keywords. En als zelfs dat niet lukt, kun je ook gewoon zelf in de WordPress code gaan graven.<\/p>\n<h2>Geregistreerde hooks op een WordPress pagina vinden<\/h2>\n<p>Zoals we eerder zagen heeft WordPress ladingen hooks beschikbaar, maar niet elke hook wordt op elke pagina geactiveerd. Als je erachter kunt komen welke actions en filters je op een bepaalde pagina kunt hooken, ben je al halverwege.<\/p>\n<p>Alhoewel je geavanceerde PHP debugging tools zoals <a href=\"https:\/\/xdebug.org\/\">xdebug<\/a> en <a href=\"https:\/\/github.com\/squizlabs\/PHP_CodeSniffer\">PHPCS<\/a> hiervoor kunt zijn gebruiken, zijn er ook eenvoudigere tools zoals Debug Bar en Query Monitor die je binnen WordPress kunt gebruiken.<\/p>\n<h3>Debug Bar met Actions en Filters Add-On<\/h3>\n<p><a href=\"https:\/\/wordpress.org\/plugins\/debug-bar\/\">Debug Bar<\/a> is een offici\u00eble WordPress plugin die een <strong>Debug<\/strong> menu toevoegt aan je adminbalk. Het toont PHP waarschuwingen en meldingen, cache requests, <a href=\"https:\/\/kinsta.com\/nl\/blog\/wat-is-mysql\/\">MySQL query\u2019s<\/a> en andere <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-debugging\/\">handige debug informatie<\/a>.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Deze plugin is niet recent bijgewerkt, en ook niet getest met de laatste grote releases van WordPress. We noemen de plugin toch omdat het een handige manier is om meer van WordPress hooks te leren. Gebruik het dus altijd binnen een <a href=\"https:\/\/kinsta.com\/nl\/docs\/wordpress-hosting\/testomgeving\/\">testomgeving<\/a>.<\/p>\n<\/aside>\n\n<figure id=\"attachment_72542\" aria-describedby=\"caption-attachment-72542\" style=\"width: 1500px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/wordPress-Ddebug-bar-plugin.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72542 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/wordPress-Ddebug-bar-plugin.jpg\" alt=\"De WordPress Debug Bar WordPress plugin\" width=\"1500\" height=\"500\"><\/a><figcaption id=\"caption-attachment-72542\" class=\"wp-caption-text\">De WordPress Debug Bar WordPress plugin<\/figcaption><\/figure>\n<p>Nadat je de plugin ge\u00efnstalleerd hebt, moet je het stukje code hieronder toevoegen aan het <code><strong>wp-config.php<\/strong><\/code> bestand van je website om de debug features in te schakelen.<\/p>\n<pre><code class=\"language-php\">define( 'WP_DEBUG', true ); \/\/ trackt PHP fouten en mededelingen\ndefine( 'SAVEQUERIES', true ); \/\/ trackt and toont MySQL query's<\/code><\/pre>\n<p>Nu zou je de <strong>Debug<\/strong> menu optie moeten zien in je adminbalk. Als je erop klikt ga je naar het dashboard waar je de verschillende query&#8217;s en caches kunt zien die aan de pagina zitten waarvandaan je kwam.<\/p>\n<figure id=\"attachment_72273\" aria-describedby=\"caption-attachment-72273\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72273 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/debug-menu-wordpress-adminbalk.png\" alt=\"Het \u2018Debug\u2019 menu in de WordPress adminbalk\" width=\"1100\" height=\"363\"><figcaption id=\"caption-attachment-72273\" class=\"wp-caption-text\">Het \u2018Debug\u2019 menu in de WordPress adminbalk<\/figcaption><\/figure>\n<p>Daarna moet je de <a href=\"https:\/\/wordpress.org\/plugins\/debug-bar-actions-and-filters-addon\/\">Debug Bar Actions and Filters Addon<\/a> plugin installeren. Dit is een handige uitbreiding die nog twee extra tabbladen toevoegt aan je Debug Bar dashboard, en die de actions en filters toont die geactiveerd zijn door het huidige verzoek.<\/p>\n<figure id=\"attachment_72253\" aria-describedby=\"caption-attachment-72253\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72253 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/actions-volgorde-laden-huidige-pagina.png\" alt=\"Actions op volgorde van laden voor de huidige pagina\" width=\"1100\" height=\"491\"><figcaption id=\"caption-attachment-72253\" class=\"wp-caption-text\">Actions op volgorde van laden voor de huidige pagina<\/figcaption><\/figure>\n<p>Het geeft ook alle functions weer die eraan gehookt zitten, inclusief prioriteit.<\/p>\n<figure id=\"attachment_72254\" aria-describedby=\"caption-attachment-72254\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72254 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/filters-prioriteit-geregistreerde-callback-functions.png\" alt=\"Filters met prioriteit en geregistreerde callback functions\" width=\"1100\" height=\"509\"><figcaption id=\"caption-attachment-72254\" class=\"wp-caption-text\">Filters met prioriteit en geregistreerde callback functions<\/figcaption><\/figure>\n<p>Je kunt op het <strong>Debug<\/strong> menu klikken binnen elke pagina op je website om erachter te komen welke actions en filters je kunt hooken op die pagina.<\/p>\n<h3>Query Monitor<\/h3>\n<p><a href=\"https:\/\/kinsta.com\/blog\/query-monitor\/\">Query Monitor<\/a> is een krachtig toolpanel voor developers van WordPress. Je kunt het gebruiken om de beschikbare hooks op een pagina te bekijken en de volgorde waarin ze laden.<\/p>\n<figure id=\"attachment_72543\" aria-describedby=\"caption-attachment-72543\" style=\"width: 1500px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/query-monitor-plugin.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72543 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/query-monitor-plugin.jpg\" alt=\"Query Monitor WordPress plugin\" width=\"1500\" height=\"500\"><\/a><figcaption id=\"caption-attachment-72543\" class=\"wp-caption-text\">Query Monitor WordPress plugin<\/figcaption><\/figure>\n<p>Anders dan bij Debug Bar, hoef je verder geen addons te installeren om de actions en filters te zien.<\/p>\n<figure id=\"attachment_72267\" aria-describedby=\"caption-attachment-72267\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72267 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/query-monitor-vinden-vanaf-adminbalk.png\" alt=\"Je kunt Query Monitor vinden vanaf de adminbalk\" width=\"1100\" height=\"438\"><figcaption id=\"caption-attachment-72267\" class=\"wp-caption-text\">Je kunt Query Monitor vinden vanaf de adminbalk<\/figcaption><\/figure>\n<p>Query Monitor geeft je ook meer informatie over waar precies een hook geactiveerd wordt.<\/p>\n<figure id=\"attachment_72266\" aria-describedby=\"caption-attachment-72266\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72266 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/hooks-actions-panel-query-monitor.png\" alt=\"Het Hooks &#038; Actions panel in Query Monitor\" width=\"1100\" height=\"642\"><figcaption id=\"caption-attachment-72266\" class=\"wp-caption-text\">Het Hooks &#038; Actions panel in Query Monitor<\/figcaption><\/figure>\n<p>Binnen de componentenkolom, kun je zien dat de meeste hooks geregistreerd worden vanuit de kern. Maar sommige hooks worden ook geregistreerd vanuit een thema of plugin. Enkele hooks kunnen geregistreerd worden vanuit meerdere componenten.<\/p>\n<p>Je kunt de hook en component <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-dropdown-menu\/\">dropdown-menu&#8217;s<\/a> gebruiken om alleen die hooks te bekijken die interessant zijn voor jou.<\/p>\n<p><strong>Let op:<\/strong> Query Monitor gebruikt &#8220;Hooks&#8221; als algemene term voor actions en filters samen, maar noemt de geregistreerde callback functions &#8220;Actions&#8221;. Dat is technisch gezien dus fout, en kan nogal verwarrend zijn, dus wees gewaarschuwd.<\/p>\n<p>Je kunt binnen Query Monitor nog meer doen dan alleen de query&#8217;s en requests bekijken. Het bevat ook geavanceerde features zoals listing styles, scripts, <a href=\"https:\/\/kinsta.com\/nl\/blog\/ultieme-wordpress-multilingual\/\">talen<\/a>, <a href=\"https:\/\/kinsta.com\/nl\/blog\/admin-ajax\/\">Ajax calls<\/a>, user capability checks en <a href=\"https:\/\/kinsta.com\/nl\/blog\/rest-api-wordpress\/\">REST API calls<\/a>.<\/p>\n<h2>De &#8220;all&#8221; hook<\/h2>\n<p>WordPress heeft een <a href=\"https:\/\/developer.wordpress.org\/plugins\/hooks\/advanced-topics\/#debugging-with-the-all-hook\">speciale hook die &#8220;all&#8221; heet<\/a>, waar je aan kunt hooken om een callback function uit te voeren voor elke hook die je wilt, onafhankelijk of die geregistreerd is met de callback function. Dit is vooral handig om <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-debugging\/\">een gecrashte pagina te debuggen<\/a> of als je wilt weten wanneer een bepaalde gebeurtenis plaatsvindt.<\/p>\n<p>Zo kun je de <code><strong>all<\/strong><\/code> hook bijvoorbeeld gebruiken zoals in het voorbeeld hieronder om alle actions die uitgevoerd worden te <code><strong>echo<\/strong><\/code>&#8216;en.<\/p>\n<pre><code class=\"language-php\">\/\/ echo alle actions die worden uitgevoerd\nfunction debug_helper_function(){\n\u00a0 \u00a0 echo '&lt;p&gt;' . current_action() . '&lt;\/p&gt;';\n}\nadd_action( 'all', 'debug_helper_function' );<\/code><\/pre>\n<p>De <code><strong>debug_helper_function()<\/strong><\/code> die hierboven gedefinieerd is, zal uitgevoerd worden wanneer er een action geactiveerd wordt. Weten wat de laatst uitgevoerde action was kan je helpen bij erachter komen wat er gebeurt binnen je pagina.<\/p>\n<h2>Waar worden WordPress hooks opgeslagen?<\/h2>\n<p>WordPress gebruikt de <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_hook\/\">WP_Hook<\/a> class om hooks te implementeren. Deze core class wordt gebruikt om alle ingebouwde actions en filters van WordPress af te handelen. Je kunt bijna alle code die gerelateerd is aan deze class vinden in het <a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/5.4\/src\/wp-includes\/class-wp-hook.php\">wp-includes\/class-wp-hook.php<\/a> bestand.<\/p>\n<p>Technisch gezien is de <code><strong>WP_Hook<\/strong><\/code> class een array van objecten met attritubes zoals callbacks, iterations, current_priority, nesting_level, en doing_action. Het definieert ook veel andere handige hook functions die gebruikt kunnen worden via de <a href=\"https:\/\/developer.wordpress.org\/reference\/files\/wp-includes\/class-wp-hook.php\/\">WP_Hook methods<\/a>.<\/p>\n<p>De meeste WordPress developers hoeven niet na te denken over waar WordPress hooks precies opslaat, zolang ze zich maar houden aan de Plugin API richtlijnen.<\/p>\n\n<h2>Zo maak je je eigen custom WordPress hooks<\/h2>\n<p>Je hebt nu allerlei hooks gezien die WordPress aanbiedt via de Plugin API. Je hebt ook gezien hoe je de standaard hooks kunt gebruiken om je eigen code in de WordPress runtime te injecteren.<\/p>\n<p>Als je een <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-ontwikkelaar-salaris\/\">plugin of thema developer<\/a> bent, is het good practice om andere developers een soortgelijke manier te geven om met jouw code te werken. Custom hooks doen precies dat. Ze bieden andere developers de mogelijkheid om de functionaliteit van je plugins en thema&#8217;s uit te breiden of aan te passen.<\/p>\n<p>Het maken van je eigen actions en filters is vrij eenvoudig. Je kunt dezelfde functions gebruiken waarmee de WordPress Core hooks maakt. Laten we enkele voorbeeld bekijken<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"disc\" selector=\"h3\" count-number=\"6\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>Zo maak je custom actions in WordPress<\/h3>\n<p>Gebruik de <code><strong>do_action()<\/strong><\/code> function om een custom action hook aan te maken. Dat doe je zo:<\/p>\n<pre><code class=\"language-php\">\/\/ de positie waar je je actie invoert, bepaalt wanneer deze gecalld wordt\ndo_action( ' my_unique_custom_action' );\n\/\/ ga verder met de rest van de code<\/code><\/pre>\n<p>Nu kunnen andere developers in je plugin of thema hooken zonder de broncode te veranderen. Het enige dat ze moeten doen is hun callback functions registreren met de custom action van je plugin via de <code><strong>add_action()<\/strong><\/code> function.<\/p>\n<pre><code class=\"language-php\">add_action( 'my_unique_custom_action', 'some_callback_function' );\n\n\/\/ definieer de callback function die je in de bovenstaande action function noemde\nsome_callback_function() {\n     \/\/ deze code runt op elke plek waar je custom action hook ook is\n}<\/code><\/pre>\n<p>Let erop dat je custom hooks goed <strong>documenteert<\/strong> en in detail uitlegt wat ze precies doen. Uiteindelijk is het belangrijkste doel van het maken van custom hooks het <a href=\"https:\/\/kinsta.com\/nl\/blog\/salaris-van-webdevelopers\/\">helpen van andere developers<\/a> om met jouw code te werken.<\/p>\n<h3>Zo maak je een custom filter in WordPress<\/h3>\n<p>Gebruik de <code><strong>apply_filters()<\/strong><\/code> function om een custom filter hook aan te maken. Dat doe je zo:<\/p>\n<pre><code class=\"language-php\">$value_to_filter = \"I'm a string, but this can be any PHP data type\";\n\n\/\/ filters veranderen een value en zijn doorgaans gekoppeld aan een predefined variable\napply_filters( 'my_custom_filter', $value_to_filter );<\/code><\/pre>\n<p>De parameters van je custom filter moeten een unieke identifier en een value om op te filteren bevatten. Andere developers kunnen een hook voor jouw custom filter aanbrengen via de <code><strong>add_filter()<\/strong><\/code> function en de doorgegeven value aanpassen.<\/p>\n<pre><code class=\"language-php\">add_filter( 'my_custom_filter', 'some_callback_function' );\n\n\/\/ definieer de callback function die je in de filter function hierboven noemde\nfunction some_callback_function( $value_to_filter ) {\n    \/\/ wijzig de ge-passed-e value (of niet) \n    return $value_to_filter; \/\/ retourneren van een value is een must voor filters\n}<\/code><\/pre>\n<p>Bij het defini\u00ebren van je custom filter moet je er op letten dat het zich niet bevindt voor de value die het zou moeten filteren. Als je het filter niet op de goede plek zet, kan de gefilterde value daarna weer overschreven worden door de standaardvalue.<\/p>\n<h3>Gewoonten voor het benoemen van custom hooks<\/h3>\n<p>Het is belangrijk om een unieke naam voor al je custom hooks te kiezen. Aangezien elke plugin en thema zijn eigen custom hooks kan hebben, kun je conflicten krijgen als de namen van hooks hetzelfde zijn.<\/p>\n<p>Als je bijvoorbeeld je action <code><strong>send_email<\/strong><\/code> noemt, is er een grote kans dat een andere plugin developer dezelfde naam gebruikt, aangezien het niet erg uniek is. Wanneer een website vervolgens jouw plugin en die van de andere developer installeert, kunnen ze <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-fouten\/\">fouten krijgen die moeilijk op te lossen zijn<\/a>.<\/p>\n<p>Het is daarom verstandig al je eigen custom hooks vooraf te laten gaan door een algemene identifier, zodat ze duidelijk en toch uniek zijn. In plaats van <code><strong>send_email<\/strong><\/code> noem je het dus bijvoorbeeld <code><strong>plugin_name_send_email<\/strong><\/code>, waarbij <strong>plugin_name_<\/strong> dan het unieke voorvoegsel is.<\/p>\n<h3>Custom hooks demo met een uitbreidbare plugin<\/h3>\n<p>Laten we een uitbreidbare plugin maken (oftewel een plugin waarin mensen kunnen inpluggen) waarbij andere developers gebruik kunnen maken van de custom hooks.<\/p>\n<p>Ik noem deze plugin <strong>Custom Hooks Demo<\/strong><em>.<\/em> De belangrijkste function is een citatenbox te plaats op de plek waar je een shortcode neerzet. Het zal ook custom actions en filters bevatten op de juiste plekken om het voor andere developers mogelijk te maken de functionaliteit uit te breiden of aan te passen.<\/p>\n<p>Je kunt naar mijn <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-shortcodes\/\">WordPress shortcodes guide<\/a> kijken om meer te leren over shortcodes.<\/p>\n<p>Laten we snel beginnen met de uitbreidbare plugin.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n\/*\nPlugin Name :  Custom Hooks Demo\nDescription :  Demonstrating how to create an extensible WordPress plugin using custom hooks.\nAuthor      :  Salman Ravoof\nAuthor URI  :  https:\/\/salmanravoof.com\/\nLicense     :  GPLv2 or later\nLicense URI :  https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\nText Domain :  custom-hooks-demo\n*\/\n\n\/** \n * the [custom_hooks_demo] shortcode returns the HTML code for a quote box.\n * @return string HTML code for a quote box\n*\/\nadd_shortcode( 'custom_hooks_demo', 'my_shortcode_callback' );\n\nfunction my_shortcode_callback ( $arguments ) {\n    ob_start(); \/\/ start object buffering to collect all output before sending it to the browser\n    \n    \/\/ stelt een action hook in om te runnen voordat je wat dan ook output\n    do_action( 'the_topmost_custom_action' );\n    \n    \/\/ definieer je variables waarvan je wil toestaan dat ze worden gefilterd\n    $quote_content = \"Z.E.R.O. That's the number of people who'd like to have any website autoplay music on their browsers.\";\n    $quote_author = \"John Doenuts\";\n    \n    \/\/ maak je custom filters aan nadat je de variables hebt opgesteld\n    $quote_content = apply_filters( 'custom_quote_content', $quote_content );\n    $quote_author = apply_filters( 'custom_quote_author', $quote_author );\n    \n    \/\/ bouw de shortcode output template\n    echo \"&lt;div style=\\\"border:3px solid #5333ed;\\\"&gt;&lt;blockquote style=\\\"margin:20px;border-color:#5333ed;\\\"&gt;\";\n    echo $quote_content;\n    echo \"&lt;br&gt;&lt;br&gt;\";\n    echo \"\u2015 &lt;strong&gt;\" . $quote_author . \"&lt;\/strong&gt;\";\n    echo \"&lt;\/blockquote&gt;&lt;\/div&gt;\";\n    \n    \/\/ stelt een action hook in om te runnen nadat je wat dan ook output\n    do_action( 'the_ending_custom_action' );\n    \n    return ob_get_clean(); \/\/ krijg buffer contents, verwijder buffer en stop met bufferen\n}<\/code><\/pre>\n<ul>\n<li>De <code><strong>add_shortcode()<\/strong><\/code> function wordt gebruikt om een custom shortcode te maken. Vervolgens wordt de callback function van de shortcode gedefinieerd met alle functionaliteit van deze plugin.<\/li>\n<li><a href=\"https:\/\/www.php.net\/manual\/en\/function.ob-start.php\">ob_start()<\/a> is een PHP function die output buffering mogelijk maakt. Dat is erg handig omdat het PHP vertelt om alle output in het buffer geheugen van de server te bewaren, in plaats van meteen uit te voeren. Hierdoor kun je met deze function complexe, leesbare HTML code maken binnen PHP.<\/li>\n<li><code><strong>do_action( 'the_topmost_custom_action' )<\/strong><\/code> definieert de eerste custom action. Om het nuttig te maken, moet je het defini\u00ebren voordat de plugin output produceert. Andere developers kunnen dan hooken aan deze custom action om hun eigen code uit te voeren net voordat deze custom shortcode iets print.<\/li>\n<li>Maak de variabelen aan die je wilt filteren. In deze plugin zijn dat <code><strong>$quote_content<\/strong><\/code>\u00a0en <code><strong>$quote_author<\/strong><\/code>. In dit voorbeeld zijn het allebei strings, maar je kunt ze instellen op elk PHP data-type (integer, boolean, array).<\/li>\n<li>Gebruik de <code><strong>apply_filters()<\/strong><\/code> function om je eigen custom filters te maken. Aangezien alle filters een value teruggeven, kun je de eerder gedefinieerde variabele toewijzen aan de value die dit filter teruggeeft. Andere developers kunnen nu ook een hook aan dit filter maken om de standaard values van de vooraf gedefinieerde variabelen te veranderen.<\/li>\n<li>Gebruik <code><strong>echo<\/strong><\/code> statements om de output van de shortcode regel-voor-regel op te bouwen. Aangezien we output buffering ingeschakeld hebben, zal er geen output direct naar de browser gaan.<\/li>\n<li><code><strong>do_action( 'the_ending_custom_action' )<\/strong><\/code> definieert je laatste custom action. Je moet het helemaal als laatste defini\u00ebren, maar nog wel voordat je alle inhoud van de buffer retourneert.<\/li>\n<li><a href=\"https:\/\/www.php.net\/manual\/en\/function.ob-get-clean.php\">ob_get_clean()<\/a>\u00a0is een standaard 3-in-1 PHP function. Het haalt de inhoud van de buffer op, verwijdert alle buffer data en stop vervolgens met output buffering. Het stuurt de verzamelde buffer inhoud <code><strong>return<\/strong><\/code> als een enkele samengestelde string.<\/li>\n<\/ul>\n<p>Als dit eenmaal is opgeslagen en geactiveerd, zal het plaatsen van de <code><strong>[custom_hooks_demo]<\/strong><\/code> shortcode ervoor zorgen dat je content een citatebox plaatst met de standaardvalues.<\/p>\n<figure id=\"attachment_72264\" aria-describedby=\"caption-attachment-72264\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72264 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/originele-citatenbox-custom-hooks-demo-plugin.png\" alt=\"De originele citatenbox met de Custom Hooks Demo plugin\" width=\"1100\" height=\"530\"><figcaption id=\"caption-attachment-72264\" class=\"wp-caption-text\">De originele citatenbox met de Custom Hooks Demo plugin<\/figcaption><\/figure>\n<p>Laten we nog een andere plugin maken met de naam <strong>Custom Hooks Demo Extension<\/strong>. Deze zal aanhaken bij de custom hooks die we in de vorige plugin hebben gemaakt, en vervolgens iets doen of aanpassen.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n\/*\nPlugin Name :  Custom Hooks Demo Extension\nDescription :  Demonstrating how you can extend WordPress plugin functionality with its custom hooks.\nAuthor      :  Salman Ravoof\nAuthor URI  :  https:\/\/salmanravoof.com\/\nLicense     :  GPLv2 or later\nLicense URI :  https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\nText Domain :  custom-hooks-demo-extension\n*\/\n\n\/**\n * vervang de quote content door aan te haken bij 'custom_quote_content' filter\n*\/\nadd_filter( 'custom_quote_content', 'new_quote_content_callback' );\nfunction new_quote_content_callback( $content ) {\n    $content = \"There are no bugs in programming. Only unexpected features.\";\n    return $content;\n}\n\n\/**\n * vervang de auteur van de quote door aan te haken bij 'custom_quote_author'\n*\/\nadd_filter( 'custom_quote_author', 'new_quote_author_callback' );\nfunction new_quote_author_callback( $author ) {\n    $author = \"Jane Doodle\";\n    return $author;\n}\n\n\/**\n * voeg een afbeelding toe aan de top van de shortcode door aan te haken bij 'the_topmost_custom_action'\n*\/\nadd_action( 'the_topmost_custom_action', 'quote_image_callback' );\nfunction quote_image_callback() {\n    $url = \"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/f\/f9\/Quote-right-cs.svg\/75px-Quote-right-cs.svg.png\";\n    echo '&lt;div&gt;&lt;img class=\"aligncenter\" src=\"'.$url.'\"&gt;&lt;\/div&gt;';\n}\n\n\/**\n * voeg een knop toe onder de shortcut output door aan te haken bij 'the_ending_custom_action'\n*\/\nadd_action( 'the_ending_custom_action', 'add_button_callback' );\nfunction add_button_callback() {\n    echo '&lt;div style=\"text-align:center;\"&gt;&lt;button name=\"nice\"&gt;Nice Quote!&lt;\/button&gt;&lt;\/div&gt;';\n}<\/code><\/pre>\n<p>Zoals je kunt zien bevat deze extension plugin niks anders dan action en filter functions die hooken aan de originele plugin, op de juiste plekken, om vervolgens dingen aan te passen.<\/p>\n<p>Het gebruikt de<code><strong> add_action()<\/strong><\/code> en <code><strong>add_filter()<\/strong><\/code> functions om de callback functions te registreren met de custom actions en filters die we gemaakt hebben met de originele plugin (bv <code><strong>the_topmost_custom_action<\/strong><\/code>,\u00a0<code><strong>custom_quote_author<\/strong><\/code>).<\/p>\n<figure id=\"attachment_72262\" aria-describedby=\"caption-attachment-72262\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72262 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/extension-plugin-verandert-originele-citaat-box.png\" alt=\"De extension plugin verandert de originele citaat box\" width=\"1100\" height=\"682\"><figcaption id=\"caption-attachment-72262\" class=\"wp-caption-text\">De extension plugin verandert de originele citaat box<\/figcaption><\/figure>\n<p>Custom action hooks maken het mogelijk om je code op de juiste plekken in de originele plugin te plaatsen en vervolgens je eigen script uit te voeren. Hier <a href=\"https:\/\/kinsta.com\/nl\/blog\/visuele-contentstrategie\/\">voegen we een afbeelding toe<\/a> bovenaan en een knop onderaan.<\/p>\n<p>Op dezelfde manier maken custom filter hooks het mogelijk om de inhoud van de quote en de naam van de auteur aan te passen. De uiteindelijke uitkomst is een plugin die volledig uit te breiden is door anderen, zonder dat de broncode veranderd moet worden.<\/p>\n<h3>Werken met custom hooks van externe developers<\/h3>\n<p>Custom hooks maken het mogelijk dat individuele <a href=\"https:\/\/kinsta.com\/nl\/onderwerpen\/wordpress-plugins\/\">WordPress plugins<\/a> en <a href=\"https:\/\/kinsta.com\/nl\/blog\/snelste-wordpress-thema\/\">thema&#8217;s<\/a> hun eigen ecosysteem aan uitbreidingen hebben. Denk bijvoorbeeld aan de WooCommerce plugin. Het voegt de functionaliteit van ecommerce toe aan WordPress, maar er zitten ook <a href=\"https:\/\/docs.woocommerce.com\/wc-apidocs\/hook-docs.html\">allerlei hooks in de code<\/a>.<\/p>\n<figure id=\"attachment_72270\" aria-describedby=\"caption-attachment-72270\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72270 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/woocommerce-action-filter-hook-reference.png\" alt=\"WooCommerce Action en Filter Hook Reference\" width=\"1100\" height=\"562\"><figcaption id=\"caption-attachment-72270\" class=\"wp-caption-text\">WooCommerce Action en Filter Hook Reference<\/figcaption><\/figure>\n<p><a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-ecommerce-plugins\/\">WooCommerce heeft honderden uitbreidingen<\/a> en <a href=\"https:\/\/kinsta.com\/nl\/blog\/woocommerce-plugins\/\">plugins<\/a> die de hooks in de kern plugin gebruiken waardoor het nog beter wordt.<\/p>\n<p>Je kunt deze extensies gebruiken om WooCommerce te integreren met bijvoorbeeld Stripe, MailChimp, Salesforce, Zapier en nog veel meer.<\/p>\n<figure id=\"attachment_72269\" aria-describedby=\"caption-attachment-72269\" style=\"width: 1100px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-72269 size-full\" src=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/05\/extensions-breiden-functionaliteit-woocommerce-uit.png\" alt=\"Extensions breiden de functionaliteit van WooCommerce uit\" width=\"1100\" height=\"728\"><figcaption id=\"caption-attachment-72269\" class=\"wp-caption-text\">Extensions breiden de functionaliteit van WooCommerce uit<\/figcaption><\/figure>\n<p>Het is een goede gewoonte om de documentatie van populaire WordPress plugins te bekijken om te zien hoe zij custom hooks implementeren. Enkele van de naar mijn mening beste om te bekijken zijn\u00a0<a href=\"https:\/\/docs.easydigitaldownloads.com\/article\/559-developers-intro-to-easy-digital-downloads\">Easy Digital Downloads<\/a>,\u00a0<a href=\"https:\/\/codex.buddypress.org\/\">BuddyPress<\/a>,\u00a0<a href=\"https:\/\/quizandsurveymaster.com\/docs\/developer\/hooks-and-filters\/\">Quiz and Survey Master<\/a>, en <a href=\"https:\/\/docs.gravityforms.com\/category\/developers\/hooks\/\">Gravity Forms<\/a>.<\/p>\n<h3>Wanneer kun je custom hooks gebruiken?<\/h3>\n<p>Afhankelijk van het <a href=\"https:\/\/kinsta.com\/blog\/themeforest-pros-cons\/\">thema<\/a> of de <a href=\"https:\/\/kinsta.com\/blog\/publish-plugin-wordpress-plugin-directory\/\">plugin die je maakt<\/a> en voor wie deze bedoeld is, kan het al dan niet handig zijn om custom hooks toe te voegen.<\/p>\n<p>Een goede vuistregel hiervoor is om te kijken of er voordelen zijn voor andere developers als je product uitbreidbaar zou zijn. Zo niet, dan kun je het beter niet doen, tot je erom gevraagd wordt.<\/p>\n<p>Je moet echt goed weten wat je doet voordat je custom hooks aan je plugin of thema toevoegt. Nadat je je product hebt gepubliceerd en andere developers dergelijke hooks zijn gaan gebruiken, kun je dit nooit meer veranderen zonder backward compatibility te verliezen.<\/p>\n<h2>Verwijderen van callback functions van WordPress hooks<\/h2>\n<p>Je hebt al gezien hoe je callback functions kunt verwijderen die met bepaalde hooks zijn geregistreerd. Deze callbacks kunnen geregistreerd zijn door plugins, thema&#8217;s of zelfs de WordPress kern zelf. Laten we nog beter kijken hoe je gehookte callback functions kunt verwijderen met nog wat extra voorbeelden.<\/p>\n<p>Om een callback function te verwijderen van een hook kun je de <code><strong>remove_action()<\/strong><\/code> of <strong><code>remove_filter<\/code>\u00a0<\/strong>function gebruiken, afhankelijk van of het een action of filter is.<\/p>\n<p>Een nadeel is dat je deze functions moet callen met precies dezelfde parameters als die gebruikt werden om de callback function aan het begin te registreren. Je kan dus het beste die parameters gewoon kopi\u00ebren en plakken van hun <code><strong>add_action()<\/strong><\/code> of <code><strong>add_filter()<\/strong><\/code> function.<\/p>\n<p>Verder kan je callback functions alleen verwijderen n\u00e1dat ze geregistreerd zijn. Als je dit omdraait, zal het verwijderen niet lukken. In het algemeen is het belangrijk dat je de volgorde van uitvoering van hooks goed gebruikt.<\/p>\n<p>Laten we bijvoorbeeld zeggen dat je een callback function wilt verwijderen die geregistreerd is door een thema, dat onnodige bloat toevoegt aan je website (<a href=\"https:\/\/kinsta.com\/nl\/leren\/wordpress-sneller-maken\/\">en iedereen wil een snelle site, toch?<\/a>).<\/p>\n<pre><code class=\"language-php\">function wp_bloated_callback_function() {\u00a0 \u00a0 \n\/\/ code die veel bloat toevoegt aan de site\n}\nadd_action( 'template_redirect', 'wp_bloated_callback_function', 5 );<\/code><\/pre>\n<p>De callback function hierboven laadt bijvoorbeeld allerlei zinloze scripts en stylesheets. En als je dat kunt verwijderen, wordt je website <a href=\"https:\/\/kinsta.com\/nl\/leren\/snelheidsoptimalisatie\/\">een stuk sneller<\/a>.<\/p>\n<p>Maar je moet er dan wel voor zorgen dat de <code><strong>remove_action()<\/strong><\/code> function pas uitgevoerd wordt na de <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/template_redirect\/\">template_redirect<\/a> action. Dit kun je doen door te hooken aan de <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/after_setup_theme\/\">after_setup_theme<\/a> action nadat deze is getriggerd door de <code><strong>template_redirect<\/strong><\/code> action.<\/p>\n<pre><code class=\"language-php\">function wp_remove_bloat() {\n    \/\/ zorg dat alle parameters identiek zijn aan de original add_action() function\n  \u00a0 remove_action( 'template_redirect', 'wp_bloated_callback_function', 5 );\n}\n\n\/\/ zorg dat remove_action() pas na add_action() wordt gecalld\nadd_action( 'after_setup_theme', 'wp_remove_bloat' );<\/code><\/pre>\n<p>De\u00a0<code><strong>wp_bloated_callback_function()<\/strong><\/code>\u00a0zal zichzelf nu verwijderen van de \u00a0<code><strong>template_redirect<\/strong><\/code>\u00a0action.<\/p>\n<h3>Speciale gevallen voor het verwijderen van callback functions<\/h3>\n<p>Bij het verwijderen van callback functions komt meer kijken dan ze alleen uitschakelen. Soms wil je ze bijvoorbeeld tijdelijk uitschakelen, je eigen code draaien, en weer toevoegen.<\/p>\n<p>De <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/save_post\/\">save_post<\/a> action wordt bijvoorbeeld elke keer geactiveerd dat de <code><strong>wp_insert_post()<\/strong><\/code>\u00a0en <code><strong>wp_publish_post()<\/strong><\/code>\u00a0functions gebruikt worden. Ze worden <a href=\"https:\/\/core.trac.wordpress.org\/browser\/tags\/5.4\/src\/wp-includes\/post.php#L4135\">allebei gedefinieerd<\/a> in het <code><strong>wp-includes\/post.php<\/strong><\/code> bestand.<\/p>\n<p>Als je dus een callback function gehookt hebt aan de <code><strong>save_post<\/strong><\/code> action, en je wilt de \u00a0<code><strong>wp_insert_post()<\/strong><\/code>\u00a0of <code><strong>wp_publish_post()<\/strong><\/code> functions callen binnen je callback function, zal de <code><strong>save_post<\/strong><\/code> action meerdere keren geactiveerd worden.<\/p>\n<pre><code class=\"language-php\">function some_callback_function( $post_id, $post ) {\n\u00a0 \u00a0 \/\/ do iets hier\n  \u00a0 wp_insert_post( [some_array] ); \/\/ this function also calls the 'save_post' action\n\u00a0 \u00a0 \/\/ doe misschien hier ook iets\n}\nadd_action( 'save_post', 'some_callback_function', 10, 2 );<\/code><\/pre>\n<p>Een function die een action oproept, terwijl die action de function oproept, kan onverwachte resultaten opleveren. Je kunt dit probleem oplossen door de <strong><code>remove_action()<\/code>\u00a0<\/strong>function binnen je callback function te gebruiken voordat je <code><strong>wp_insert_post()<\/strong><\/code> gebruikt.<\/p>\n<pre><code class=\"language-php\">function some_callback_function( $post_id, $post ) {\n\u00a0 \u00a0 \/\/ doe hier iets\n\u00a0 \u00a0 \n    \/\/ verwijder de callback function van de \u2018save_post\u2019 action\n\u00a0 \u00a0 remove_action( 'save_post', 'some_callback_function', 10, 2 );\n\u00a0 \u00a0 \n    \/\/ run nu de wp_insert_post() function\n    wp_insert_post( [some_array] );\n\u00a0 \u00a0 \n    \/\/ voeg de callback function nu weer terug toe aan de \u2018save_post\u2019 action\n\u00a0 \u00a0 add_action( 'save_post', 'some_callback_function', 10, 2 );\n\u00a0 \u00a0 \n    \/\/ doe misschien hier ook iets \n}\nadd_action( 'save_post', 'some_callback_function', 10, 2 );<\/code><\/pre>\n<p>Dit is nog een handige manier om <code><strong>remove_action()<\/strong><\/code> of <code><strong>remove_filter()<\/strong><\/code> te gebruiken. Door verder in de WordPress kern te kijken leer je beter begrijpen hoe je deze situaties kunt voorkomen.<\/p>\n<h2>Bonus WordPress hooks tutorials<\/h2>\n<ul>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/code-toevoegen-aan-de-wordpress-header-en-footer\/#how-to-manually-add-code-to-wordpress-header-and-footer\">Manually Add Code to WordPress Header and Footer<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-mediabibliotheek\/\">Your Complete Guide to the WordPress Media Library<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-cron-job\/\">How to Create and Modify a WordPress Cron Job<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/child-thema-wordpress\/#create\">How to Create a WordPress Child Theme<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/nl\/blog\/uitschakelen-laden-wordpress-plugins\/\">Disable WordPress Plugins From Loading on Specific Pages and Posts<\/a><\/li>\n<li><a href=\"https:\/\/kinsta.com\/blog\/disable-emojis-wordpress\/#2-disable-emojis-in-wordpress-with-code\">Disable Emojis in WordPress with Code<\/a><\/li>\n<\/ul>\n\n<h2>Samenvatting<\/h2>\n<p>Er zijn verschillende voordelen aan WordPress hooks als je een <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-ontwikkelaar-huren\/\">WordPress developer bent<\/a>.<\/p>\n<p>Hooks kunnen je de kernfunctionaliteit van WordPress helpen veranderen of uitbreiden. Maar je kunt ze ook gebruiken om plugins of thema&#8217;s te veranderen of andere developers de mogelijkheid geven met jouw plugins of thema&#8217;s te werken.<\/p>\n<p>Kortom, hoog tijd om ook aan te haken bij WordPress hooks!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hooks zijn \u00e9\u00e9n van de belangrijkste tools in het arsenaal van de WordPress ontwikkelaar. Ze vormen de basis van het ontwikkelen van WordPress plugins en thema&#8217;s. &#8230;<\/p>\n","protected":false},"author":117,"featured_media":32579,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[29,329],"topic":[865,892],"class_list":["post-32545","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-webdev","tag-wordpress-hooks","topic-php-functie","topic-wordpress-ontwikkeling"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>WordPress hooks bootcamp: zo gebruik je actions, filters en custom hooks<\/title>\n<meta name=\"description\" content=\"Leer alles over WordPress hooks, actions, filters en custom hooks en maak je eigen uitbreidbare plugin. Breng je dev skills nu naar het volgende niveau!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WordPress hooks bootcamp: zo gebruik je actions, filters en custom hooks\" \/>\n<meta property=\"og:description\" content=\"Leer alles over WordPress hooks, actions, filters en custom hooks en maak je eigen uitbreidbare plugin. Breng je dev skills nu naar het volgende niveau!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-06-11T07:03:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-09T06:40:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/06\/wordpress-hooks.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"768\" \/>\n\t<meta property=\"og:image:height\" content=\"384\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Salman Ravoof\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Leer alles over WordPress hooks, actions, filters en custom hooks en maak je eigen uitbreidbare plugin. Breng je dev skills nu naar het volgende niveau!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/06\/wordpress-hooks.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data2\" content=\"62 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"WordPress hooks bootcamp: zo gebruik je actions, filters en custom hooks\",\"datePublished\":\"2020-06-11T07:03:03+00:00\",\"dateModified\":\"2023-08-09T06:40:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/\"},\"wordCount\":10593,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/06\/wordpress-hooks.jpg\",\"keywords\":[\"webdev\",\"WordPress Hooks\"],\"articleSection\":[\"WordPress ontwikkeling\"],\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/\",\"url\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/\",\"name\":\"WordPress hooks bootcamp: zo gebruik je actions, filters en custom hooks\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/06\/wordpress-hooks.jpg\",\"datePublished\":\"2020-06-11T07:03:03+00:00\",\"dateModified\":\"2023-08-09T06:40:17+00:00\",\"description\":\"Leer alles over WordPress hooks, actions, filters en custom hooks en maak je eigen uitbreidbare plugin. Breng je dev skills nu naar het volgende niveau!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/06\/wordpress-hooks.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/06\/wordpress-hooks.jpg\",\"width\":768,\"height\":384,\"caption\":\"WordPress hooks bootcamp: zo gebruik je actions, filters en custom hooks\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/nl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WordPress ontwikkeling\",\"item\":\"https:\/\/kinsta.com\/nl\/onderwerpen\/wordpress-ontwikkeling\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"WordPress hooks bootcamp: zo gebruik je actions, filters en custom hooks\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/nl\/#website\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snelle, veilige, premium hostingoplossingen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/nl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\",\"https:\/\/x.com\/Kinsta_NL\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"caption\":\"Salman Ravoof\"},\"description\":\"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.\",\"sameAs\":[\"https:\/\/salmanravoof.com\",\"https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/\",\"https:\/\/x.com\/salmanravoof\"],\"url\":\"https:\/\/kinsta.com\/nl\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"WordPress hooks bootcamp: zo gebruik je actions, filters en custom hooks","description":"Leer alles over WordPress hooks, actions, filters en custom hooks en maak je eigen uitbreidbare plugin. Breng je dev skills nu naar het volgende niveau!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/","og_locale":"nl_NL","og_type":"article","og_title":"WordPress hooks bootcamp: zo gebruik je actions, filters en custom hooks","og_description":"Leer alles over WordPress hooks, actions, filters en custom hooks en maak je eigen uitbreidbare plugin. Breng je dev skills nu naar het volgende niveau!","og_url":"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","article_published_time":"2020-06-11T07:03:03+00:00","article_modified_time":"2023-08-09T06:40:17+00:00","og_image":[{"width":768,"height":384,"url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/06\/wordpress-hooks.jpg","type":"image\/jpeg"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"Leer alles over WordPress hooks, actions, filters en custom hooks en maak je eigen uitbreidbare plugin. Breng je dev skills nu naar het volgende niveau!","twitter_image":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/06\/wordpress-hooks.jpg","twitter_creator":"@salmanravoof","twitter_site":"@Kinsta_NL","twitter_misc":{"Geschreven door":"Salman Ravoof","Geschatte leestijd":"62 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"WordPress hooks bootcamp: zo gebruik je actions, filters en custom hooks","datePublished":"2020-06-11T07:03:03+00:00","dateModified":"2023-08-09T06:40:17+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/"},"wordCount":10593,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/06\/wordpress-hooks.jpg","keywords":["webdev","WordPress Hooks"],"articleSection":["WordPress ontwikkeling"],"inLanguage":"nl-NL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/","url":"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/","name":"WordPress hooks bootcamp: zo gebruik je actions, filters en custom hooks","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/06\/wordpress-hooks.jpg","datePublished":"2020-06-11T07:03:03+00:00","dateModified":"2023-08-09T06:40:17+00:00","description":"Leer alles over WordPress hooks, actions, filters en custom hooks en maak je eigen uitbreidbare plugin. Breng je dev skills nu naar het volgende niveau!","breadcrumb":{"@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#primaryimage","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/06\/wordpress-hooks.jpg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2020\/06\/wordpress-hooks.jpg","width":768,"height":384,"caption":"WordPress hooks bootcamp: zo gebruik je actions, filters en custom hooks"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/nl\/"},{"@type":"ListItem","position":2,"name":"WordPress ontwikkeling","item":"https:\/\/kinsta.com\/nl\/onderwerpen\/wordpress-ontwikkeling\/"},{"@type":"ListItem","position":3,"name":"WordPress hooks bootcamp: zo gebruik je actions, filters en custom hooks"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/nl\/#website","url":"https:\/\/kinsta.com\/nl\/","name":"Kinsta\u00ae","description":"Snelle, veilige, premium hostingoplossingen","publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/nl\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/nl\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","https:\/\/x.com\/Kinsta_NL","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","caption":"Salman Ravoof"},"description":"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.","sameAs":["https:\/\/salmanravoof.com","https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/","https:\/\/x.com\/salmanravoof"],"url":"https:\/\/kinsta.com\/nl\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/32545","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/users\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/comments?post=32545"}],"version-history":[{"count":12,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/32545\/revisions"}],"predecessor-version":[{"id":54801,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/32545\/revisions\/54801"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32545\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32545\/translations\/fr"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32545\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32545\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32545\/translations\/pt"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32545\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32545\/translations\/nl"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32545\/translations\/se"},{"href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/32545\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media\/32579"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media?parent=32545"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/tags?post=32545"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/topic?post=32545"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}