{"id":230482,"date":"2022-12-14T13:56:00","date_gmt":"2022-12-14T10:56:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230482"},"modified":"2022-12-14T13:58:26","modified_gmt":"2022-12-14T10:58:26","slug":"widzety-wordpress-wykrywanie-programowania-obiektowego","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/widzety-wordpress-wykrywanie-programowania-obiektowego\/","title":{"rendered":"Wid\u017cety WordPress: wykrywanie programowania obiektowego"},"content":{"rendered":"\n<p>Je\u015bli nie przeczyta\u0142e\u015b pierwszego posta z tej serii, polecam, poniewa\u017c zaczynamy pisa\u0107 kod obiektowy dla WordPressa za pomoc\u0105 <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Widgets API.<\/a><\/strong><\/p>\n<p>Seria ma uchwyci\u0107 kilka rzeczy:<\/p>\n<ol>\n<li>pokaza\u0107 podstawowy szkielet wid\u017cetu i dlaczego jest zorientowany obiektowo,<\/li>\n<li>przedyskutuj, jakie rzeczy powiniene\u015b by\u0107 w stanie zauwa\u017cy\u0107 i dlaczego<\/li>\n<li>najpierw zaktualizuj Widget Boilerplate bezpo\u015brednio na tej stronie, a nast\u0119pnie wy\u015blij go do GitHub,<\/li>\n<li>zbuduj widget wykorzystuj\u0105c API z boilerplate jako fundament naszej pracy.<\/li>\n<\/ol>\n<p>Ale zanim to zrobi\u0119, chc\u0119 si\u0119 upewni\u0107, \u017ce wszyscy, kt\u00f3rzy to czytaj\u0105, s\u0105 zorientowani w podstawowych zasadach programowania obiektowego i maj\u0105 wszystko, co jest potrzebne do zbudowania rozwi\u0105zania zorientowanego obiektowo dla WordPressa.<\/p>\n<p>W tym celu polecam:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/pierwsze-dwa-filary-oop\/\" title=\"Dwa filary programowania obiektowego: cz\u0119\u015b\u0107 1 z 2\">Dwa filary programowania obiektowego: cz\u0119\u015b\u0107 1 z 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/drugie-dwa-filary-oop\/\" title=\"Dwa filary programowania obiektowego: cz\u0119\u015b\u0107 2 z 2\">Dwa filary programowania obiektowego: cz\u0119\u015b\u0107 2 z 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/klasy-abstrakcyjne-czesc-1-zachowanie-abstrakcji\/\" title=\"Klasy abstrakcyjne, cz\u0119\u015b\u0107 1 \u2013 zachowanie abstrakcji\">Klasy abstrakcyjne, cz\u0119\u015b\u0107 1 \u2013 zachowanie abstrakcji<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/klasy-abstrakcyjne-czesc-2-klasy-abstrakcyjne-i-interfejsy\/\" title=\"Klasy abstrakcyjne, cz\u0119\u015b\u0107 2 \u2013 Klasy abstrakcyjne i interfejsy\">Klasy abstrakcyjne, cz\u0119\u015b\u0107 2 \u2013 Klasy abstrakcyjne i interfejsy<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/tommcfarlin.com\/tag\/the-independent-wordpress-developer\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Niezale\u017cny programista WordPress<\/a><\/strong><\/li>\n<\/ol>\n<p>Je\u015bli przeczyta\u0142e\u015b wszystkie te tre\u015bci, \u015bwietnie. B\u0119dziesz dobrze przygotowany do tego posta i kolejnych post\u00f3w. Je\u015bli nie, mog\u0105 by\u0107 pewne dziury w reszcie tego, co zamierzasz przeczyta\u0107, ale istota postu powinna by\u0107 wystarczaj\u0105co jasna.<\/p>\n<h3>O co dok\u0142adnie chodzi?<\/h3>\n<p>Oto rzecz: <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/widzety-wordpress-podejscie-obiektowe\/\" title=\"W zesz\u0142ym tygodniu\">W zesz\u0142ym tygodniu<\/a><\/strong> udost\u0119pni\u0142em fragment kodu wraz z kilkoma informacjami na temat <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API Widgets<\/a><\/strong>. Zamierzam wr\u00f3ci\u0107 do tego nieco wi\u0119cej w tym po\u015bcie, zanim przejdziemy do bardziej intensywnej cz\u0119\u015bci kodowania z dw\u00f3ch powod\u00f3w:<\/p>\n<ol>\n<li>Chc\u0119, aby wszyscy czytaj\u0105cy to byli na tej samej stronie, co dotyczy pisania kodu obiektowego (przynajmniej w tym kontek\u015bcie),<\/li>\n<li>Zdaj\u0119 sobie spraw\u0119, \u017ce ludzie pochodz\u0105 z r\u00f3\u017cnych \u015brodowisk i chc\u0119 si\u0119 upewni\u0107, \u017ce wszyscy jeste\u015bmy na tej samej stronie w jak najwi\u0119kszym stopniu, zanim przejdziemy dalej.<\/li>\n<\/ol>\n<p>Je\u015bli masz do\u015bwiadczenie w pisaniu kodu zorientowanego obiektowo, zw\u0142aszcza na zaawansowanym poziomie, mo\u017ce ci si\u0119 to wydawa\u0107 prostsze; w przeciwnym razie mam nadziej\u0119, \u017ce uzbroi ci\u0119 to we wszystko, czego potrzebujesz, aby wykry\u0107 praktyki zorientowane obiektowo nie tylko dotycz\u0105ce tego interfejsu API, ale tak\u017ce podczas czytania kodu innych os\u00f3b.<\/p>\n<h2>Jak wykry\u0107 programowanie zorientowane obiektowo?<\/h2>\n<p>By\u0107 mo\u017ce naturalnym pierwszym pytaniem jest, dlaczego musimy by\u0107 w stanie wykry\u0107, przeczyta\u0107 lub zrozumie\u0107 programowanie obiektowe przed jego napisaniem?<\/p>\n<h3>S\u0142owo o z\u0142ym kodzie<\/h3>\n<p>Kr\u00f3tka odpowied\u017a na to jest taka:<\/p>\n<p>Nie musisz, ale to jest pomocne. Je\u015bli potrafisz czyta\u0107 programowanie zorientowane obiektowo, b\u0119dziesz mia\u0142 przewag\u0119 w korzystaniu z tego, co oferuje jako paradygmat, poniewa\u017c b\u0119dziesz bazowa\u0107 na strategiach i pracy wykonanej przez innych w innych projektach.<\/p>\n<p>Nie oznacza to, \u017ce nie b\u0119dziemy czyta\u0107 z\u0142ego kodu, ale zrobimy, co w naszej mocy, aby zidentyfikowa\u0107 z\u0142y kod, zidentyfikowa\u0107 problematyczne obszary, a nast\u0119pnie zrobimy wszystko, co w naszej mocy, aby unikn\u0105\u0107 w\u0142\u0105czenia go do naszej pracy.<\/p>\n<p>Na razie jednak przyjrzyjmy si\u0119 <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">interfejsowi API wid\u017cet\u00f3w<\/a><\/strong>, aby zobaczy\u0107, co mo\u017cemy zrobi\u0107, aby wykry\u0107 programowanie obiektowe.<\/p>\n<h3>Powr\u00f3t do programowania obiektowego<\/h3>\n<p>W poprzednim po\u015bcie nakre\u015bli\u0142em dwie rzeczy, kt\u00f3re wskazuj\u0105, \u017ce API jest zorientowane obiektowo (przynajmniej w pewnym stopniu):<\/p>\n<ol>\n<li>u\u017cycie s\u0142owa kluczowego <strong>extends ,<\/strong><\/li>\n<li>funkcje, kt\u00f3re musimy wdro\u017cy\u0107.<\/li>\n<\/ol>\n<p>Powodem, dla kt\u00f3rego chc\u0119 wr\u00f3ci\u0107 do tego tematu, jest to, \u017ce identyfikuje on dwie kluczowe rzeczy, kt\u00f3re s\u0105 cz\u0119\u015bci\u0105 podstawowych zasad zorientowanych obiektowo: <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Dziedziczenie<\/a><\/strong> i implementacja funkcji (kt\u00f3ra cz\u0119sto jest cz\u0119\u015bci\u0105 <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">klas abstrakcyjnych<\/a><\/strong> ).<\/p>\n<p>Uwaga zanim spojrzymy na powy\u017csze:<\/p>\n<p>Kiedy spojrzysz na <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u017ar\u00f3d\u0142o klasy WP_Widget<\/a><\/strong>, zauwa\u017cysz, \u017ce nie ma metod abstrakcyjnych. Ale niekt\u00f3re z funkcji, kt\u00f3re musimy zaimplementowa\u0107, o kt\u00f3rych wspomn\u0119 p\u00f3\u017aniej w tym po\u015bcie, s\u0105 g\u0142\u00f3wnymi kandydatami do metod abstrakcyjnych. I om\u00f3wi\u0119 te\u017c dlaczego.<\/p>\n<p>Podzielmy powy\u017csze tematy na dwie oddzielne sekcje: Dziedziczenie i Abstrakcje.<\/p>\n<h3>Dziedzictwo<\/h3>\n<p><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/widzety-wordpress-podejscie-obiektowe\/\" title=\"W poprzednim po\u015bcie\">W poprzednim po\u015bcie<\/a><\/strong> om\u00f3wi\u0142em dziedziczenie to wzgl\u0119dna g\u0142\u0119boko\u015b\u0107, wi\u0119c nie b\u0119d\u0119 tutaj omawia\u0142 tego tematu. Zaproponuj\u0119 kilka s\u0142\u00f3w, ale o wiele bardziej interesuje mnie om\u00f3wienie abstrakcji, kt\u00f3r\u0105 za chwil\u0119 zrobi\u0119.<\/p>\n<p>Zanim jednak zag\u0142\u0119bisz si\u0119 w to zbyt daleko, zapoznaj si\u0119 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ea73655b0a022d65317529930cbb0cad#file-00-widget-base-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">z nast\u0119puj\u0105cym kodem:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\nclass AcmeWidget extends WP_Widget \n{ \n    public function __construct() \n    {\n    }\n\n    public function widget($args, $instance) \n    {\n    }\n\n    public function form($instance)\n    {\n    }\n\n    public function update($newInstance, $oldInstance)\n    {\n    }\n}<\/code><\/pre>\n<p>Ale najpierw mo\u017cemy rozpozna\u0107, \u017ce ka\u017cda klasa implementuj\u0105ca API Widgets musi u\u017cywa\u0107 dziedziczenia po prostu ze wzgl\u0119du na s\u0142owo kluczowe <strong>extends<\/strong>.<\/p>\n<p>Oznacza to, \u017ce istnieje poziom funkcjonalno\u015bci, kt\u00f3ry zamierzamy odziedziczy\u0107 (lub otrzyma\u0107 za darmo) i jest poziom funkcjonalno\u015bci, kt\u00f3ry musimy wdro\u017cy\u0107 samodzielnie.<\/p>\n<p>Z <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">podr\u0119cznika PHP<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Na przyk\u0142ad, gdy rozszerzasz klas\u0119, podklasa dziedziczy wszystkie publiczne i chronione metody z klasy nadrz\u0119dnej. O ile klasa nie zast\u0105pi tych metod, zachowaj\u0105 one swoj\u0105 pierwotn\u0105 funkcjonalno\u015b\u0107.<\/p>\n<\/blockquote>\n<p>Kiedy jednak dziedziczysz funkcjonalno\u015b\u0107 z klasy, mo\u017ce si\u0119 okaza\u0107, \u017ce wa\u017cne jest \u015bcis\u0142e wywo\u0142anie konstruktora rodzica (w naszej funkcji <strong>__construct<\/strong> ).<\/p>\n<p>Ale to rodzi to, co uwa\u017cam za jeden z najwa\u017cniejszych problem\u00f3w z dziedziczeniem w PHP (i ca\u0142y pow\u00f3d, dla kt\u00f3rego chcia\u0142em zamie\u015bci\u0107 t\u0119 sekcj\u0119): Czy musimy jawnie wywo\u0142ywa\u0107 konstruktor rodzica?<\/p>\n<p>R\u00f3wnie\u017c zgodnie <strong><a href=\"http:\/\/www.php.net\/manual\/en\/language.oop5.decon.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">z instrukcj\u0105:<\/a><\/strong><\/p>\n<blockquote>\n<p>Konstruktory nadrz\u0119dne nie s\u0105 wywo\u0142ywane niejawnie, je\u015bli klasa podrz\u0119dna definiuje konstruktor. Aby uruchomi\u0107 konstruktor nadrz\u0119dny, wymagane jest wywo\u0142anie metody <strong>parent::__construct()<\/strong> w konstruktorze potomnym. Je\u015bli dziecko nie definiuje konstruktora, to mo\u017ce by\u0107 dziedziczone z klasy nadrz\u0119dnej, tak jak zwyk\u0142a metoda klasy (je\u015bli nie zosta\u0142a zadeklarowana jako prywatna).<\/p>\n<\/blockquote>\n<p>Ale mo\u017cemy to upro\u015bci\u0107. By\u0107 mo\u017ce \u0142atwiej to zapami\u0119ta\u0107:<\/p>\n<ol>\n<li>Je\u015bli nasza klasa u\u017cywa dziedziczenia, ale nie definiuje konstruktora, wywo\u0142ywany jest konstruktor nadrz\u0119dny.<\/li>\n<li>Je\u015bli nasza klasa u\u017cywa dziedziczenia, ale definiuje konstruktor, nale\u017cy jawnie wywo\u0142a\u0107 konstrukcj\u0119 nadrz\u0119dn\u0105.<\/li>\n<\/ol>\n<p>A mo\u017ce jeszcze pro\u015bciej:<\/p>\n<ul>\n<li>Je\u015bli nasza klasa nie definiuje konstruktora, kod zostanie domy\u015blnie ustawiony na konstruktor rodzic\u00f3w.<\/li>\n<\/ul>\n<p>Ma sens? Kr\u00f3tko m\u00f3wi\u0105c, je\u015bli zdefiniujemy nasze w\u0142a\u015bciwo\u015bci, inicjalizacj\u0119 i kod w konstruktorze, pierwszy wiersz konstruktora naszej klasy powinien by\u0107 wywo\u0142aniem konstruktora nadrz\u0119dnego.<\/p>\n<h3>Abstrakcja<\/h3>\n<p>Dla jasno\u015bci kod \u017ar\u00f3d\u0142owy klasy <strong>WP_Widget<\/strong> nie zawiera metod abstrakcyjnych. Cz\u0119\u015b\u0107 ma to zwi\u0105zek ze sposobem budowy klasy, cz\u0119\u015b\u0107 z kompatybilno\u015bci\u0105 wsteczn\u0105 i funkcjami PHP5.<\/p>\n<p>Nie oznacza to jednak, \u017ce nie mo\u017cemy okre\u015bli\u0107, jakie funkcje mo\u017cna oznaczy\u0107 jako <strong>abstract<\/strong>. W\u0142a\u015bciwie my\u015bl\u0119, \u017ce to daje argument, kt\u00f3re klasy powinny by\u0107 abstrakcyjne. Ale najpierw zdefiniujmy funkcje abstrakcyjne.<\/p>\n<p><strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Z instrukcji<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Podczas dziedziczenia z klasy abstrakcyjnej wszystkie metody oznaczone jako abstrakcyjne w deklaracji klasy rodzica musz\u0105 by\u0107 zdefiniowane przez dziecko; dodatkowo metody te musz\u0105 by\u0107 zdefiniowane z tak\u0105 sam\u0105 (lub mniej ograniczon\u0105) widoczno\u015bci\u0105.<\/p>\n<\/blockquote>\n<p>Patrz\u0105c na \u017ar\u00f3d\u0142o naszego wid\u017cetu:<\/p>\n<pre><code>&lt;?php\nclass AcmeWidget extends WP_Widget \n{ \n    public function __construct() \n    {\n    }\n\n    public function widget($args, $instance) \n    {\n    }\n\n    public function form($instance)\n    {\n    }\n\n    public function update($newInstance, $oldInstance)\n    {\n    }\n}<\/code><\/pre>\n<p>My\u015bl\u0119, \u017ce mo\u017cna powiedzie\u0107, \u017ce funkcja <strong>formularza<\/strong> mo\u017ce by\u0107 oznaczona jako <strong>abstrakcyjna<\/strong>, poniewa\u017c jest unikalna dla naszej implementacji. Innym sposobem my\u015blenia o funkcjach abstrakcyjnych z punktu widzenia programowania jest zadanie sobie pytania: Kt\u00f3re funkcje b\u0119d\u0105 wymaga\u0142y unikalnej funkcjonalno\u015bci?<\/p>\n<p>W tym przypadku funkcja <strong>formularza<\/strong> jest dok\u0142adnie taka, poniewa\u017c ka\u017cdy wid\u017cet b\u0119dzie si\u0119 r\u00f3\u017cni\u0142 od tego, co renderuje. Funkcj\u0119 <strong>wid\u017cetu<\/strong> mo\u017cna r\u00f3wnie\u017c oznaczy\u0107 jako abstrakcyjn\u0105, poniewa\u017c wy\u015bwietla zawarto\u015b\u0107 wid\u017cetu. Ta tre\u015b\u0107 jest oczywi\u015bcie oparta na funkcjonalno\u015bci, kt\u00f3r\u0105 zaimplementowali\u015bmy w naszej implementacji.<\/p>\n<p>Co wi\u0119cej, sam kod \u017ar\u00f3d\u0142owy klasy <strong>WP_Widget<\/strong> m\u00f3wi:<\/p>\n<blockquote>\n<p>funkcja WP_Widget::widget() musi by\u0107 nadpisana w podklasie.&#8217;<\/p>\n<\/blockquote>\n<p>To jest dok\u0142adnie ten typ funkcji, kt\u00f3ry powinien by\u0107 oznaczony jako abstrakcyjny. Poniewa\u017c PHP zg\u0142osi b\u0142\u0105d, je\u015bli funkcja jest oznaczona jako abstrakcyjna i nie zosta\u0142a zaimplementowana. Nie potrzebowali\u015bmy \u017cadnych wywo\u0142a\u0144 funkcji <strong>umrze\u0107<\/strong> ani nic podobnego.<\/p>\n<p>Jednak inne funkcje niekoniecznie b\u0119d\u0105 musia\u0142y by\u0107 oznaczone jako abstrakcyjne, a oto dlaczego:<\/p>\n<ol>\n<li><strong>__construct<\/strong> wywo\u0142a konstruktor rodzica na najbardziej podstawowym poziomie i jest to konieczne do zainicjowania klasy bazowej. Nie zapomnij jednak; mo\u017cemy doda\u0107 do tej metody nasze w\u0142a\u015bciwo\u015bci, kt\u00f3re s\u0105 unikalne dla naszej klasy.<\/li>\n<li><strong>update\u00a0<\/strong> u\u017cywa funkcji w klasie nadrz\u0119dnej do serializacji informacji.<\/li>\n<\/ol>\n<p>W ten spos\u00f3b pozosta\u0142y nam dwie funkcje, kt\u00f3re mo\u017cna by oznaczy\u0107 jako abstrakcyjne w bardziej nowoczesnej iteracji klasy.<\/p>\n<h2>Dalej<\/h2>\n<p>W tym momencie wszyscy powinni\u015bmy by\u0107 na tej samej stronie, co dotyczy kodu obiektowego. Przynajmniej na tyle, na ile mo\u017cemy przej\u015b\u0107 przez seri\u0119 wpis\u00f3w na blogu.<\/p>\n<p>Pocz\u0105wszy od nast\u0119pnego wpisu, wr\u00f3cimy do pisania kodu.<\/p>\n<p>Oznacza to, \u017ce ponownie odwiedzimy <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplate<\/a><\/strong> i zamierzam dokona\u0107 refaktoryzacji go w obecnym stanie, aby przyj\u0105\u0107 bardziej nowoczesne standardy PHP.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161697-61e7280e064dc.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161697-61e7280e064dc.png\" alt=\"Wid\u017cety WordPress: wykrywanie programowania obiektowego\"><\/a><\/p>\n<p>Podziel\u0119 si\u0119 zmianami, kt\u00f3re wprowadzam, uzasadnieniami, dlaczego, a nast\u0119pnie opowiem o typie wid\u017cetu, kt\u00f3ry b\u0119dziemy budowa\u0107 w oparciu o boilerplate (i mo\u017cemy to zrobi\u0107).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Celem jest uzbroi\u0107 Ci\u0119 we wszystko, czego potrzebujesz do wykrywania praktyk obiektowych zar\u00f3wno w tym interfejsie API, jak i w innych.<\/p>\n","protected":false},"author":1,"featured_media":235594,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,805,866],"tags":[1169],"class_list":["post-230482","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-php-7","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230482","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=230482"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230482\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/235594"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}