{"id":109,"date":"2025-10-02T00:00:00","date_gmt":"2025-10-01T22:00:00","guid":{"rendered":"https:\/\/helloblog.io\/fi\/nollakatkon-wordpress-julkaisut-trelliksella\/"},"modified":"2026-01-20T06:33:15","modified_gmt":"2026-01-20T05:33:15","slug":"nollakatkon-wordpress-julkaisut-trelliksella","status":"publish","type":"post","link":"https:\/\/helloblog.io\/fi\/nollakatkon-wordpress-julkaisut-trelliksella\/","title":{"rendered":"Nollakatkon WordPress-julkaisut Trelliksell\u00e4: atomiset deployt k\u00e4yt\u00e4nn\u00f6ss\u00e4"},"content":{"rendered":"\n<p>WordPress-sivuston julkaisuhetki on yll\u00e4tt\u00e4v\u00e4n usein se hetki, jolloin sivusto on haavoittuvimmillaan: tiedostoja kopioidaan tuotantoon &#8220;el\u00e4v\u00e4\u00e4n&#8221; hakemistoon, ja hetken aikaa palvelin tarjoilee k\u00e4ytt\u00e4jille sekoituksen vanhaa ja uutta koodia. Lopputulos n\u00e4kyy tutusti satunnaisina fataleina, puuttuvina assetteina tai rikkin\u00e4isin\u00e4 admin-n\u00e4kymin\u00e4 \u2014 ja usein ilman helppoa tapaa palata takaisin.<\/p>\n\n\n\n<p>Trellis (Roots-ekosysteemin palvelin- ja deploy-ty\u00f6kalu) tuo WordPressiin saman perusominaisuuden, joka on arkip\u00e4iv\u00e4\u00e4 monissa sovellustiimeiss\u00e4: <em>zero downtime<\/em> -julkaisut atomisella deploy-strategialla. Hyv\u00e4 puoli on se, ett\u00e4 Trellist\u00e4 voi k\u00e4ytt\u00e4\u00e4 pelk\u00e4st\u00e4\u00e4n deployyn, vaikka paikalliseen kehitykseen k\u00e4ytt\u00e4isit Valetia, Landoa tai DDEV:t\u00e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mit\u00e4 \u201czero downtime\u201d tarkoittaa WordPressin deployssa?<\/h2>\n\n\n\n<p>Nollakatkon julkaisu tarkoittaa k\u00e4yt\u00e4nn\u00f6ss\u00e4 sit\u00e4, ett\u00e4 k\u00e4ytt\u00e4j\u00e4lle sivusto pysyy toimintakuntoisena koko julkaisun ajan. Uusi versio rakennetaan valmiiksi erill\u00e4\u00e4n live-koodista, ja vasta kun kaikki on kasassa, liikenne ohjataan uuteen julkaisuun yhdell\u00e4 v\u00e4litt\u00f6m\u00e4ll\u00e4 kytkenn\u00e4ll\u00e4.<\/p>\n\n\n\n<p>Oleellinen ero perinteiseen malliin on <em>v\u00e4litilan puuttuminen<\/em>: miss\u00e4\u00e4n vaiheessa k\u00e4ytt\u00e4j\u00e4t eiv\u00e4t osu tilanteeseen, jossa osa tiedostoista on jo uusia ja osa viel\u00e4 vanhoja.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Miksi perinteinen WordPress-julkaisu hajoaa helposti?<\/h2>\n\n\n\n<p>Tyypilliset WordPress-deployt osuvat yleens\u00e4 johonkin n\u00e4ist\u00e4 kategorioista:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>FTP\/&#8221;kopioi tuotantoon&#8221; -p\u00e4ivitykset: ylikirjoitat tiedostoja suoraan julkisesta hakemistosta. Siirto kest\u00e4\u00e4, ja sen ajan sivusto voi ajaa ep\u00e4yhteensopivalla tiedostosekoituksella.<\/li>\n\n\n<li>Synkronointity\u00f6kalut kuten <code>rsync<\/code>: usein nopeampi kuin FTP, mutta perusongelma on sama \u2014 ylikirjoitus tapahtuu samalla kun sivusto palvelee liikennett\u00e4.<\/li>\n\n\n<li>Hostin tai lis\u00e4osan &#8220;deploy&#8221;-toiminto: mukava k\u00e4ytt\u00f6liittym\u00e4, mutta monesti sama in-place-p\u00e4ivitys ilman kunnollista rollback-mekanismia.<\/li>\n\n<\/ul>\n\n\n\n<p>N\u00e4ille yhteist\u00e4 on kolme ongelmaa: (1) julkaisu voi rikkoa sivuston hetkellisesti, (2) paluu edelliseen versioon on ty\u00f6l\u00e4st\u00e4 tai mahdotonta nopeasti ja (3) virhetilanteessa k\u00e4ytt\u00e4j\u00e4t ovat koekaniineja.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Trelliksen ratkaisu: atominen ja immuuttinen julkaisu<\/h2>\n\n\n\n<p>Trellis k\u00e4ytt\u00e4\u00e4 atomista deploy-mallia: jokainen julkaisu p\u00e4\u00e4tyy omaan, erilliseen <em>release<\/em>-hakemistoonsa, eik\u00e4 julkaistuja tiedostoja muokata en\u00e4\u00e4 paikan p\u00e4\u00e4ll\u00e4 (immutability). Live-sivusto ei koskaan osoita &#8220;rakenteilla&#8221; olevaan versioon.<\/p>\n\n\n\n<p>K\u00e4yt\u00e4nn\u00f6n taika tapahtuu <code>current<\/code>-symbolisella linkill\u00e4 (symlink): web-palvelin palvelee aina <code>current<\/code>-hakemistosta, joka on vain osoitin johonkin <code>releases\/<\/code>-hakemistossa olevaan julkaisuun.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hakemistorakenne palvelimella<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/srv\/www\/example.com\/\n\u251c\u2500\u2500 current\/             # Symlink aktiiviseen releaseen\n\u251c\u2500\u2500 releases\/            # Kaikki julkaisut\n\u2502   \u251c\u2500\u2500 20250930124530\/\n\u2502   \u251c\u2500\u2500 20250930083045\/\n\u2502   \u2514\u2500\u2500 20250930141622\/  # Uusin\n\u251c\u2500\u2500 shared\/              # Jaettu data releasien v\u00e4lill\u00e4\n\u2502   \u2514\u2500\u2500 uploads\/\n\u2514\u2500\u2500 logs\/\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span>\/srv\/www\/example.com\/<\/span><\/span>\n<span class=\"line\"><span>\u251c\u2500\u2500 current\/             # Symlink aktiiviseen releaseen<\/span><\/span>\n<span class=\"line\"><span>\u251c\u2500\u2500 releases\/            # Kaikki julkaisut<\/span><\/span>\n<span class=\"line\"><span>\u2502   \u251c\u2500\u2500 20250930124530\/<\/span><\/span>\n<span class=\"line\"><span>\u2502   \u251c\u2500\u2500 20250930083045\/<\/span><\/span>\n<span class=\"line\"><span>\u2502   \u2514\u2500\u2500 20250930141622\/  # Uusin<\/span><\/span>\n<span class=\"line\"><span>\u251c\u2500\u2500 shared\/              # Jaettu data releasien v\u00e4lill\u00e4<\/span><\/span>\n<span class=\"line\"><span>\u2502   \u2514\u2500\u2500 uploads\/<\/span><\/span>\n<span class=\"line\"><span>\u2514\u2500\u2500 logs\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>T\u00e4m\u00e4 rakenne on olennainen erityisesti WordPressiss\u00e4, koska <code>uploads<\/code> (media) pit\u00e4\u00e4 olla jaettua dataa: sit\u00e4 ei voi \u201cjulkaista Gitist\u00e4\u201d jokaisen releasen mukana.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mit\u00e4 tapahtuu, kun ajat <code>trellis deploy production<\/code>?<\/h2>\n\n\n\n<p>Kun k\u00e4ynnist\u00e4t deployn, Trellis tekee julkaisun vaiheet erill\u00e4\u00e4n live-koodista ja vaihtaa vasta lopuksi <code>current<\/code>-symlinkin uuteen hakemistoon. Korkealla tasolla prosessi etenee n\u00e4in:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>Initialize: varmistetaan hakemistorakenne ja luodaan uusi timestampattu release-hakemisto (esim. <code>20250930141622<\/code>).<\/li>\n\n\n<li>Update: uusin koodi haetaan Git-reposta erilliseen l\u00e4hdehakemistoon, ei live-sivuston p\u00e4\u00e4lle.<\/li>\n\n\n<li>Prepare: l\u00e4hdekoodi kopioidaan uuden releasen hakemistoon.<\/li>\n\n\n<li>Build: ajetaan <code>composer install<\/code> riippuvuuksien asentamiseksi.<\/li>\n\n\n<li>Share: jaetut tiedostot\/hakemistot (kuten <code>uploads<\/code>) linkitet\u00e4\u00e4n <code>shared\/<\/code>-hakemistosta releasen sis\u00e4\u00e4n.<\/li>\n\n\n<li>Finalize: <code>current<\/code>-symlink p\u00e4ivitet\u00e4\u00e4n osoittamaan uuteen releaseen \u2014 k\u00e4yt\u00e4nn\u00f6ss\u00e4 v\u00e4lit\u00f6n kytkent\u00e4.<\/li>\n\n<\/ol>\n\n\n\n<p>Yhdess\u00e4 hetkess\u00e4 <code>current<\/code> osoittaa vanhaan releaseen, seuraavassa uuteen. Koska mit\u00e4\u00e4n ei ylikirjoiteta &#8220;liven\u00e4&#8221;, julkaisun aikainen rikkoutuminen v\u00e4henee oleellisesti.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tietokanta ei p\u00e4ivity itsest\u00e4\u00e4n \u2014 ja hyv\u00e4 niin<\/h2>\n\n\n\n<p>On t\u00e4rke\u00e4\u00e4 ymm\u00e4rt\u00e4\u00e4 raja: Trelliksen nollakatko koskee ensisijaisesti <em>koodia ja tiedostoja<\/em>. Tietokantamuutokset (schema-migraatiot) ovat erillinen huoli, eik\u00e4 Trellis automaattisesti aja migraatioita osana deployta.<\/p>\n\n\n\n<p>Jos k\u00e4yt\u00e4t Acornia (Roots-maailmassa Laravel-tyylinen framework WordPressiin), voit tehd\u00e4 Laravel-migraatiot ja varmistaa, ett\u00e4 ne ajetaan osana julkaisuprosessia. T\u00e4ll\u00f6in kannattaa suunnitella migraatiot niin, ett\u00e4 ne ovat yhteensopivia sek\u00e4 vanhan ett\u00e4 uuden koodin kanssa (esim. &#8220;expand\/contract&#8221; -malli), jotta v\u00e4lt\u00e4t katkokset my\u00f6s tietokantakerroksessa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rollback ilman paniikkia<\/h2>\n\n\n\n<p>Atomisen ja immuuttisen mallin iso etu on se, ett\u00e4 rollback ei tarkoita tiedostojen \u201cperuuttelua\u201d. Koska vanha release on edelleen kokonaisena olemassa, paluu on k\u00e4yt\u00e4nn\u00f6ss\u00e4 symlinkin k\u00e4\u00e4nt\u00f6 takaisin edelliseen versioon:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>trellis rollback production\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#B392F0\">trellis<\/span><span style=\"color:#9ECBFF\"> rollback<\/span><span style=\"color:#9ECBFF\"> production<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Trellis s\u00e4ilytt\u00e4\u00e4 oletuksena viisi viimeisint\u00e4 releasea palvelimella, jolloin rollback on nopea my\u00f6s tilanteessa, jossa huomaat ongelman vasta hetken k\u00e4yt\u00f6n j\u00e4lkeen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deploy hookit: paikka omille rutiineille<\/h2>\n\n\n\n<p>Harva tuotantoymp\u00e4rist\u00f6 on t\u00e4ysin geneerinen. Trellis tarjoaa deploy hookit (k\u00e4yt\u00e4nn\u00f6ss\u00e4 Ansible-puolen koukut) eri vaiheisiin, jotta voit liitt\u00e4\u00e4 mukaan omia toimenpiteit\u00e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>deploy_build_before<\/code> ja <code>deploy_build_after<\/code>: omat build-askeleet (esim. assettien generointi omalla tavalla).<\/li>\n\n\n<li><code>deploy_finalize_before<\/code> ja <code>deploy_finalize_after<\/code>: teht\u00e4v\u00e4t juuri ennen\/j\u00e4lkeen symlinkin vaihdon.<\/li>\n\n\n<li>Hookit my\u00f6s p\u00e4\u00e4vaiheille: initialize, update, prepare, build, share ja finalize.<\/li>\n\n<\/ul>\n\n\n\n<p>N\u00e4ill\u00e4 saat toteutettua tyypillisi\u00e4 tuotantok\u00e4yt\u00e4nt\u00f6j\u00e4, kuten varmuuskopion ottamisen ennen deployta, v\u00e4limuistien tyhjent\u00e4misen julkaisun j\u00e4lkeen, ilmoitukset tiimille tai kevyet smoke testit uutta releasea vasten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Miten p\u00e4\u00e4set alkuun (ilman ett\u00e4 vaihdat koko workflow\u2019ta)<\/h2>\n\n\n\n<p>Jos tavoite on nollakatko ja helpompi rollback, koko kehitysymp\u00e4rist\u00f6\u00e4 ei ole pakko sitoa Trellikseen. Yleinen malli on: Bedrock-projekti + Trellis pelkk\u00e4\u00e4n deployyn, ja paikallisesti k\u00e4yt\u00e4t sit\u00e4 ymp\u00e4rist\u00f6\u00e4, mik\u00e4 on tiimille luontevin.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>Ota projektipohjaksi Bedrock, jotta WordPress-projekti on selke\u00e4mmin \u201csovellusmainen\u201d (Composer-riippuvuudet, env-konfigurointi, rakenne).<\/li>\n\n\n<li>Asenna Trellis ja m\u00e4\u00e4rit\u00e4 deploy-asetukset.<\/li>\n\n\n<li>Konfiguroi <code>wordpress_sites.yml<\/code> niin, ett\u00e4 Trellis tiet\u00e4\u00e4 Git-repon ja ymp\u00e4rist\u00f6t.<\/li>\n\n\n<li>Aja ensimm\u00e4inen deploy komennolla <code>trellis deploy production<\/code>.<\/li>\n\n<\/ol>\n\n\n\n<div class=\"wp-block-group callout callout-info is-style-info is-layout-flow wp-block-group-is-layout-flow\" style=\"border-width:1px;border-radius:8px;padding-top:1rem;padding-right:1.5rem;padding-bottom:1rem;padding-left:1.5rem\">\n\n<h4 class=\"wp-block-heading callout-title\">K\u00e4yt\u00e4nn\u00f6n huomio<\/h4>\n\n\n<p>Ensimm\u00e4inen deploy kest\u00e4\u00e4 usein pidemp\u00e4\u00e4n, koska hakemistorakenne ja riippuvuudet rakennetaan ensimm\u00e4ist\u00e4 kertaa. Seuraavat deployt ovat tyypillisesti nopeampia \u2014 ja t\u00e4rkeint\u00e4: julkaisu ei tee sivustosta puolikuntoista kesken kaiken.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Yhteenveto<\/h2>\n\n\n\n<p>Trelliksen atominen deploy-malli tuo WordPressiin kaksi asiaa, joita moni on tottunut pit\u00e4m\u00e4\u00e4n \u201centerprise-luksuksena\u201d: nollakatkon julkaisut ja v\u00e4lit\u00f6n rollback. Kun koodi julkaistaan aina uuteen release-hakemistoon ja tuotanto vaihtaa versiota vain <code>current<\/code>-symlinkin avulla, v\u00e4lt\u00e4t in-place-ylikirjoituksen riskit. Tietokanta vaatii edelleen oman suunnittelunsa, mutta koodijulkaisun osalta Trellis antaa huomattavasti vakaamman perusmekaniikan kuin perinteiset WordPress-deployt.<\/p>\n\n\n<div class=\"references-section\">\n                <h2>Viitteet \/ L\u00e4hteet<\/h2>\n                <ul class=\"references-list\"><li><a href=\"https:\/\/roots.io\/zero-downtime-wordpress-deployments-with-trellis\/\" target=\"_blank\" rel=\"noopener noreferrer\">Zero Downtime WordPress Deployments with Trellis<\/a><\/li><li><a href=\"https:\/\/roots.io\/trellis\/docs\/deployments\/\" target=\"_blank\" rel=\"noopener noreferrer\">Trellis documentation: Deployments<\/a><\/li><li><a href=\"https:\/\/roots.io\/acorn\/docs\/creating-and-running-laravel-migrations\/\" target=\"_blank\" rel=\"noopener noreferrer\">Acorn documentation: Creating and running Laravel migrations<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>Perinteinen WordPress-deploy voi rikkoa sivuston juuri silloin, kun k\u00e4ytt\u00e4ji\u00e4 on eniten. Trelliksen atominen julkaisumalli vaihtaa uuden version k\u00e4ytt\u00f6\u00f6n yhdell\u00e4 symlink-p\u00e4ivityksell\u00e4 \u2014 ilman v\u00e4litiloja ja nopealla rollbackilla.<\/p>\n","protected":false},"author":57,"featured_media":108,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[69,73,72,71,10],"class_list":["post-109","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-ekosysteemi","tag-bedrock","tag-deploy","tag-devops","tag-trellis","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/posts\/109","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/users\/57"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/comments?post=109"}],"version-history":[{"count":1,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/posts\/109\/revisions"}],"predecessor-version":[{"id":125,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/posts\/109\/revisions\/125"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/media\/108"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/media?parent=109"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/categories?post=109"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/fi\/wp-json\/wp\/v2\/tags?post=109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}