{"id":231164,"date":"2022-12-14T14:43:00","date_gmt":"2022-12-14T11:43:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231164"},"modified":"2022-12-14T14:43:37","modified_gmt":"2022-12-14T11:43:37","slug":"wordpress-widgetit-tunnista-olio-ohjelmointi","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-widgetit-tunnista-olio-ohjelmointi\/","title":{"rendered":"WordPress-widgetit: Tunnista olio-ohjelmointi"},"content":{"rendered":"\n<p>Jos et ole lukenut t\u00e4m\u00e4n sarjan ensimm\u00e4ist\u00e4 viesti\u00e4, suosittelen sit\u00e4, koska alamme kirjoittaa oliokoodia WordPressille <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Widgets API:n avulla.<\/a><\/strong><\/p>\n<p>Sarja aikoo taltioida muutamia asioita:<\/p>\n<ol>\n<li>n\u00e4ytt\u00e4\u00e4 sinulle widgetin perusrungon ja miksi se on oliosuuntautunut,<\/li>\n<li>keskustella siit\u00e4, mit\u00e4 asioita sinun pit\u00e4isi pysty\u00e4 huomaamaan ja miksi<\/li>\n<li>p\u00e4ivit\u00e4 Widget Boilerplate ensin suoraan t\u00e4lle sivustolle ja siirr\u00e4 se sitten GitHubiin,<\/li>\n<li>rakentaa widget API:n avulla, jonka pohjana on ty\u00f6mme.<\/li>\n<\/ol>\n<p>Mutta ennen kuin teen sen, haluan varmistaa, ett\u00e4 jokainen t\u00e4t\u00e4 lukeva on perehtynyt olio-ohjelmoinnin perusperiaatteisiin ja ett\u00e4 heill\u00e4 on kaikki tarvittava olio-ratkaisun rakentamiseen WordPressille.<\/p>\n<p>T\u00e4t\u00e4 varten suosittelen seuraavaa:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/oop-n-kaksi-ensimmaeistae-pilaria\/\" title=\"Kaksi olio-ohjelmoinnin pilaria: Osa 1\/2\">Kaksi olio-ohjelmoinnin pilaria: Osa 1\/2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/oop-n-kaksi-toista-pilaria\/\" title=\"Olio-ohjelmoinnin kaksi pilaria: Osa 2\/2\">Olio-ohjelmoinnin kaksi pilaria: Osa 2\/2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/abstract-classes-osa-1-abstraktiokaeyttaeytyminen\/\" title=\"Abstract Classes, Osa 1 \u2013 Abstraktiok\u00e4ytt\u00e4ytyminen\">Abstract Classes, Osa 1 \u2013 Abstraktiok\u00e4ytt\u00e4ytyminen<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/abstraktit-luokat-osa-2-abstraktit-luokat-ja-kaeyttoeliittymaet\/\" title=\"Abstraktit luokat, osa 2 \u2013 Abstraktit luokat ja k\u00e4ytt\u00f6liittym\u00e4t\">Abstraktit luokat, osa 2 \u2013 Abstraktit luokat ja k\u00e4ytt\u00f6liittym\u00e4t<\/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\">Itsen\u00e4inen WordPress-kehitt\u00e4j\u00e4<\/a><\/strong><\/li>\n<\/ol>\n<p>Jos olet lukenut kaiken sis\u00e4ll\u00f6n, hienoa. Olet valmistautunut hyvin t\u00e4h\u00e4n viestiin ja tuleviin viesteihin. Jos ei, muussa lukemassasi saattaa olla reiki\u00e4, mutta viestin ydin tulee olla riitt\u00e4v\u00e4n selke\u00e4.<\/p>\n<h3>Mik\u00e4 on sopimus, tarkalleen?<\/h3>\n<p>Asia on t\u00e4ss\u00e4: <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-widgetit-oliolaehtoeinen-laehestymistapa\/\" title=\"viime viikolla\">viime viikolla<\/a><\/strong> jaoin hieman koodia ja tietoja <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Widgets API<\/a><\/strong> :sta. Aion palata asiaan hieman enemm\u00e4n t\u00e4ss\u00e4 viestiss\u00e4 ennen kuin siirrymme koodaamista vaativampaan osaan kahdesta syyst\u00e4:<\/p>\n<ol>\n<li>Haluan kaikkien t\u00e4t\u00e4 lukevien olevan samalla sivulla, kun se liittyy oliokoodin kirjoittamiseen (ainakin t\u00e4ss\u00e4 yhteydess\u00e4),<\/li>\n<li>Ymm\u00e4rr\u00e4n, ett\u00e4 ihmiset tulevat eri taustoista, ja haluan varmistaa, ett\u00e4 olemme kaikki mahdollisimman pitk\u00e4lle samalla sivulla ennen kuin jatkat.<\/li>\n<\/ol>\n<p>Jos sinulla on kokemusta oliokoodin kirjoittamisesta, etenkin edistyneess\u00e4 kapasiteetissa, t\u00e4m\u00e4 saattaa tuntua yksinkertaiselta. Muuten toivon, ett\u00e4 t\u00e4m\u00e4 varustaa sinut kaikella, mit\u00e4 tarvitset oliosuuntautuneiden k\u00e4yt\u00e4nt\u00f6jen havaitsemiseksi ei vain t\u00e4m\u00e4n API:n suhteen, vaan my\u00f6s muiden koodia lukiessa.<\/p>\n<h2>Kuinka havaita olio-ohjelmointi<\/h2>\n<p>Ehk\u00e4 luonnollinen ensimm\u00e4inen kysymys on, miksi meid\u00e4n t\u00e4ytyy pysty\u00e4 havaitsemaan, lukemaan tai ymm\u00e4rt\u00e4m\u00e4\u00e4n olio-ohjelmointia ennen sen kirjoittamista?<\/p>\n<h3>Sana huonosta koodista<\/h3>\n<p>Lyhyt vastaus siihen on t\u00e4m\u00e4:<\/p>\n<p>Sinun ei tarvitse, mutta se on hy\u00f6dyllinen minulle. Jos osaat lukea olio-ohjelmointia, sinulla on etumatka sen tarjoaman paradigman hy\u00f6dynt\u00e4misess\u00e4, koska aiot rakentaa muiden muissa projekteissa tekemi\u00e4 strategioita ja ty\u00f6t\u00e4.<\/p>\n<p>T\u00e4m\u00e4 ei tarkoita, ettemme lukisi huonoa koodia, mutta teemme kaikkemme tunnistaaksemme huonon koodin, tunnistaaksemme ongelmalliset alueet ja teemme sitten kaikkemme v\u00e4ltt\u00e4\u00e4ksemme sen sis\u00e4llytt\u00e4misen ty\u00f6h\u00f6n.<\/p>\n<p>Katsotaan nyt kuitenkin <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Widgets API<\/a><\/strong> :ta n\u00e4hd\u00e4ksemme, mit\u00e4 voimme tehd\u00e4 olio-ohjelmoinnin havaitsemiseksi.<\/p>\n<h3>Takaisin olio-ohjelmointiin<\/h3>\n<p>Edellisess\u00e4 viestiss\u00e4 hahmottelin kaksi asiaa, jotka osoittavat, ett\u00e4 API on oliosuuntautunut (ainakin jossain m\u00e4\u00e4rin):<\/p>\n<ol>\n<li><strong>Extens<\/strong> &#8211; avainsanan k\u00e4ytt\u00f6 ,<\/li>\n<li>toimintoja, jotka meid\u00e4n on toteutettava.<\/li>\n<\/ol>\n<p>Syy, miksi haluan palata t\u00e4h\u00e4n aiheeseen, on se, ett\u00e4 se tunnistaa kaksi keskeist\u00e4 asiaa, jotka ovat osa ydinolio-periaatteita: <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Periytys<\/a><\/strong> ja funktioiden toteutus (joka on usein osa <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">abstrakteja luokkia<\/a><\/strong> ).<\/p>\n<p>Huomautus ennen kuin tarkastelemme yll\u00e4 olevaa:<\/p>\n<p>Kun tarkastelet <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">luokan WP_Widget l\u00e4hdett\u00e4<\/a><\/strong>, huomaat, ett\u00e4 abstrakteja menetelmi\u00e4 ei ole. Mutta jotkin toiminnot, jotka meid\u00e4n on toteutettava ja jotka mainitsen my\u00f6hemmin t\u00e4ss\u00e4 viestiss\u00e4, ovat ensisijaisia \u200b\u200b\u200b\u200behdokkaita abstrakteille menetelmille. Ja keskustelen my\u00f6s miksi.<\/p>\n<p>Erotetaan yll\u00e4 olevat aiheet kahteen erilliseen osaan: Perinn\u00f6llisyys ja Abstraktiot.<\/p>\n<h3>Perint\u00f6<\/h3>\n<p>K\u00e4sittelin perinn\u00f6n suhteellista syvyytt\u00e4 <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-widgetit-oliolaehtoeinen-laehestymistapa\/\" title=\"edellisess\u00e4 viestiss\u00e4\">edellisess\u00e4 viestiss\u00e4<\/a><\/strong>, joten en k\u00e4sittele asiaa t\u00e4ss\u00e4. Esit\u00e4n muutaman sanan, mutta olen paljon kiinnostuneempi abstraktista keskustelusta, jonka teen hetken kuluttua.<\/p>\n<p>Ennen kuin menet t\u00e4h\u00e4n liian pitk\u00e4lle, katso kuitenkin <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ea73655b0a022d65317529930cbb0cad#file-00-widget-base-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">seuraava koodi:<\/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>Mutta ensinn\u00e4kin voimme huomata, ett\u00e4 mink\u00e4 tahansa luokan, joka toteuttaa Widgets API:n, on k\u00e4ytett\u00e4v\u00e4 periytymist\u00e4 yksinkertaisesti <strong>laajennetun<\/strong> avainsanan takia.<\/p>\n<p>T\u00e4m\u00e4 tarkoittaa, ett\u00e4 on olemassa tietyn tason toimintoja, jotka aiomme peri\u00e4 (tai saada ilmaiseksi), ja on olemassa taso toimintoja, jotka meid\u00e4n on otettava k\u00e4ytt\u00f6\u00f6n itse.<\/p>\n<p>PHP <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">k\u00e4sikirjasta<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Kun esimerkiksi laajennat luokkaa, alaluokka perii kaikki julkiset ja suojatut menetelm\u00e4t yl\u00e4luokalta. Ellei luokka ohita n\u00e4it\u00e4 menetelmi\u00e4, ne s\u00e4ilytt\u00e4v\u00e4t alkuper\u00e4isen toiminnallisuutensa.<\/p>\n<\/blockquote>\n<p>Kun kuitenkin perit toiminnallisuuden luokasta, saatat huomata, ett\u00e4 on t\u00e4rke\u00e4\u00e4 kutsua tiukasti yl\u00e4tason konstruktoria (<strong>__construct-<\/strong> funktiossamme).<\/p>\n<p>Mutta t\u00e4m\u00e4 her\u00e4tt\u00e4\u00e4 mielest\u00e4ni yhden t\u00e4rkeimmist\u00e4 PHP:n periytymisongelmista (ja koko syyn, miksi halusin sis\u00e4llytt\u00e4\u00e4 t\u00e4m\u00e4n osion): Pit\u00e4\u00e4k\u00f6 meid\u00e4n kutsua emokonstruktoria eksplisiittisesti?<\/p>\n<p>My\u00f6s <strong><a href=\"http:\/\/www.php.net\/manual\/en\/language.oop5.decon.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ohjekirjan mukaan:<\/a><\/strong><\/p>\n<blockquote>\n<p>Emokonstruktoreja ei kutsuta implisiittisesti, jos aliluokka m\u00e4\u00e4rittelee konstruktorin. P\u00e4\u00e4konstruktorin suorittamiseksi vaaditaan kutsu <strong>emo::__construct() -alennuskonstruktorissa<\/strong>. Jos lapsi ei m\u00e4\u00e4rittele konstruktoria, se voidaan peri\u00e4 p\u00e4\u00e4luokasta aivan kuten normaali luokkametodi (jos sit\u00e4 ei ole ilmoitettu yksityiseksi).<\/p>\n<\/blockquote>\n<p>Mutta voimme yksinkertaistaa t\u00e4t\u00e4. Ehk\u00e4 t\u00e4m\u00e4 on helpompi muistaa:<\/p>\n<ol>\n<li>Jos luokkamme k\u00e4ytt\u00e4\u00e4 periytymist\u00e4, mutta ei m\u00e4\u00e4rit\u00e4 konstruktoria, kutsutaan p\u00e4\u00e4konstruktoria.<\/li>\n<li>Jos luokkamme k\u00e4ytt\u00e4\u00e4 periytymist\u00e4, mutta m\u00e4\u00e4rittelee konstruktorin, p\u00e4\u00e4rakennetta on kutsuttava eksplisiittisesti.<\/li>\n<\/ol>\n<p>Tai ehk\u00e4 viel\u00e4 yksinkertaisemmin:<\/p>\n<ul>\n<li>Jos luokkamme ei m\u00e4\u00e4rit\u00e4 rakentajaa, koodi on oletuksena vanhempien konstruktori.<\/li>\n<\/ul>\n<p>K\u00e4yd\u00e4 j\u00e4rkeen? Lyhyesti sanottuna, jos m\u00e4\u00e4rit\u00e4mme ominaisuudet, alustuksen ja koodin konstruktorissa, luokkamme rakentajan ensimm\u00e4isen rivin tulisi olla kutsu yl\u00e4tason konstruktorille.<\/p>\n<h3>Abstraktio<\/h3>\n<p><strong>T\u00e4ysin selv\u00e4ksi, ett\u00e4 WP_Widget-<\/strong> luokan l\u00e4hdekoodi ei sis\u00e4ll\u00e4 abstrakteja menetelmi\u00e4. Osa t\u00e4st\u00e4 liittyy luokan rakentamiseen, osa taaksep\u00e4in yhteensopivuuteen ja PHP5:n ominaisuuksiin.<\/p>\n<p>T\u00e4m\u00e4 ei kuitenkaan tarkoita, ettemmek\u00f6 voisi tunnistaa, mitk\u00e4 funktiot voidaan merkit\u00e4 <strong>abstrakteiksi<\/strong>. Itse asiassa mielest\u00e4ni se antaa aiheen sille, mitk\u00e4 luokat tulisi tehd\u00e4 abstrakteiksi. Mutta ensin m\u00e4\u00e4ritell\u00e4\u00e4n abstraktit funktiot.<\/p>\n<p><strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.abstract.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">K\u00e4sikirjasta<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Periess\u00e4\u00e4n abstraktista luokasta kaikki yl\u00e4tason luokkailmoituksessa abstraktiksi merkityt menetelm\u00e4t on lapsen m\u00e4\u00e4ritelt\u00e4v\u00e4; Lis\u00e4ksi n\u00e4m\u00e4 menetelm\u00e4t on m\u00e4\u00e4ritelt\u00e4v\u00e4 samalla (tai v\u00e4hemm\u00e4n rajoitetulla) n\u00e4kyvyydell\u00e4.<\/p>\n<\/blockquote>\n<p>Kun katsot widgetimme l\u00e4hdett\u00e4:<\/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>Mielest\u00e4ni on reilua sanoa, ett\u00e4 <strong>lomakefunktio<\/strong> voidaan merkit\u00e4 <strong>abstraktiksi<\/strong>, koska se on ainutlaatuinen toteutuksellemme. Toinen tapa ajatella abstrakteja funktioita ohjelmoinnin n\u00e4k\u00f6kulmasta on kysy\u00e4 itselt\u00e4si: Mitk\u00e4 funktiot vaativat ainutlaatuista toimivuutta?<\/p>\n<p>Ja t\u00e4ss\u00e4 tapauksessa <strong>lomaketoiminto<\/strong> on juuri se, koska jokainen widget on yksil\u00f6llisesti erilainen sen suhteen, mit\u00e4 se tekee. Widget- toiminto voidaan my\u00f6s merkit\u00e4 abstraktiksi, koska se tulostaa widgetin sis\u00e4ll\u00f6n<strong>.<\/strong> T\u00e4m\u00e4 sis\u00e4lt\u00f6 perustuu luonnollisesti toteutuksessamme toteuttamiimme toimintoihin.<\/p>\n<p>Lis\u00e4ksi itse <strong>WP_Widget-<\/strong> luokan l\u00e4hdekoodi sanoo:<\/p>\n<blockquote>\n<p>funktio WP_Widget::widget() on ohitettava alaluokassa.&#8217;<\/p>\n<\/blockquote>\n<p>Juuri t\u00e4m\u00e4n tyyppinen funktio tulisi merkit\u00e4 abstraktiksi. Koska PHP antaa virheen, jos funktio on merkitty abstraktiksi eik\u00e4 sit\u00e4 ole toteutettu. Emme tarvinneet <strong>die-<\/strong> funktiokutsuja tai muuta vastaavaa.<\/p>\n<p>Muita toimintoja ei kuitenkaan v\u00e4ltt\u00e4m\u00e4tt\u00e4 tarvitse merkit\u00e4 abstrakteiksi, ja t\u00e4st\u00e4 syyst\u00e4:<\/p>\n<ol>\n<li><strong>__construct<\/strong> kutsuu yl\u00e4tason konstruktoria alkeesimmalla tasolla, ja t\u00e4m\u00e4 on v\u00e4ltt\u00e4m\u00e4t\u00f6nt\u00e4 perusluokan alustamiseksi. \u00c4l\u00e4 kuitenkaan unohda; voimme lis\u00e4t\u00e4 t\u00e4h\u00e4n menetelm\u00e4\u00e4n ominaisuutemme, jotka ovat ainutlaatuisia luokallemme.<\/li>\n<li><strong>p\u00e4ivitys\u00a0<\/strong> k\u00e4ytt\u00e4\u00e4 yl\u00e4luokan toimintoja tietojen sarjoittamiseen.<\/li>\n<\/ol>\n<p>N\u00e4in ollen meille j\u00e4\u00e4 kaksi funktiota, jotka voidaan merkit\u00e4 abstrakteiksi luokan nykyaikaisemmassa iteraatiossa.<\/p>\n<h2>Seuraava<\/h2>\n<p>T\u00e4ss\u00e4 vaiheessa meid\u00e4n kaikkien pit\u00e4isi olla samalla sivulla oliopohjaisen koodin suhteen. Ainakin sik\u00e4li kuin voimme k\u00e4yd\u00e4 l\u00e4pi sarjan blogikirjoituksia.<\/p>\n<p>Seuraavasta viestist\u00e4 alkaen palaamme koodin kirjoittamiseen.<\/p>\n<p>Toisin sanoen, palaamme <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplateen<\/a><\/strong> ja aion muuttaa sen nykyiseen tilaan ottamaan k\u00e4ytt\u00f6\u00f6n nykyaikaisemmat PHP-standardit.<\/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=\"WordPress-widgetit: Tunnista olio-ohjelmointi\"><\/a><\/p>\n<p>Aion jakaa tekem\u00e4ni muutokset, perustelut miksi, ja sitten puhun my\u00f6s widgetin tyypist\u00e4, jota aiomme rakentaa kattilalevyn perusteella (ja voimme tehd\u00e4 niin).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tavoitteena on varustaa sinut kaikella, mit\u00e4 tarvitset oliol\u00e4ht\u00f6isten k\u00e4yt\u00e4nt\u00f6jen havaitsemiseen sek\u00e4 t\u00e4ss\u00e4 API:ssa ett\u00e4 muissa.<\/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":[719,895,803,864],"tags":[1166],"class_list":["post-231164","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231164","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=231164"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231164\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/235594"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=231164"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=231164"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=231164"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}