{"id":69427,"date":"2024-03-12T18:51:35","date_gmt":"2024-03-12T17:51:35","guid":{"rendered":"https:\/\/kinsta.com\/de\/?p=69427&#038;preview=true&#038;preview_id=69427"},"modified":"2024-03-18T09:48:21","modified_gmt":"2024-03-18T08:48:21","slug":"wordpress-plugin-einrichtungsdaten","status":"publish","type":"post","link":"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/","title":{"rendered":"Installation der Setup-Daten f\u00fcr ein WordPress-Plugin"},"content":{"rendered":"<p>Bei der Entwicklung eines <a href=\"https:\/\/kinsta.com\/de\/thema\/wordpress-plugins\/\">WordPress-Plugins<\/a> ist ein wichtiger Schritt die Vorinstallation wichtiger Daten, damit das Plugin von Anfang an reibungslos funktioniert. Nehmen wir zum Beispiel ein Plugin f\u00fcr einen Veranstaltungsmanager. Bei der Installation ist es von gro\u00dfem Vorteil, wenn das Plugin automatisch eine Seite mit dem Titel <strong>Kommende Veranstaltungen<\/strong>\u00a0erstellt, auf der eine Liste zuk\u00fcnftiger Veranstaltungen angezeigt wird.<\/p>\n<p>Diese vorkonfigurierte Seite, die mit einem Shortcode wie <code>[event_list number=\"10\" scope=\"future\" status=\"publish\"]<\/code> eingebettet ist, erm\u00f6glicht es den Nutzern, die Funktionen des Plugins sofort zu nutzen, ohne die Dokumentation lesen zu m\u00fcssen.<\/p>\n<p>Die Installation von Daten ist nicht nur bei der Erstinstallation des Plugins hilfreich, sondern auch bei sp\u00e4teren Aktualisierungen. Wenn z. B. mit einem Update eine neue Funktion f\u00fcr die Kalenderansicht eingef\u00fchrt wird, kann das Plugin automatisch eine neue Seite <strong>Veranstaltungskalender<\/strong>\u00a0erstellen, auf der diese Neuerung mit einem Shortcode wie <code>[event_calendar status=\"publish\"]<\/code> vorgestellt wird.<\/p>\n<p>Generell deckt der Umfang der Dateninstallation verschiedene Bed\u00fcrfnisse ab:<\/p>\n<ul>\n<li>Das Erstellen neuer Seiten mit bestimmten Titeln und Inhalten.<\/li>\n<li>Hinzuf\u00fcgen von Eintr\u00e4gen f\u00fcr benutzerdefinierte Beitragstypen (CPTs), die mit dem Plugin erstellt wurden.<\/li>\n<li>Einf\u00fcgen von Standardeinstellungen in die Tabelle <code>wp_options<\/code><\/li>\n<li>Zuweisen von neuen F\u00e4higkeiten zu Benutzerrollen<\/li>\n<li>Zuweisen von Metadaten zu Nutzern f\u00fcr neue oder aktualisierte Funktionen des Plugins (z. B. k\u00f6nnen Nutzer das Format des Veranstaltungsdatums \u00e4ndern, und es wird zun\u00e4chst ein Standardwert f\u00fcr alle Nutzer hinzugef\u00fcgt)<\/li>\n<li>Erstellen von Kategorien, die im Kontext des Plugins h\u00e4ufig verwendet werden, wie z. B. &#8222;Konferenzen&#8220; oder &#8222;Sport&#8220;<\/li>\n<\/ul>\n<p>Die Installation der Daten muss schrittweise erfolgen, da wir sonst doppelte Eintr\u00e4ge erstellen k\u00f6nnten.<\/p>\n<p>Wenn z. B. ein Plugin der Version 1.1 eine Seite <strong>Aktuelle Veranstaltungen<\/strong>\u00a0einf\u00fchrt und ein Nutzer ein Update von Version 1.0 vornimmt, sollten nur die neuen Daten installiert werden, die f\u00fcr Version 1.1 relevant sind. Diese schrittweise Aktualisierung stellt sicher, dass bei der Version 1.2 mit der Kalenderfunktion nur die neue Seite\u00a0<strong>Veranstaltungskalender<\/strong> hinzugef\u00fcgt wird und die Seite <strong>Bevorstehende<\/strong> <strong>Veranstaltungen<\/strong>\u00a0nicht doppelt vorhanden ist.<\/p>\n<p>Wenn das Plugin aktualisiert wird, muss es also herausfinden, welche Vorg\u00e4ngerversion installiert war, und nur die Daten installieren, die der neuen Version\/den neuen Versionen entsprechen.<\/p>\n<p>In diesem Artikel wird erkl\u00e4rt, wie wir in unseren WordPress-Plugins die urspr\u00fcnglichen Daten installieren und bei weiteren Updates neue Daten hinzuf\u00fcgen.<\/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>Die aktuelle Version bereitstellen<\/h2>\n<p>Um den inkrementellen Prozess zu bew\u00e4ltigen, muss das Plugin seine aktuelle Version erkenneninstag, die normalerweise im <a href=\"https:\/\/developer.wordpress.org\/plugins\/plugin-basics\/header-requirements\/#header-fields\" target=\"_blank\" rel=\"noopener noreferrer\">Header der Hauptdatei des Plugins<\/a>\u00a0angegeben wird. Aber nat\u00fcrlich k\u00f6nnen wir sie dort nicht direkt referenzieren, da sie in einem <a href=\"https:\/\/kinsta.com\/de\/blog\/was-ist-php\/\">PHP-Kommentar<\/a> steht. Deshalb definieren wir diesen Wert auch in einer Variablen und \u00fcbergeben ihn an eine <code>Plugin<\/code> Klasse, die f\u00fcr die Initialisierung und Konfiguration zust\u00e4ndig ist:<\/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>Die Klasse <code>Plugin<\/code> nutzt die <a href=\"https:\/\/kinsta.com\/de\/blog\/php-8\/#constructor-property-promotion\">Eigenschaft Constructor Promotion von PHP 8.0<\/a> und speichert diese Version, damit wir sie sp\u00e4ter referenzieren k\u00f6nnen:<\/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>Beachte, dass die Logik zur Initialisierung und Konfiguration des Plugins in der Methode <code>setup<\/code> und nicht im Konstruktor enthalten ist. Das liegt daran, dass der Konstruktor keine Seiteneffekte erzeugen darf; andernfalls k\u00f6nnte es zu Fehlern kommen, wenn wir die Klasse <code>Plugin<\/code> erweitern oder zusammenstellen.<\/p>\n<p>Schauen wir uns an, wie das passieren k\u00f6nnte. Nehmen wir an, wir f\u00fcgen irgendwann eine Klasse <code>BetterPlugin<\/code> hinzu, die die Funktionen der Klasse <code>Plugin<\/code> zusammenfasst:<\/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>Jedes Mal, wenn <code>new Plugin()<\/code> innerhalb von <code>printSomething<\/code> ausgef\u00fchrt wird, wird eine neue Instanz von <code>Plugin<\/code> erstellt. Wenn die Konfigurationslogik zum Konstruktor hinzugef\u00fcgt w\u00fcrde, w\u00fcrde sie jedes Mal ausgef\u00fchrt, wenn wir ein neues <code>Plugin<\/code> Objekt erstellen. In unserem Fall wollen wir die Seite mit den <strong>bevorstehenden Veranstaltungen<\/strong> nur einmal erstellen, nicht mehrmals. Wenn wir die Logik in die Methode <code>setup<\/code> einbauen, k\u00f6nnen wir dieses Problem vermeiden.<\/p>\n<h2>R\u00fcckverfolgung der vorherigen Version<\/h2>\n<p>WordPress bietet keine bequeme M\u00f6glichkeit, die Version des zu ersetzenden Plugins abzurufen. Daher m\u00fcssen wir diesen Wert selbst in der Tabelle <code>wp_options<\/code> in der <a href=\"https:\/\/kinsta.com\/database\/\">Datenbank<\/a> speichern.<\/p>\n<p>Speichere die Version unter dem Eintrag <code>\"myplugin_version\"<\/code>, wobei <code>myplugin_<\/code> der Name des Plugins ist (z.B. <code>eventsmanager_version<\/code>). Es ist wichtig, dass wir allen unseren Einstellungen immer <code>myplugin_<\/code> voranstellen, um m\u00f6gliche Konflikte zu vermeiden, da wir nicht sicher sein k\u00f6nnen, dass ein anderes Plugin nicht eine <code>version<\/code> Option hinzuf\u00fcgt.<\/p>\n<p>Wenn das Plugin bei jeder Anfrage geladen wird, kennt <code>Plugin<\/code> bereits die aktuelle Version (aus der Eigenschaft <code>$pluginVersion<\/code> ) und ruft die zuletzt gespeicherte Version aus der Datenbank ab. Dieser Vergleich bestimmt den Status des Plugins:<\/p>\n<ul>\n<li><strong>Neuinstallation:<\/strong> Erkennt, ob in der Datenbank ein Versionseintrag f\u00fcr das Plugin fehlt, was auf eine erstmalige Einrichtung hinweist (d.h. <code>$storedPluginVersion<\/code> ist <code>null<\/code>)<\/li>\n<li><strong>Aktualisierung:<\/strong> Wird erkannt, wenn die aktuelle Version die in der Datenbank gespeicherte Version \u00fcbersteigt, was auf einen Aktualisierungsbedarf hinweist.<\/li>\n<li>Ansonsten gibt es keine \u00c4nderung<\/li>\n<\/ul>\n<p>Bei jeder \u00c4nderung rufen wir <code>prepareAndInstallPluginSetupData<\/code> auf, um die entsprechenden Daten zu installieren, egal ob es sich um eine Neuinstallation (in diesem Fall m\u00fcssen alle Daten f\u00fcr alle Versionen installiert werden) oder eine Aktualisierung (nur die Daten f\u00fcr alle neuen Versionen werden installiert) handelt. Die Variable <code>$previousVersion<\/code>, die gel\u00f6scht werden kann, zeigt an, um welche Situation es sich handelt (<code>$previousVersion<\/code> ist <code>null<\/code> =&gt; Neuinstallation).<\/p>\n<p>Nach dem Aufruf dieser Methode m\u00fcssen wir auch die aktuelle Plugin-Version in der Datenbank speichern, damit sie zur neuen &#8222;zuletzt gespeicherten&#8220; Version wird. Dies muss nach dem Aufruf von <code>prepareAndInstallPluginSetupData<\/code> geschehen, damit im Falle eines Fehlers (z. B. <code>RuntimeException<\/code>) und einer nicht erfolgten Installation der Daten die vorherige Version in der Datenbank gespeichert bleibt und bei der n\u00e4chsten Anfrage ein neuer Installationsversuch unternommen wird.<\/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>Beachte, dass <code>prepareAndInstallPluginSetupData<\/code> (und die anschlie\u00dfende DB-Aktualisierung) \u00fcber den <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-hooks\/\">Aktionshaken <code>init<\/code><\/a> ausgef\u00fchrt wird. Damit soll sichergestellt werden, dass alle Daten aus dem CMS abrufbar und bearbeitbar sind.<\/p>\n<p>Vor allem auf <a href=\"https:\/\/kinsta.com\/de\/blog\/was-ist-eine-taxonomie\/\">Taxonomien<\/a> (Tags und Kategorien) <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_taxonomy\/#description\" target=\"_blank\" rel=\"noopener noreferrer\">kann vor dem <code>init<\/code> Hook nicht zugegriffen werden<\/a>. Wenn bei der Installation des Plugins ein CPT-Eintrag erstellt und ihm eine benutzerdefinierte Kategorie zugewiesen werden muss, kann dieser Vorgang erst ab dem <code>init<\/code> -Hook ausgef\u00fchrt werden.<\/p>\n<p>Bei jeder Anfrage auf die letzte gespeicherte Version in der DB zuzugreifen, ist aus Sicht der <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-datenbank-optimierung\/\">Leistung<\/a> nicht ideal. Um dies zu verbessern, kannst du alle Optionen, die das Plugin ben\u00f6tigt, in einem Array zusammenfassen, sie in einem einzigen Eintrag speichern und dann mit einem einzigen Aufruf der DB darauf zugreifen.<\/p>\n<p>Wenn das Plugin z. B. auch die Option <code>myplugin_date_format<\/code> zur Anzeige des Veranstaltungsdatums speichern muss, k\u00f6nnen wir einen einzigen Eintrag <code>myplugin_options<\/code> mit den Eigenschaften <code>version<\/code> und <code>date_format<\/code> erstellen.<\/p>\n<p>Um auf die zuletzt gespeicherte Version zuzugreifen, muss der PHP-Code dann wie folgt angepasst werden:<\/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>Vermeidung von gleichzeitigen Anfragen bei der Installation von doppelten Daten<\/h2>\n<p>Es besteht die M\u00f6glichkeit, dass der Installationsprozess mehr als einmal ausgel\u00f6st wird, wenn zwei oder mehr Nutzer\/innen genau zur gleichen Zeit auf den <a href=\"https:\/\/kinsta.com\/de\/blog\/wordpress-admin\/\">wp-admin<\/a> zugreifen. Um zu verhindern, dass dieselben Daten zweimal oder \u00f6fter installiert werden, verwenden wir einen <a href=\"https:\/\/developer.wordpress.org\/apis\/transients\/\" target=\"_blank\" rel=\"noopener noreferrer\">Transient<\/a> als Flag, um nur die erste Anfrage zur Installation von Daten zuzulassen:<\/p>\n<ul>\n<li>Pr\u00fcfe, ob der Transient <code>myplugin_installing_plugin_setup_data<\/code> existiert (auch hier muss dem Namen <code>myplugin_<\/code> vorangestellt werden); wenn ja, tue nichts (da ein anderer Prozess die Daten installiert)<\/li>\n<li>Andernfalls speichere den Transient in der Datenbank f\u00fcr eine angemessene Zeitspanne, um die Daten zu installieren (z. B. 30 Sekunden)<\/li>\n<li>Installiere die Daten<\/li>\n<li>L\u00f6sche die Transiente<\/li>\n<\/ul>\n<p>Hier ist der 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>Installation der Daten f\u00fcr alle Versionen<\/h2>\n<p>Wie bereits erw\u00e4hnt, m\u00fcssen wir beim Aktualisieren des Plugins nur die Daten f\u00fcr die neuen Versionen installieren, nicht f\u00fcr alle. Das bedeutet, dass wir verwalten m\u00fcssen, welche Daten wir Version f\u00fcr Version installieren.<\/p>\n<p>Im folgenden Code gibt das Array <code>$versionCallbacks<\/code> an, welche Funktion f\u00fcr jede Version ausgef\u00fchrt werden soll, wobei die Funktion die Logik zur Installation der Daten ausf\u00fchrt. Wir durchlaufen die Liste aller Versionen, vergleichen jede mit der vorherigen Version unter <code>version_compare<\/code> und f\u00fchren, wenn sie gr\u00f6\u00dfer ist, die entsprechende Funktion aus, um die entsprechenden Daten zu installieren.<\/p>\n<p>Wenn <code>$previousVersion<\/code> gleich <code>null<\/code> ist (d.h. es handelt sich um eine neue Installation), werden alle Funktionen ausgef\u00fchrt.<\/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>Installieren der Daten f\u00fcr jede einzelne Version<\/h2>\n<p>Zum Schluss m\u00fcssen wir f\u00fcr jede Version die eigentlichen Daten installieren (eine Seite, einen CPT-Eintrag erstellen, eine Option hinzuf\u00fcgen usw.).<\/p>\n<p>In diesem Code f\u00fcgen wir die Seite <strong>bevorstehende Veranstaltungen<\/strong> f\u00fcr das Eventmanager-Plugin f\u00fcr <code>v1.1<\/code> hinzu:<\/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>Dann erstellen wir die Seite <strong>Veranstaltungskalender<\/strong> f\u00fcr <code>v1.2<\/code> (in diesem Fall verwenden wir <a href=\"https:\/\/kinsta.com\/de\/blog\/gutenberg-blocke\/\">Gutenberg-Bl\u00f6cke<\/a> auf der Seite und f\u00fcgen einen benutzerdefinierten Block namens <code>event-calendar<\/code> hinzu):<\/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 Codes zusammen<\/h2>\n<p>Wir sind fertig! Der <a href=\"https:\/\/github.com\/GatoGraphQL\/GatoGraphQL\/blob\/9af936db31ac95456502fdd805a4b5658340e3ea\/layers\/GatoGraphQLForWP\/plugins\/gatographql\/src\/Plugin.php#L255\" target=\"_blank\" rel=\"noopener noreferrer\">gesamte PHP-Code f\u00fcr die Klasse <code>Plugin<\/code><\/a>, der die Logik enth\u00e4lt, um die Plugin-Version zu verfolgen und die entsprechenden Daten zu installieren, lautet wie folgt:<\/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>Zusammenfassung<\/h2>\n<p>WordPress-Plugins m\u00fcssen bei der Installation oft Daten installieren. Wenn neuere Versionen des Plugins neue Funktionen bieten, muss das Plugin m\u00f6glicherweise auch Daten installieren, wenn es aktualisiert wird.<\/p>\n<p>In diesem Artikel haben wir gelernt, wie wir Versionen verfolgen und die entsprechenden Daten f\u00fcr unsere Plugins installieren k\u00f6nnen.<\/p>\n<p><em>Hast du ein WordPress-Plugin, das von der Installation von Daten profitieren kann? Lass es uns in den Kommentaren wissen.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bei der Entwicklung eines WordPress-Plugins ist ein wichtiger Schritt die Vorinstallation wichtiger Daten, damit das Plugin von Anfang an reibungslos funktioniert. Nehmen wir zum Beispiel ein &#8230;<\/p>\n","protected":false},"author":196,"featured_media":69428,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[970,1006],"class_list":["post-69427","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-php-funktion","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>Installation von Setup-Daten f\u00fcr ein WordPress-Plugin - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"In diesem Leitfaden wird erkl\u00e4rt, wie du Daten in unseren WordPress-Plugins installieren und mit weiteren Updates neue Daten hinzuf\u00fcgen kannst.\" \/>\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\/de\/blog\/wordpress-plugin-einrichtungsdaten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Installation der Setup-Daten f\u00fcr ein WordPress-Plugin\" \/>\n<meta property=\"og:description\" content=\"In diesem Leitfaden wird erkl\u00e4rt, wie du Daten in unseren WordPress-Plugins installieren und mit weiteren Updates neue Daten hinzuf\u00fcgen kannst.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-12T17:51:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-18T08:48:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/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=\"In diesem Leitfaden wird erkl\u00e4rt, wie du Daten in unseren WordPress-Plugins installieren und mit weiteren Updates neue Daten hinzuf\u00fcgen kannst.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@losoviz\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Leonardo Losoviz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"11\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/\"},\"author\":{\"name\":\"Leonardo Losoviz\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238\"},\"headline\":\"Installation der Setup-Daten f\u00fcr ein WordPress-Plugin\",\"datePublished\":\"2024-03-12T17:51:35+00:00\",\"dateModified\":\"2024-03-18T08:48:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/\"},\"wordCount\":1475,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/\",\"url\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/\",\"name\":\"Installation von Setup-Daten f\u00fcr ein WordPress-Plugin - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"datePublished\":\"2024-03-12T17:51:35+00:00\",\"dateModified\":\"2024-03-18T08:48:21+00:00\",\"description\":\"In diesem Leitfaden wird erkl\u00e4rt, wie du Daten in unseren WordPress-Plugins installieren und mit weiteren Updates neue Daten hinzuf\u00fcgen kannst.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WordPress-Plugins\",\"item\":\"https:\/\/kinsta.com\/de\/thema\/wordpress-plugins\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Installation der Setup-Daten f\u00fcr ein WordPress-Plugin\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/de\/#website\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/de\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\",\"https:\/\/x.com\/Kinsta_DE\",\"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\/de\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238\",\"name\":\"Leonardo Losoviz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/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\/de\/blog\/author\/leonardolosoviz\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Installation von Setup-Daten f\u00fcr ein WordPress-Plugin - Kinsta\u00ae","description":"In diesem Leitfaden wird erkl\u00e4rt, wie du Daten in unseren WordPress-Plugins installieren und mit weiteren Updates neue Daten hinzuf\u00fcgen kannst.","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\/de\/blog\/wordpress-plugin-einrichtungsdaten\/","og_locale":"de_DE","og_type":"article","og_title":"Installation der Setup-Daten f\u00fcr ein WordPress-Plugin","og_description":"In diesem Leitfaden wird erkl\u00e4rt, wie du Daten in unseren WordPress-Plugins installieren und mit weiteren Updates neue Daten hinzuf\u00fcgen kannst.","og_url":"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","article_published_time":"2024-03-12T17:51:35+00:00","article_modified_time":"2024-03-18T08:48:21+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","type":"image\/jpeg"}],"author":"Leonardo Losoviz","twitter_card":"summary_large_image","twitter_description":"In diesem Leitfaden wird erkl\u00e4rt, wie du Daten in unseren WordPress-Plugins installieren und mit weiteren Updates neue Daten hinzuf\u00fcgen kannst.","twitter_image":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","twitter_creator":"@losoviz","twitter_site":"@Kinsta_DE","twitter_misc":{"Verfasst von":"Leonardo Losoviz","Gesch\u00e4tzte Lesezeit":"11\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/"},"author":{"name":"Leonardo Losoviz","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238"},"headline":"Installation der Setup-Daten f\u00fcr ein WordPress-Plugin","datePublished":"2024-03-12T17:51:35+00:00","dateModified":"2024-03-18T08:48:21+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/"},"wordCount":1475,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/","url":"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/","name":"Installation von Setup-Daten f\u00fcr ein WordPress-Plugin - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","datePublished":"2024-03-12T17:51:35+00:00","dateModified":"2024-03-18T08:48:21+00:00","description":"In diesem Leitfaden wird erkl\u00e4rt, wie du Daten in unseren WordPress-Plugins installieren und mit weiteren Updates neue Daten hinzuf\u00fcgen kannst.","breadcrumb":{"@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#primaryimage","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2024\/03\/wp-installing-setup-data-for-a-wordpress-plugin.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/de\/blog\/wordpress-plugin-einrichtungsdaten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/de\/"},{"@type":"ListItem","position":2,"name":"WordPress-Plugins","item":"https:\/\/kinsta.com\/de\/thema\/wordpress-plugins\/"},{"@type":"ListItem","position":3,"name":"Installation der Setup-Daten f\u00fcr ein WordPress-Plugin"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/de\/#website","url":"https:\/\/kinsta.com\/de\/","name":"Kinsta\u00ae","description":"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen","publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/de\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","https:\/\/x.com\/Kinsta_DE","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\/de\/#\/schema\/person\/c382de1885cc21b079ec1e71d7faf238","name":"Leonardo Losoviz","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/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\/de\/blog\/author\/leonardolosoviz\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/69427","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/users\/196"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/comments?post=69427"}],"version-history":[{"count":10,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/69427\/revisions"}],"predecessor-version":[{"id":69513,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/69427\/revisions\/69513"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/69427\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/69427\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/69427\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/69427\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/69427\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/69427\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/69427\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/69427\/translations\/jp"},{"href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/69427\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media\/69428"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media?parent=69427"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/tags?post=69427"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/topic?post=69427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}