{"id":16431,"date":"2026-02-23T01:17:22","date_gmt":"2026-02-23T00:17:22","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=16431"},"modified":"2026-02-23T03:44:15","modified_gmt":"2026-02-23T02:44:15","slug":"eigenes-wp-widget","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/eigenes-wp-widget\/","title":{"rendered":"Eigenes WordPress Widget in nur ~30 Zeilen erstellen"},"content":{"rendered":"<p>Es ist in WordPress recht einfach, eigene Inhalte in Form von Widgets einzubinden. Der Beitrag zeigt ein simples Beispiel mit ~30 Codezeilen. Dar\u00fcber hinaus gehen wir auf erweiterte Themen wie das definieren von Einstellungen f\u00fcr die Admin-Oberfl\u00e4che von WP ein. Au\u00dferdem einige \u00dcberlegungen aus eigener Erfahrung, die man sich vor dem produktiven Einbau stellen sollte &#8211; um Probleme zu verhindern, die nicht jeder direkt als absehbar erachtet.<\/p>\n<h2 class=\"wp-block-heading\">Einfaches Widget erstellen<\/h2>\n<p>Um eigene Widgets zu entwickeln, stellt WordPress die Basisklasse <code class=\"\" data-line=\"\">WP_Widget<\/code> bereit.<sup data-fn=\"fc184e6b-27b1-40a6-8b8e-e84038287b84\" class=\"fn\"><a href=\"#fc184e6b-27b1-40a6-8b8e-e84038287b84\" id=\"fc184e6b-27b1-40a6-8b8e-e84038287b84-link\">1<\/a><\/sup> Sie standardisiert den Aufbau durch das Vererben mehrere Methoden:<\/p>\n<ul class=\"wp-block-list\">\n<li>Der Konstruktor registriert das Widget mit Name, ID und Beschreibung<\/li>\n<li><code class=\"\" data-line=\"\">widget()<\/code> wird aufgerufen, um den Inhalt f\u00fcr den Nutzer zu rendern<\/li>\n<li><code class=\"\" data-line=\"\">form()<\/code> rendert die verf\u00fcgbaren Einstellungen f\u00fcr den Admin-Bereich<\/li>\n<li><code class=\"\" data-line=\"\">update()<\/code> bietet die M\u00f6glichkeit, neue Einstellungen vor dem Speichern anzupassen<\/li>\n<\/ul>\n<p>Grunds\u00e4tzlich lassen sich Widgets an zwei Stellen registrieren: Entweder als Teil des Designs, dann landet der Code in dessen <code class=\"\" data-line=\"\">functions.php<\/code>. Oder zur besseren \u00dcbersicht in einer PHP-Datei, welche dort geladen wird. Das macht Sinn, wenn es sich um einen Teil dieses Themes handelt. <\/p>\n<p>M\u00f6chte man unabh\u00e4ngig davon ein eigenes Widget nachr\u00fcsten, wird es als Erweiterung (Plugin) bereitgestellt. Hier sind zwei Besonderheiten zu beachten: Es muss mindestens ein Kommentar mit &#8222;Plugin Name:&#8220; gefolgt von einer frei w\u00e4hlbaren Bezeichnung angegeben werden. Au\u00dferdem ist die einmalige Aktivierung unter den Plugins erforderlich &#8211; ansonsten fehlt es schlicht in der Liste verf\u00fcgbarer Widgets.<\/p>\n<p>Folgendes Beispiel zeigt ein minimalistisches Widget, welches lediglich eine \u00dcberschrift mit einem Mustertext ausgibt. Es verf\u00fcgt \u00fcber keinerlei Einstellungen &amp; demonstriert den Aufbau in 31 Zeilen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\" data-line=\"\">&lt;?php\n\/**\n * Plugin Name: U-News Widget\n *\/\nclass UNews_Widget extends WP_Widget {\n    public function __construct() {\n        parent::__construct(\n            &#039;unews_widget&#039;,\n            &#039;U-News Widget&#039;,\n            array(&#039;description&#039; =&gt; &#039;Zeigt U-News Nachrichten an&#039;)\n        );\n    }\n    public function widget($args, $settings) {\n        echo $args[&#039;before_widget&#039;];\n        ?&gt;\n            &lt;h4 class=&quot;widget-title&quot;&gt;Neuste Nachrichten (U-News)&lt;\/h4&gt;\n            &lt;p&gt;Dummy-Inhalt&lt;\/p&gt;\n        &lt;?php\n        echo $args[&#039;after_widget&#039;];\n    }\n    public function form($settings) {\n        echo &#039;&lt;p&gt;Kein Einstellungsfeld verf\u00fcgbar.&lt;\/p&gt;&#039;;\n    }\n    public function update($new_settings, $old_settings) {\n        return $new_settings;\n    }\n}\n\nadd_action(&#039;widgets_init&#039;, function() {\n    register_widget(&#039;UNews_Widget&#039;);\n});<\/code><\/pre>\n<p>Dies kann man sp\u00e4ter um die gew\u00fcnschte Funktionalit\u00e4t erweitern. Da es sich um PHP-Code handelt, steht nahezu grenzenlose Freiheit zur Verf\u00fcgung: Inhalte aus Datenbanken laden, Anfragen an APIs, usw.<\/p>\n<h2 class=\"wp-block-heading\">Widget aktivieren &amp; testen<\/h2>\n<ol class=\"wp-block-list\">\n<li>Unter <code class=\"\" data-line=\"\">wp-content\/plugins<\/code> einen einzigartigen Unterordner anlegen, der obigen Code in einer PHP-Datei enth\u00e4lt. WP l\u00e4dt automatisch alle .php Dateien darin. Die Benennung ist daher frei w\u00e4hlbar. Um Konflikte zu vermeiden, empfehlen sich Projektnamen, ggf. sogar mit einem eigenen Pr\u00e4fix.<\/li>\n<li>Im Adminbereich unter <em>Plugins<\/em> die Erweiterung (hier <strong>U-News Widget<\/strong>) aktivieren<\/li>\n<li>Unter <em>Design > Widgets<\/em> kann man nun nach dem Name (zweiter Parameter im Konstruktor) suchen und das Widget in die Sidebar ziehen:<\/li>\n<\/ol>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_18-36.avif\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"226\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_18-36-1024x226.avif\" alt=\"\" class=\"wp-image-16440\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_18-36-1024x226.avif 1024w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_18-36-300x66.avif 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_18-36-768x169.avif 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_18-36-640x141.avif 640w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_18-36-771x170.avif 771w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_18-36.avif 1274w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<p>Nach dem Speichern erscheint das Widget im gew\u00e4hlten Bereich &#8211; hier etwa in der Sidebar auf der Startseite:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_18-41.avif\"><img loading=\"lazy\" decoding=\"async\" width=\"569\" height=\"145\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_18-41.avif\" alt=\"\" class=\"wp-image-16443\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_18-41.avif 569w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_18-41-300x76.avif 300w\" sizes=\"auto, (max-width: 569px) 100vw, 569px\" \/><\/a><\/figure>\n<\/div>\n<h2 class=\"wp-block-heading\">Eigene Einstellungen hinzuf\u00fcgen<\/h2>\n<p>M\u00f6chte man bestimmte Dinge abseits des Codes f\u00fcr WP-Nutzer anpassbar gestalten, kann dies in der <code class=\"\" data-line=\"\">form<\/code> Methode umgesetzt werden. S\u00e4mtliches dort ausgegebenes HTML wird beim Klick auf das Widget im Admin-Bereich angezeigt. Dies l\u00e4sst sich bereits mit dem einfachen Beispiel von oben Demonstrieren: Es zeigt hier lediglich einen Platzhalter mit der Info, dass keine Einstellungen zur Verf\u00fcgung stehen.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_23-07.avif\"><img loading=\"lazy\" decoding=\"async\" width=\"679\" height=\"213\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_23-07.avif\" alt=\"\" class=\"wp-image-16451\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_23-07.avif 679w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_23-07-300x94.avif 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_23-07-640x201.avif 640w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-22_23-07-542x170.avif 542w\" sizes=\"auto, (max-width: 679px) 100vw, 679px\" \/><\/a><\/figure>\n<\/div>\n<p>Hier steht vollwertiges HTML zur Verf\u00fcgung. Sinnvoll ist f\u00fcr mein Widget der Nachrichten von U-News eine Begrenzung der maximalen Anzahl. Daf\u00fcr erzeugen wir in form ein Feld. Die Hilfsfunktionen <code class=\"\" data-line=\"\">get_field_id<\/code> und <code class=\"\" data-line=\"\">get_field_name<\/code> aus der Basisklasse nehmen uns Arbeit ab. WP setzt die Felder automatisch in einem Array nach dem Plugin- bzw. Widget-Name, um Konflikte mit anderen zu vermeiden.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\" data-line=\"\">public function form($settings) {\n    ?&gt;\n        &lt;p&gt;\n            &lt;label for=&quot;&lt;?=$this-&gt;get_field_id( &#039;max_news_count&#039; )?&gt;&quot;&gt;\n                &lt;?php _e( &#039;Maximale Anzahl an Nachrichten&#039; ); ?&gt;\n            &lt;\/label&gt;\n            &lt;input id=&quot;&lt;?=$this-&gt;get_field_id( &#039;max_news_count&#039; )?&gt;&quot; name=&quot;&lt;?=$this-&gt;get_field_name( &#039;max_news_count&#039; )?&gt;&quot; \n                value=&quot;&lt;?=esc_attr( $settings[&#039;max_news_count&#039;] )?&gt;&quot; type=&quot;text&quot;&gt;\n        &lt;\/p&gt;\n    &lt;?php\n}<\/code><\/pre>\n<p>Damit erscheint beim Klick auf das Widget im Admin-Bereich eine Textbox f\u00fcr das Limit:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-23_00-15.avif\"><img loading=\"lazy\" decoding=\"async\" width=\"676\" height=\"189\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-23_00-15.avif\" alt=\"\" class=\"wp-image-16456\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-23_00-15.avif 676w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-23_00-15-300x84.avif 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-23_00-15-640x179.avif 640w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/2026-02-23_00-15-608x170.avif 608w\" sizes=\"auto, (max-width: 676px) 100vw, 676px\" \/><\/a><\/figure>\n<\/div>\n<p>Der dort gesetzte Wert steht in der <code class=\"\" data-line=\"\">widget()<\/code> Funktion im zweiten \u00fcbergebenen Parameter $settings zur Verf\u00fcgung:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\" data-line=\"\">$max_news_count = $settings[&#039;max_news_count&#039;];<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Standardwerte f\u00fcr Einstellungen<\/h2>\n<p>W\u00e4hrend das beim Testen funktioniert, sollten produktiv Standardwerte vorhanden sein. Schlie\u00dflich werden Einstellungen wie <code class=\"\" data-line=\"\">$settings[&#039;max_news_count&#039;]<\/code> erst gesetzt, nachdem der Nutzer entsprechende Werte im Admin-Bereich eintr\u00e4gt. Das wird an mehreren Stellen problematisch. Simples Beispiel: Das Limit soll die geladenen Datens\u00e4tze aus einer Datenbank begrenzen.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\" data-line=\"\">$query = $db-&gt;prepare(&#039;\n    select ...\n    limit &#039; . (int)$max_news_count\n);<\/code><\/pre>\n<p>Dies wird im beschriebenen Szenario einer frischen Installation ohne gef\u00fcllte Einstellungen fehlschlagen, weil <code class=\"\" data-line=\"\">$settings[&#039;max_news_count&#039;]<\/code> nicht gesetzt ist &#8211; dadurch entsteht eine fehlerhafte SQL-Abfrage. Daher lege ich einen Array mit Standard-Werten an:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\" data-line=\"\">class UNews_Widget extends WP_Widget {\n    private $default_settings = array(\n        &#039;max_news_count&#039; =&gt; 10\n    );\n    \/\/ ...\n}<\/code><\/pre>\n<p>Dazu eine Hilfsfunktion, welche pr\u00fcft, ob eine gew\u00fcnschte Einstellung bereits gesetzt ist &#8211; und diese entweder daraus zur\u00fcckliefert, oder alternativ aus den Standardwerten.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\" data-line=\"\">private function get_setting($settings, $key) {\n    if(isset($settings[$key])) {\n        return $settings[$key];\n    }\n    return $this-&gt;default_settings[$key];\n}<\/code><\/pre>\n<p>In der widget() Funktion zum Rendern des Inhalts wird sie wie folgt genutzt:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\" data-line=\"\">$max_news_count = $this-&gt;get_setting($settings, &#039;max_news_count&#039;);<\/code><\/pre>\n<p>Eben so beim Rendern der Einstellungen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-xml\" data-line=\"\">&lt;input id=&quot;&lt;?=$this-&gt;get_field_id( &#039;max_news_count&#039; )?&gt;&quot; name=&quot;&lt;?=$this-&gt;get_field_name( &#039;max_news_count&#039; )?&gt;&quot; \n     value=&quot;&lt;?=esc_attr( $this-&gt;get_setting($settings, &#039;max_news_count&#039;) )?&gt;&quot; type=&quot;text&quot; type=&quot;number&quot; min=&quot;1&quot; max=&quot;100&quot;&gt;<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Zu beachten<\/h2>\n<p>Mit gro\u00dfer Macht geht bekanntlich auch gro\u00dfe Verantwortung einher. Gerade weil sich nahezu alles \u00fcber Widgets integrieren l\u00e4sst, sollte man sich vorher ein paar Gedanken dar\u00fcber machen, was technisch gemacht werden soll. Und ob bzw. in wie weit das skaliert. Immerhin wird das Widget an der jeweiligen Stelle bei jedem Aufruf komplett neu gerendert. In der Seitenleiste geschieht das auf der Startseite sowie in den Artikeln. Abh\u00e4ngig von der Anzahl an Besuchern also recht h\u00e4ufig.<\/p>\n<p>Wer etwa eine HTTP-API aufruft, erzeugt jedes mal eine Anfrage an den Zielserver. Da es sich um serverseitigen Code handelt, im Namen des eigenen Servers. Das kann schnell problematisch werden: Abfragenlimits sorgen f\u00fcr tempor\u00e4re oder dauerhafte Probleme beim Laden der Daten. Oder man wird gar wegen eines ungewollten DoS-Angriffs komplett ausgesperrt. Selbst wenn es bei internen Ressourcen bleibt &#8211; eine umfangreiche Datenbankabfrage oder andere rechenintensive Vorg\u00e4nge verlangsamen die Ladezeit beim Nutzer, w\u00e4hrend parallel die Serverlast steigt.<\/p>\n<p>Im &#8222;KI&#8220; Zeitalter m\u00fcssen neben menschlichen Besuchern auch Bots zunehmend ber\u00fccksichtigt werden. Zwar gab es die bereits vorher. Doch insbesondere &#8222;KI&#8220; Crawler gehen zunehmend aggressiv vor, wodurch selbst auf kleineren Blogs zehntausende Anfragen in k\u00fcrzester Zeit entstehen k\u00f6nnen. Ebenfalls m\u00f6glich sind unerwartet hohe Zahlen echter Besucher, weil Links in Sozialen Netzwerken geteilt werden. Es gibt verschiedene Gr\u00fcnde, warum man auf h\u00f6here Last vorbereitet sein sollte.<\/p>\n<h2 class=\"wp-block-heading\">Optimiertes Laden von Daten<\/h2>\n<p>Grunds\u00e4tzlich sollten nur jene Daten geladen werden, die man tats\u00e4chlich ben\u00f6tigt. Der Klassiker bei Datenabfragen ist <code class=\"\" data-line=\"\">SELECT *<\/code> von denen in aller Regel nicht s\u00e4mtliche Spalten Verwendung finden. Insbesondere in Kombination mit JOINs. Hier empfehlen sich die grundlegenden Optimierungen: Indizes verwenden bzw. wenn n\u00f6tig anlegen, Abfragen mit <code class=\"\" data-line=\"\">EXPLAIN<\/code> pr\u00fcfen, Volltextsuche vermeiden usw.<\/p>\n<p>L\u00e4sst sich Caching sinnvoll nutzen? Ich habe zur PHP 5-Zeit auf XCache gesetzt. Es speichert den kompilierten Bytecode zwischen, sodass der PHP-Interpreter nicht f\u00fcr jede Anfrage s\u00e4mtlichen Code neu interpretieren muss (<em>OPcache<\/em>). Dies erfolgt im Arbeitsspeicher &#8211; damit entf\u00e4llt die I\/O Last. Au\u00dferdem stellt XCache PHP-Funktionen wie <code class=\"\" data-line=\"\">xcache_set<\/code> oder <code class=\"\" data-line=\"\">xcache_get<\/code> bereit. So kann man Objekte im RAM ablegen, die \u00fcber verschiedene Anfragen hinweg zur Verf\u00fcgung stehen.<\/p>\n<p>Ab PHP 5.5 hat die Sprache endlich mit Zend OPcache einen eigenen OPcache integriert<sup data-fn=\"859f7e46-dc43-4115-849c-a77f90791af8\" class=\"fn\"><a href=\"#859f7e46-dc43-4115-849c-a77f90791af8\" id=\"859f7e46-dc43-4115-849c-a77f90791af8-link\">2<\/a><\/sup> und mit dem JIT-Compiler in PHP 8.0 ausgebaut. Leider weiterhin &#8222;nur&#8220; als Bytecode-Cache. Um selbst Daten ablegen zu k\u00f6nnen, sind Alternativen wie APCu notwendig. Das Prinzip ist identisch, nur die Funktionen daf\u00fcr hei\u00dfen anders: <code class=\"\" data-line=\"\">apcu_store<\/code> statt <code class=\"\" data-line=\"\">xcache_set<\/code> und <code class=\"\" data-line=\"\">apcu_fetch<\/code> anstelle von <code class=\"\" data-line=\"\">xcache_get<\/code>. Ein simpler Weg kann darin bestehen, die Daten XX Minuten zu speichern, bevor man sie neu l\u00e4dt. Welcher Wert sinnvoll ist, h\u00e4ngt von der Art der Datenquelle sowie dem erwarteten Besuchsvolumen ab.<\/p>\n<h2 class=\"wp-block-heading\">Quellen<\/h2>\n<ol class=\"wp-block-footnotes\">\n<li id=\"fc184e6b-27b1-40a6-8b8e-e84038287b84\"><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"nofollow\">https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/<\/a> <a href=\"#fc184e6b-27b1-40a6-8b8e-e84038287b84-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 1 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"859f7e46-dc43-4115-849c-a77f90791af8\"><a href=\"https:\/\/www.php.net\/releases\/5_5_0.php\" target=\"_blank\" rel=\"nofollow\">https:\/\/www.php.net\/releases\/5_5_0.php<\/a> <a href=\"#859f7e46-dc43-4115-849c-a77f90791af8-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 2 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Es ist in WordPress recht einfach, eigene Inhalte in Form von Widgets einzubinden. Der Beitrag zeigt ein simples Beispiel mit ~30 Codezeilen. Dar\u00fcber hinaus gehen wir auf erweiterte Themen wie das definieren von Einstellungen f\u00fcr die Admin-Oberfl\u00e4che von WP ein. Au\u00dferdem einige \u00dcberlegungen aus eigener Erfahrung, die man sich vor dem produktiven Einbau stellen sollte &#8230;<\/p>\n","protected":false},"author":5,"featured_media":16469,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"[{\"content\":\"<a href=\\\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\\\">https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/<\/a>\",\"id\":\"fc184e6b-27b1-40a6-8b8e-e84038287b84\"},{\"content\":\"<a href=\\\"https:\/\/www.php.net\/releases\/5_5_0.php\\\">https:\/\/www.php.net\/releases\/5_5_0.php<\/a>\",\"id\":\"859f7e46-dc43-4115-849c-a77f90791af8\"}]"},"categories":[61],"tags":[55,161],"class_list":["post-16431","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-softwareentwicklung","tag-php","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/16431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=16431"}],"version-history":[{"count":34,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/16431\/revisions"}],"predecessor-version":[{"id":16511,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/16431\/revisions\/16511"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/16469"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=16431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=16431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=16431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}