{"id":58804,"date":"2024-04-12T22:25:39","date_gmt":"2024-04-12T20:25:39","guid":{"rendered":"https:\/\/kinsta.com\/nl\/?p=58804&#038;preview=true&#038;preview_id=58804"},"modified":"2024-04-19T10:38:32","modified_gmt":"2024-04-19T08:38:32","slug":"setupgegevens-voor-wordpress-plugin","status":"publish","type":"post","link":"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/","title":{"rendered":"Zo installeer je setupgegevens voor een WordPress plugin"},"content":{"rendered":"<p>Bij het ontwikkelen van een <a href=\"https:\/\/kinsta.com\/nl\/onderwerpen\/wordpress-plugins\/\">WordPress plugin<\/a> is een cruciale stap het vooraf installeren van essenti\u00eble gegevens, zodat de plugin vanaf het begin soepel werkt. Neem bijvoorbeeld een plugin voor het managen van evenementen. Bij de installatie is het enorm handig als de plugin automatisch een pagina genereert met de titel <strong>Aankomende evenementen<\/strong>, waarop een lijst met toekomstige evenementen wordt weergegeven.<\/p>\n<p>Deze voorgeconfigureerde pagina, ingesloten met een shortcode zoals <code>[event_list number=\"10\" scope=\"future\" status=\"publish\"]<\/code>, stelt gebruikers in staat om direct gebruik te maken van de mogelijkheden van de plugin zonder de documentatie door te lezen.<\/p>\n<p>Het installeren van gegevens is niet alleen handig wanneer je de plugin voor het eerst installeert, maar ook wanneer je de plugin later bijwerkt. Bijvoorbeeld, als een update een feature introduceert om een kalender weer te geven, kan de plugin automatisch een nieuwe pagina maken, <strong>Evenementenkalender<\/strong>, die deze toevoeging laat zien door middel van een shortcode zoals <code>[event_calendar status=\"publish\"]<\/code>.<\/p>\n<p>In het algemeen moet je bij het installeren van gegevens aan het volgende denken:<\/p>\n<ul>\n<li>Het genereren van nieuwe pagina&#8217;s met specifieke titels en inhoud.<\/li>\n<li>Toevoegen van items voor custom posttypes (CPT&#8217;s) die door de plugin zijn gemaakt.<\/li>\n<li>Standaardinstellingen invoegen in de tabel <code>wp_options<\/code><\/li>\n<li>Nieuwe mogelijkheden toewijzen aan gebruikersrollen<\/li>\n<li>Metadata toewijzen aan gebruikers, voor nieuwe of bijgewerkte functies die door de plugin worden aangeboden (gebruikers kunnen bijvoorbeeld het datumformat van een evenement wijzigen, en een standaardwaarde wordt eerst toegevoegd voor alle gebruikers)<\/li>\n<li>Categorie\u00ebn aanmaken die vaak gebruikt worden binnen de context van de plugin, zoals &#8220;conferenties&#8221; of &#8220;sport&#8221;<\/li>\n<\/ul>\n<p>Het installeren van gegevens moet een incrementeel proces zijn, anders zouden we dubbele vermeldingen kunnen maken.<\/p>\n<p>Bijvoorbeeld, als een plugin versie 1.1 een <strong>Aankomende Evenementen <\/strong>pagina introduceert en een gebruiker update vanaf versie 1.0, dan moeten alleen de nieuwe gegevens die relevant zijn voor versie 1.1 worden ge\u00efnstalleerd. Deze incrementele update zorgt ervoor dat wanneer versie 1.2 uitrolt met de kalenderfunctie, alleen de nieuwe pagina <strong>Evenementenkalender<\/strong> wordt toegevoegd, waardoor duplicatie van de pagina <strong>Aankomende evenementen<\/strong> wordt voorkomen.<\/p>\n<p>Daarom moet de plugin bij het updaten achterhalen welke vorige versie was ge\u00efnstalleerd en alleen de gegevens installeren die overeenkomen met de nieuwe versie(s).<\/p>\n<p>Dit artikel legt uit hoe je initi\u00eble gegevens installeert en nieuwe gegevens blijft toevoegen bij verdere updates in onze WordPress plugins.<\/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>De huidige versie leveren<\/h2>\n<p>Om het incrementele proces aan te kunnen, moet de plugin zijn huidige versie bijhouden, die meestal wordt aangegeven in de <a href=\"https:\/\/developer.wordpress.org\/plugins\/plugin-basics\/header-requirements\/#header-fields\" target=\"_blank\" rel=\"noopener noreferrer\">header van het hoofdbestand van de plugin<\/a>. Maar daar kunnen we natuurlijk niet direct naar verwijzen, omdat het in een <a href=\"https:\/\/kinsta.com\/nl\/blog\/wat-is-php\/\">PHP<\/a> comment staat. Dus defini\u00ebren we deze waarde ook in een variabele en geven die door aan een <code>Plugin<\/code> klasse die verantwoordelijk is voor initialisatie en configuratie:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\/*\nPlugin Name: My plugin\nVersion: 1.6\n*\/\n\n\/\/ Same version as in the header\n$pluginVersion = '1.6';\nnew Plugin($pluginVersion)-&gt;setup();\n<\/code><\/pre>\n<p>De klasse <code>Plugin<\/code>, die gebruik maakt van <a href=\"https:\/\/kinsta.com\/nl\/blog\/php-8\/#constructor-property-promotion\">PHP 8.0&#8217;s Constructor property promotion<\/a>, slaat deze versie op, zodat we er later naar kunnen verwijzen:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nclass Plugin {\n\n  public function __construct(\n    protected string $pluginVersion,\n  ) {}\n\n  public function setup(): void\n  {\n    \/\/ Initialization logic here...\n  }\n\n  \/\/ ...\n}\n<\/code><\/pre>\n<p>Let op hoe de logica om de plugin te initialiseren en configureren is toegevoegd aan de methode <code>setup<\/code>, niet aan de constructor. Dat is omdat de constructor bijwerkingen moet vermijden; anders zouden we bugs kunnen veroorzaken bij het uitbreiden of samenstellen van de klasse <code>Plugin<\/code>.<\/p>\n<p>Laten we eens kijken hoe dat zou kunnen gebeuren. Stel dat we uiteindelijk een klasse <code>BetterPlugin<\/code> toevoegen die functionaliteit uit de klasse <code>Plugin<\/code> samenstelt:<\/p>\n<pre><code class=\"language-php\">class BetterPlugin {\n\n  public function printSomething(): string\n  {\n    $pluginVersion = '1.0';\n    $plugin = new Plugin($pluginVersion);\n    return '&lt;div class=\"wrapper\"&gt;' . $plugin-&gt;printSomething() . '&lt;\/div&gt;';\n  }\n}\n<\/code><\/pre>\n<p>Telkens wanneer <code>new Plugin()<\/code> wordt uitgevoerd binnen <code>printSomething<\/code>, wordt een nieuwe instantie van <code>Plugin<\/code> aangemaakt. Als de configuratielogica zou worden toegevoegd aan de constructor, zou deze elke keer worden uitgevoerd als we een nieuw <code>Plugin<\/code> object maken. In ons geval willen we de pagina <strong>Aankomende evenementen<\/strong> maar \u00e9\u00e9n keer maken, niet meerdere keren. Door de logica toe te voegen aan de methode <code>setup<\/code> kunnen we dit probleem vermijden.<\/p>\n<h2>De vorige versie bijhouden<\/h2>\n<p>WordPress biedt geen handige manier om de versie op te halen van de plugin die wordt vervangen. Daarom moeten we deze waarde zelf opslaan in de <code>wp_options<\/code> tabel van de <a href=\"https:\/\/kinsta.com\/database\/\">database<\/a>.<\/p>\n<p>Sla de versie op onder entry <code>\"myplugin_version\"<\/code>, waarbij <code>myplugin_<\/code> de naam van de plugin is (bijvoorbeeld <code>eventsmanager_version<\/code>). Het is belangrijk om al onze instellingen altijd vooraf te laten gaan door <code>myplugin_<\/code>, om mogelijke conflicten te voorkomen, omdat we er niet zeker van kunnen zijn dat een andere plugin geen <code>version<\/code> optie zal toevoegen.<\/p>\n<p>Bij het laden van de plugin bij elke aanvraag, zal <code>Plugin<\/code> al weten wat de huidige versie is (van propery <code>$pluginVersion<\/code> eerder), en zal de laatst opgeslagen versie ophalen uit de database. Deze vergelijking bepaalt de status van de plugin:<\/p>\n<ul>\n<li><strong>Nieuwe installatie:<\/strong> detecteert of de database een versievermelding voor de plugin mist, wat duidt op een eerste installatie (d.w.z. <code>$storedPluginVersion<\/code> is <code>null<\/code>)<\/li>\n<li><strong>Update:<\/strong> Wordt ge\u00efdentificeerd als de huidige versie hoger is dan de in de database opgeslagen versie, wat aangeeft dat er een upgrade nodig is.<\/li>\n<li>Anders is er geen verandering<\/li>\n<\/ul>\n<p>Wanneer er een verandering is, callen we <code>prepareAndInstallPluginSetupData<\/code> om de juiste gegevens te installeren, of het nu gaat om een nieuwe installatie (in dat geval moet het alle gegevens voor alle versies installeren) of een update (installeer alleen gegevens voor alle nieuwe versies). De nulvariabele <code>$previousVersion<\/code> geeft aan om welke situatie het gaat (<code>$previousVersion<\/code> is <code>null<\/code> =&gt; nieuwe installatie).<\/p>\n<p>Na het callen van deze methode moeten we ook de huidige plugin versie opslaan in de database, wat de nieuwe &#8220;laatst opgeslagen&#8221; versie wordt. Dit moet gedaan worden na het callen van <code>prepareAndInstallPluginSetupData<\/code>, zodat als deze methode een fout oplevert (bijvoorbeeld het gooien van een <code>RuntimeException<\/code>) en de gegevens niet ge\u00efnstalleerd worden, de vorige versie nog steeds opgeslagen is in de database en een nieuwe ronde van het installeren van gegevens zal worden geprobeerd bij de volgende aanvraag.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nclass Plugin {\n\n  \/\/ ...\n\n  public function setup(): void\n  {\n    if (!is_admin()) {\n      return;\n    }\n\n    $this-&gt;managePluginDataVersioning();\n  }\n\n  \/**\n   * If the plugin has just been newly-installed + activated\n   * or updated, install the appropriate data.\n   *\/\n  protected function managePluginDataVersioning(): void\n  {\n    $myPluginVersionOptionName = 'myplugin_version';\n    $storedPluginVersion = get_option($myPluginVersionOptionName, null);\n\n    \/\/ Check if the main plugin has been activated or updated\n    $isPluginJustFirstTimeActivated = $storedPluginVersion === null;\n    $isPluginJustUpdated = !$isPluginJustFirstTimeActivated && $storedPluginVersion !== $this-&gt;pluginVersion;\n\n    \/\/ If there were no changes, nothing to do\n    if (!$isPluginJustFirstTimeActivated && !$isPluginJustUpdated) {\n      return;\n    }\n\n    \\add_action(\n      'init',\n      function () use ($myPluginVersionOptionName, $storedPluginVersion): void {\n        $this-&gt;prepareAndInstallPluginSetupData($storedPluginVersion);\n\n        \/\/ Update on the DB\n        update_option($myPluginVersionOptionName, $this-&gt;pluginVersion);\n      }\n    );\n  }\n\n  protected function prepareAndInstallPluginSetupData(?string $previousVersion): void\n  {\n    \/\/ Installation logic...\n  }\n}\n<\/code><\/pre>\n<p>Merk op dat <code>prepareAndInstallPluginSetupData<\/code> (en de daaropvolgende DB update) wordt uitgevoerd op de <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-hooks\/\"><code>init<\/code> action hook<\/a>. Dit is om er zeker van te zijn dat alle gegevens van het CMS klaar zijn om opgevraagd en gemanipuleerd te worden.<\/p>\n<p>Met name <a href=\"https:\/\/kinsta.com\/blog\/what-is-taxonomy\/\">taxonomie\u00ebn<\/a> (tags en categorie\u00ebn) kunnen <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_taxonomy\/#description\" target=\"_blank\" rel=\"noopener noreferrer\">niet worden benaderd v\u00f3\u00f3r de <code>init<\/code> hook<\/a>. Als het installatieproces van de plugin een CPT entry moest aanmaken en er een aangepaste categorie aan moest toewijzen, dan kon dit proces pas worden uitgevoerd vanaf de <code>init<\/code> hook.<\/p>\n<p>Het opvragen van de laatst opgeslagen versie uit de DB bij elke aanvraag is niet ideaal vanuit het <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-database-optimalisatie\/\">oogpunt van prestaties<\/a>. Om dit te verbeteren, combineer je alle opties die de plugin nodig heeft in een array, sla je ze op in een enkel item en call je ze allemaal met een enkele oproep naar de DB.<\/p>\n<p>Bijvoorbeeld, als de plugin ook een <code>myplugin_date_format<\/code> optie nodig heeft om de datum van de gebeurtenis weer te geven, dan kunnen we een enkel item <code>myplugin_options<\/code> maken met properties <code>version<\/code> en <code>date_format<\/code>.<\/p>\n<p>Om toegang te krijgen tot de laatst opgeslagen versie, moet de PHP code dan als volgt worden aangepast:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nclass Plugin {\n\n  \/\/ ...\n\n  protected function managePluginDataVersioning(): void\n  {\n    $myPluginOptionsOptionName = 'myplugin_options';\n    $myPluginOptions = get_option($myPluginOptionsOptionName, []);\n    $storedPluginVersion = $myPluginOptions['version'] ?? null;\n\n    \/\/ ...\n\n    \\add_action(\n      'init',\n      function () use ($myPluginOptionsOptionName, $myPluginOptions): void {\n        \/\/ ...\n\n        \/\/ Update on the DB\n        $myPluginOptions['version'] = $this-&gt;pluginVersion;\n        update_option($myPluginOptionsOptionName, $myPluginOptions);\n      }\n    );\n  }\n}\n<\/code><\/pre>\n<h2>Het vermijden van gelijktijdige verzoeken die dubbele gegevens installeren<\/h2>\n<p>De mogelijkheid bestaat dat het installatieproces meer dan eens wordt gestart als twee of meer gebruikers op precies hetzelfde moment toegang krijgen tot de <a href=\"https:\/\/kinsta.com\/blog\/wordpress-admin\/\">wp-admin<\/a>. Om te voorkomen dat dezelfde gegevens twee of meer keer worden ge\u00efnstalleerd, gebruiken we een <a href=\"https:\/\/developer.wordpress.org\/apis\/transients\/\" target=\"_blank\" rel=\"noopener noreferrer\">transient<\/a> als flag om alleen het eerste verzoek toe te staan om gegevens te installeren:<\/p>\n<ul>\n<li>Controleer of transient <code>myplugin_installing_plugin_setup_data<\/code> bestaat (nogmaals, deze naam moet worden voorafgegaan door <code>myplugin_<\/code>); zo ja, doe dan niets (omdat een ander proces de gegevens installeert)<\/li>\n<li>Anders de transient in de database opslaan voor een redelijke maximumtijd om de gegevens te installeren (bijvoorbeeld 30 seconden)<\/li>\n<li>Installeer de gegevens<\/li>\n<li>Verwijder het transient event<\/li>\n<\/ul>\n<p>Hier is de code:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nclass Plugin {\n\n  \/\/ ...\n\n  \/**\n   * Use a transient to make sure that only one instance\n   * will install the data. Otherwise, two requests\n   * happening simultaneously might execute the logic\n   *\/\n  protected function prepareAndInstallPluginSetupData(?string $previousVersion): void\n  {\n    $transientName = 'myplugin_installing_plugin_setup_data';\n    $transient = \\get_transient($transientName);\n    if ($transient !== false) {\n      \/\/ Another instance is executing this code right now\n      return;\n    }\n\n    \\set_transient($transientName, true, 30);\n    $this-&gt;installPluginSetupData($previousVersion);\n    \\delete_transient($transientName);\n  }\n\n  protected function installPluginSetupData(?string $previousVersion): void\n  {\n    \/\/ Do something...\n  }\n}\n<\/code><\/pre>\n<h2>Gegevens installeren voor alle versies<\/h2>\n<p>Zoals eerder vermeld, moeten we bij het bijwerken van de plugin alleen de gegevens voor de nieuwe versies installeren, niet voor alle versies. Dat betekent dat we per versie moeten beheren welke gegevens we installeren.<\/p>\n<p>In de onderstaande code geeft de array <code>$versionCallbacks<\/code> aan welke functie moet worden uitgevoerd voor elke versie, waarbij de functie de logica uitvoert om de gegevens te installeren. We itereren de lijst van alle versies, vergelijken elke versie met de vorige versie met <code>version_compare<\/code> en als deze groter is, voeren we de bijbehorende functie uit om de bijbehorende gegevens te installeren.<\/p>\n<p>Merk op dat als <code>$previousVersion<\/code> <code>null<\/code> is (het is dus een nieuwe installatie), alle functies worden uitgevoerd.<\/p>\n<pre><code class=\"language-php\">class Plugin {\n  \/**\n   * Provide the installation in stages, version by version, to\n   * be able to execute it both when installing\/activating the plugin,\n   * or updating it to a new version with setup data.\n   *\n   * The plugin's setup data will be installed if:\n   *\n   * - $previousVersion = null =&gt; Activating the plugin for first time\n   * - $previousVersion &lt; someVersion =&gt; Updating to a new version that has data to install\n   *\/\n  protected function installPluginSetupData(?string $previousVersion): void\n  {\n    $versionCallbacks = [\n      '1.1' =&gt; $this-&gt;installPluginSetupDataForVersion1Dot1(...),\n      '1.2' =&gt; $this-&gt;installPluginSetupDataForVersion1Dot2(...),\n      \/\/ ... Add more versions\n    ];\n    foreach ($versionCallbacks as $version =&gt; $callback) {\n      \/**\n       * If the previous version is provided, check if the corresponding update\n       * has already been performed, then skip\n       *\/\n      if ($previousVersion !== null && version_compare($previousVersion, $version, '&gt;=')) {\n        continue;\n      }\n      $callback();\n    }\n  }\n\n  protected function installPluginSetupDataForVersion1Dot1(): void\n  {\n    \/\/ Do something...\n  }\n\n  protected function installPluginSetupDataForVersion1Dot2(): void\n  {\n    \/\/ Do something...\n  }\n}\n<\/code><\/pre>\n<h2>Gegevens installeren voor elke specifieke versie<\/h2>\n<p>Tot slot moeten we de eigenlijke gegevens installeren (een pagina maken, een CPT vermelding, een optie toevoegen, enzovoort) voor elke versie.<\/p>\n<p>In deze code voegen we de pagina <strong>Upcoming Events <\/strong>toe voor de plugin voor evenementenbeheer, voor <code>v1.1<\/code>:<\/p>\n<pre><code class=\"language-php\">class Plugin {\n  \n  \/\/ ...\n\n  protected function installPluginSetupDataForVersion1Dot1(): void\n  {\n    \\wp_insert_post([\n      'post_status' =&gt; 'publish',\n      'post_type' =&gt; 'page',\n      'post_title' =&gt; \\__('Upcoming Events', 'myplugin'),\n      'post_content' =&gt; '[event_list number=\"10\" scope=\"future\"]',\n    ]);\n  }\n\n  \/\/ ...\n}\n<\/code><\/pre>\n<p>Vervolgens maken we de pagina <b>Event Calendar <\/b>voor <code>v1.2<\/code> (in dit geval gebruiken we <a href=\"https:\/\/kinsta.com\/nl\/blog\/gutenberg-blokken\/\">Gutenberg blokken<\/a> op de pagina en voegen we een custom blok toe met de naam <code>event-calendar<\/code>):<\/p>\n<pre><code class=\"language-php\">class Plugin {\n  \n  \/\/ ...\n\n  protected function installPluginSetupDataForVersion1Dot2(): void\n  {\n    \\wp_insert_post([\n      'post_status' =&gt; 'publish',\n      'post_type' =&gt; 'page',\n      'post_title' =&gt; \\__('Events Calendar', 'myplugin'),\n      'post_content' =&gt; serialize_blocks([\n        [\n          'blockName' =&gt; 'myplugin\/event-calendar',\n          'attrs' =&gt; [\n            'status' =&gt; 'publish',\n          ],\n          'innerContent' =&gt; [],\n        ],\n      ]),\n    ]);\n  }\n}\n<\/code><\/pre>\n<h2>Alle code bij elkaar<\/h2>\n<p>We zijn klaar! De <a href=\"https:\/\/github.com\/GatoGraphQL\/GatoGraphQL\/blob\/9af936db31ac95456502fdd805a4b5658340e3ea\/layers\/GatoGraphQLForWP\/plugins\/gatographql\/src\/Plugin.php#L255\" target=\"_blank\" rel=\"noopener noreferrer\">hele PHP code voor de klasse <code>Plugin<\/code><\/a>, die de logica bevat om de pluginversie bij te houden en de juiste gegevens te installeren, is de volgende:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nclass Plugin {\n\n  public function __construct(\n    protected string $pluginVersion,\n  ) {\n  }\n\n  public function setup(): void\n  {\n    if (!is_admin()) {\n      return;\n    }\n\n    $this-&gt;managePluginDataVersioning();\n  }\n\n  \/**\n   * If the plugin has just been newly-installed + activated\n   * or updated, install the appropriate data.\n   *\/\n  protected function managePluginDataVersioning(): void\n  {\n    $myPluginVersionOptionName = 'myplugin_version';\n    $storedPluginVersion = get_option($myPluginVersionOptionName, null);\n\n    \/\/ Check if the main plugin has been activated or updated\n    $isPluginJustFirstTimeActivated = $storedPluginVersion === null;\n    $isPluginJustUpdated = !$isPluginJustFirstTimeActivated && $storedPluginVersion !== $this-&gt;pluginVersion;\n\n    \/\/ If there were no changes, nothing to do\n    if (!$isPluginJustFirstTimeActivated && !$isPluginJustUpdated) {\n      return;\n    }\n\n    \\add_action(\n      'init',\n      function () use ($myPluginVersionOptionName, $storedPluginVersion): void {\n        $this-&gt;prepareAndInstallPluginSetupData($storedPluginVersion);\n\n        \/\/ Update on the DB\n        update_option($myPluginVersionOptionName, $this-&gt;pluginVersion);\n      }\n    );\n  }\n\n  \/**\n   * Use a transient to make sure that only one instance\n   * will install the data. Otherwise, two requests\n   * happening simultaneously might both execute\n   * this logic\n   *\/\n  protected function prepareAndInstallPluginSetupData(?string $previousVersion): void\n  {\n    $transientName = 'myplugin_installing_plugin_setup_data';\n    $transient = \\get_transient($transientName);\n    if ($transient !== false) {\n      \/\/ Another instance is executing this code right now\n      return;\n    }\n\n    \\set_transient($transientName, true, 30);\n    $this-&gt;installPluginSetupData($previousVersion);\n    \\delete_transient($transientName);\n  }\n\n  \/**\n   * Provide the installation in stages, version by version, to\n   * be able to execute it both when installing\/activating the plugin,\n   * or updating it to a new version with setup data.\n   *\n   * The plugin's setup data will be installed if:\n   *\n   * - $previousVersion = null =&gt; Activating the plugin for first time\n   * - $previousVersion &lt; someVersion =&gt; Updating to a new version that has data to install\n   *\/\n  protected function installPluginSetupData(?string $previousVersion): void\n  {\n    $versionCallbacks = [\n      '1.1' =&gt; $this-&gt;installPluginSetupDataForVersion1Dot1(...),\n      '1.2' =&gt; $this-&gt;installPluginSetupDataForVersion1Dot2(...),\n      \/\/ ... Add more versions\n    ];\n    foreach ($versionCallbacks as $version =&gt; $callback) {\n      \/**\n       * If the previous version is provided, check if the corresponding update\n       * has already been performed, then skip\n       *\/\n      if ($previousVersion !== null && version_compare($previousVersion, $version, '&gt;=')) {\n        continue;\n      }\n      $callback();\n    }\n  }\n\n  protected function installPluginSetupDataForVersion1Dot1(): void\n  {\n    \\wp_insert_post([\n      'post_status' =&gt; 'publish',\n      'post_type' =&gt; 'page',\n      'post_title' =&gt; \\__('Upcoming Events', 'myplugin'),\n      'post_content' =&gt; '[event_list number=\"10\" scope=\"future\" status=\"publish\"]',\n    ]);\n  }\n\n  protected function installPluginSetupDataForVersion1Dot2(): void\n  {\n    \\wp_insert_post([\n      'post_status' =&gt; 'publish',\n      'post_type' =&gt; 'page',\n      'post_title' =&gt; \\__('Events Calendar', 'myplugin'),\n      'post_content' =&gt; serialize_blocks([\n        [\n          'blockName' =&gt; 'myplugin\/event-calendar',\n          'attrs' =&gt; [\n            'status' =&gt; 'publish',\n          ],\n          'innerContent' =&gt; [],\n        ],\n      ]),\n    ]);\n  }\n}\n<\/code><\/pre>\n<h2>Samenvatting<\/h2>\n<p>WordPress plugins moeten vaak gegevens installeren bij de installatie. Als nieuwere versies van de plugin nieuwe features bieden, kan het bovendien nodig zijn dat de plugin gegevens installeert bij updates.<\/p>\n<p>In dit artikel hebben we geleerd hoe we versies kunnen bijhouden en de juiste gegevens voor onze plugins kunnen installeren.<\/p>\n<p><em>Heb jij een WordPress plugin die baat kan hebben bij het installeren van gegevens? Laat het ons weten in de comments.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bij het ontwikkelen van een WordPress plugin is een cruciale stap het vooraf installeren van essenti\u00eble gegevens, zodat de plugin vanaf het begin soepel werkt. Neem &#8230;<\/p>\n","protected":false},"author":196,"featured_media":58805,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[865,899],"class_list":["post-58804","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-php-functie","topic-wordpress-plugins"],"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>Zo installeer je setupgegevens voor een WordPress plugin - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Deze handleiding legt uit hoe je gegevens installeert in WordPress plugins, en nieuwe gegevens blijft toevoegen met verdere updates.\" \/>\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\/setupgegevens-voor-wordpress-plugin\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zo installeer je setupgegevens voor een WordPress plugin\" \/>\n<meta property=\"og:description\" content=\"Deze handleiding legt uit hoe je gegevens installeert in WordPress plugins, en nieuwe gegevens blijft toevoegen met verdere updates.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/\" \/>\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=\"2024-04-12T20:25:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-19T08:38:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Leonardo Losoviz\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Deze handleiding legt uit hoe je gegevens installeert in WordPress plugins, en nieuwe gegevens blijft toevoegen met verdere updates.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin-1024x512.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@losoviz\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Leonardo Losoviz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/\"},\"author\":{\"name\":\"Leonardo Losoviz\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238\"},\"headline\":\"Zo installeer je setupgegevens voor een WordPress plugin\",\"datePublished\":\"2024-04-12T20:25:39+00:00\",\"dateModified\":\"2024-04-19T08:38:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/\"},\"wordCount\":1495,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/\",\"url\":\"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/\",\"name\":\"Zo installeer je setupgegevens voor een WordPress plugin - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"datePublished\":\"2024-04-12T20:25:39+00:00\",\"dateModified\":\"2024-04-19T08:38:32+00:00\",\"description\":\"Deze handleiding legt uit hoe je gegevens installeert in WordPress plugins, en nieuwe gegevens blijft toevoegen met verdere updates.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/nl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WordPress plugins\",\"item\":\"https:\/\/kinsta.com\/nl\/onderwerpen\/wordpress-plugins\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Zo installeer je setupgegevens voor een WordPress plugin\"}]},{\"@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\/c382de1885cc21b079ec1e71d7faf238\",\"name\":\"Leonardo Losoviz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b28085726ee66e49f08be16ad668efd5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b28085726ee66e49f08be16ad668efd5?s=96&d=mm&r=g\",\"caption\":\"Leonardo Losoviz\"},\"description\":\"Leo writes about innovative web development trends, mostly concerning PHP, WordPress and GraphQL. You can find him at leoloso.com and twitter.com\/losoviz.\",\"sameAs\":[\"https:\/\/leoloso.com\",\"https:\/\/x.com\/losoviz\",\"https:\/\/www.youtube.com\/@GatoGraphQL\"],\"url\":\"https:\/\/kinsta.com\/nl\/blog\/author\/leonardolosoviz\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Zo installeer je setupgegevens voor een WordPress plugin - Kinsta\u00ae","description":"Deze handleiding legt uit hoe je gegevens installeert in WordPress plugins, en nieuwe gegevens blijft toevoegen met verdere updates.","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\/setupgegevens-voor-wordpress-plugin\/","og_locale":"nl_NL","og_type":"article","og_title":"Zo installeer je setupgegevens voor een WordPress plugin","og_description":"Deze handleiding legt uit hoe je gegevens installeert in WordPress plugins, en nieuwe gegevens blijft toevoegen met verdere updates.","og_url":"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","article_published_time":"2024-04-12T20:25:39+00:00","article_modified_time":"2024-04-19T08:38:32+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","type":"image\/jpeg"}],"author":"Leonardo Losoviz","twitter_card":"summary_large_image","twitter_description":"Deze handleiding legt uit hoe je gegevens installeert in WordPress plugins, en nieuwe gegevens blijft toevoegen met verdere updates.","twitter_image":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin-1024x512.jpg","twitter_creator":"@losoviz","twitter_site":"@Kinsta_NL","twitter_misc":{"Geschreven door":"Leonardo Losoviz","Geschatte leestijd":"12 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/"},"author":{"name":"Leonardo Losoviz","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238"},"headline":"Zo installeer je setupgegevens voor een WordPress plugin","datePublished":"2024-04-12T20:25:39+00:00","dateModified":"2024-04-19T08:38:32+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/"},"wordCount":1495,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","inLanguage":"nl-NL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/","url":"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/","name":"Zo installeer je setupgegevens voor een WordPress plugin - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","datePublished":"2024-04-12T20:25:39+00:00","dateModified":"2024-04-19T08:38:32+00:00","description":"Deze handleiding legt uit hoe je gegevens installeert in WordPress plugins, en nieuwe gegevens blijft toevoegen met verdere updates.","breadcrumb":{"@id":"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#primaryimage","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/nl\/blog\/setupgegevens-voor-wordpress-plugin\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/nl\/"},{"@type":"ListItem","position":2,"name":"WordPress plugins","item":"https:\/\/kinsta.com\/nl\/onderwerpen\/wordpress-plugins\/"},{"@type":"ListItem","position":3,"name":"Zo installeer je setupgegevens voor een WordPress plugin"}]},{"@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\/c382de1885cc21b079ec1e71d7faf238","name":"Leonardo Losoviz","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/b28085726ee66e49f08be16ad668efd5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b28085726ee66e49f08be16ad668efd5?s=96&d=mm&r=g","caption":"Leonardo Losoviz"},"description":"Leo writes about innovative web development trends, mostly concerning PHP, WordPress and GraphQL. You can find him at leoloso.com and twitter.com\/losoviz.","sameAs":["https:\/\/leoloso.com","https:\/\/x.com\/losoviz","https:\/\/www.youtube.com\/@GatoGraphQL"],"url":"https:\/\/kinsta.com\/nl\/blog\/author\/leonardolosoviz\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/58804","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\/196"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/comments?post=58804"}],"version-history":[{"count":8,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/58804\/revisions"}],"predecessor-version":[{"id":59117,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/58804\/revisions\/59117"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/58804\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/58804\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/58804\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/58804\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/58804\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/58804\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/58804\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/58804\/translations\/jp"},{"href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/58804\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media\/58805"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media?parent=58804"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/tags?post=58804"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/topic?post=58804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}