{"id":151,"date":"2025-10-02T00:00:00","date_gmt":"2025-10-01T22:00:00","guid":{"rendered":"https:\/\/helloblog.io\/pt\/deploy-wordpress-sem-downtime-com-trellis\/"},"modified":"2026-01-20T06:32:53","modified_gmt":"2026-01-20T05:32:53","slug":"deploy-wordpress-sem-downtime-com-trellis","status":"publish","type":"post","link":"https:\/\/helloblog.io\/pt\/deploy-wordpress-sem-downtime-com-trellis\/","title":{"rendered":"Deploy WordPress sem downtime com Trellis: atomic releases, rollback instant\u00e2neo e hooks"},"content":{"rendered":"\n<p>No ecossistema WordPress ainda \u00e9 comum ver deploys \u201c\u00e0 antiga\u201d: subir ficheiros por FTP, correr um <code>rsync<\/code> para produ\u00e7\u00e3o, ou carregar num bot\u00e3o de um plugin do host. Funciona\u2026 at\u00e9 ao dia em que n\u00e3o funciona: o site fica a servir uma mistura de ficheiros antigos e novos, aparece um erro aleat\u00f3rio no front-office, ou uma p\u00e1gina do admin come\u00e7a a falhar durante aqueles minutos de atualiza\u00e7\u00e3o.<\/p>\n\n\n\n<p>O Trellis (da Roots) traz para WordPress um padr\u00e3o que j\u00e1 \u00e9 banal em aplica\u00e7\u00f5es modernas: <strong>deploy sem downtime<\/strong> com <em>atomic deployments<\/em> (deploy at\u00f3mico). A ideia \u00e9 simples e poderosa: preparar a nova vers\u00e3o isoladamente e s\u00f3 no fim fazer a troca de forma instant\u00e2nea.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O que \u201czero downtime\u201d significa na pr\u00e1tica (e o que n\u00e3o significa)<\/h2>\n\n\n\n<p>Um deploy <em>zero downtime<\/em> garante que o site continua acess\u00edvel e funcional durante todo o processo. Em vez de ires substituindo ficheiros \u201cem cima\u201d do que est\u00e1 em produ\u00e7\u00e3o, fazes um build completo noutro s\u00edtio e s\u00f3 depois apontas o servidor para a nova release.<\/p>\n\n\n\n<p>Importante: isto resolve o lado <strong>do c\u00f3digo e ficheiros<\/strong>. A base de dados \u00e9 outra conversa \u2014 j\u00e1 l\u00e1 vamos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O problema cl\u00e1ssico dos deploys WordPress (FTP, rsync e afins)<\/h2>\n\n\n\n<p>A maioria dos deploys WordPress cai numa destas categorias:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>FTP manual<\/strong>: lento e propenso a inconsist\u00eancias; durante o upload o site pode servir ficheiros parcialmente atualizados.<\/li>\n\n\n<li><strong>Sincroniza\u00e7\u00e3o de ficheiros (ex.: <code>rsync<\/code>)<\/strong>: mais r\u00e1pido do que FTP, mas continua a sobrescrever ficheiros enquanto o site est\u00e1 online.<\/li>\n\n\n<li><strong>Deploy \u201cpor plugin\u201d do host<\/strong>: pr\u00e1tico, mas muitas vezes tamb\u00e9m atualiza in-place e sem uma estrat\u00e9gia robusta de rollback.<\/li>\n\n<\/ul>\n\n\n\n<p>O denominador comum \u00e9 o mesmo: h\u00e1 uma janela em que o utilizador pode apanhar o site num estado interm\u00e9dio, e se algo corre mal, reverter tende a ser manual e stressante.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Como o Trellis resolve: deploy at\u00f3mico e imut\u00e1vel com releases<\/h2>\n\n\n\n<p>O Trellis usa uma abordagem <strong>at\u00f3mica<\/strong> (a mudan\u00e7a de vers\u00e3o acontece num \u00fanico passo) e <strong>imut\u00e1vel<\/strong> (uma release, depois de criada, n\u00e3o \u00e9 \u201cmexida\u201d em produ\u00e7\u00e3o). Cada deploy cria uma pasta nova com o projeto completo e no final troca um symlink para a nova pasta.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Estrutura de diret\u00f3rios que o Trellis cria<\/h3>\n\n\n\n<p>Ao fazer deploy para um servidor com Trellis, ficas tipicamente com uma estrutura deste g\u00e9nero:<\/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>\/srv\/www\/example.com\/\n\u251c\u2500\u2500 current\/             # Symlink para a release ativa\n\u251c\u2500\u2500 releases\/            # Hist\u00f3rico de releases\n\u2502   \u251c\u2500\u2500 20250930124530\/\n\u2502   \u251c\u2500\u2500 20250930083045\/\n\u2502   \u2514\u2500\u2500 20250930141622\/  # Mais recente\n\u251c\u2500\u2500 shared\/              # Ficheiros partilhados entre releases\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 style=\"color:#B392F0\">\/srv\/www\/example.com\/<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u251c\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> current\/<\/span><span style=\"color:#6A737D\">             # Symlink para a release ativa<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u251c\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> releases\/<\/span><span style=\"color:#6A737D\">            # Hist\u00f3rico de releases<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u2502<\/span><span style=\"color:#9ECBFF\">   \u251c\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> 20250930124530\/<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u2502<\/span><span style=\"color:#9ECBFF\">   \u251c\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> 20250930083045\/<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u2502<\/span><span style=\"color:#9ECBFF\">   \u2514\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> 20250930141622\/<\/span><span style=\"color:#6A737D\">  # Mais recente<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u251c\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> shared\/<\/span><span style=\"color:#6A737D\">              # Ficheiros partilhados entre releases<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u2502<\/span><span style=\"color:#9ECBFF\">   \u2514\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> uploads\/<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u2514\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> logs\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>O ponto-chave \u00e9 o <code>current\/<\/code>: o web server serve sempre a partir da\u00ed, mas <code>current<\/code> \u00e9 apenas um symlink. Quando o deploy termina, o Trellis troca esse symlink para a pasta da nova release \u2014 e a \u201ctroca\u201d \u00e9 imediata.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">O que acontece quando executas <code>trellis deploy production<\/code><\/h3>\n\n\n\n<p>O fluxo de deploy do Trellis \u00e9 dividido em etapas bem definidas. Em alto n\u00edvel, funciona assim:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>Initialize<\/strong>: garante a estrutura (<code>current<\/code>, <code>releases<\/code>, <code>shared<\/code>, etc.) e cria uma pasta nova de release (timestamp).<\/li>\n\n\n<li><strong>Update<\/strong>: faz clone do reposit\u00f3rio Git para uma \u00e1rea tempor\u00e1ria, separada do site live.<\/li>\n\n\n<li><strong>Prepare<\/strong>: copia os ficheiros necess\u00e1rios para a nova release.<\/li>\n\n\n<li><strong>Build<\/strong>: corre <code>composer install<\/code> para instalar depend\u00eancias.<\/li>\n\n\n<li><strong>Share<\/strong>: faz symlink de diret\u00f3rios\/ficheiros partilhados (por exemplo <code>uploads<\/code>) a partir de <code>shared\/<\/code> para a nova release.<\/li>\n\n\n<li><strong>Finalize<\/strong>: atualiza o symlink <code>current<\/code> para apontar para a nova release.<\/li>\n\n<\/ol>\n\n\n\n<p>O resultado \u00e9 que n\u00e3o existe aquela fase perigosa em que o utilizador apanha metade do tema novo com metade do plugin antigo. Ou est\u00e1s na release anterior, ou na release nova.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Base de dados: o ponto onde \u201czero downtime\u201d exige cuidado extra<\/h2>\n\n\n\n<p>O Trellis trata do deploy do <strong>codebase<\/strong>, mas <strong>n\u00e3o inclui migra\u00e7\u00f5es de base de dados para um novo schema como parte do deploy<\/strong> (segundo a documenta\u00e7\u00e3o do Trellis). Ou seja: se a tua atualiza\u00e7\u00e3o implica altera\u00e7\u00f5es estruturais na BD, tens de planear isso separadamente.<\/p>\n\n\n\n<p>Se usas Acorn (o framework da Roots que traz componentes do Laravel para WordPress), podes criar e executar <strong>Laravel migrations<\/strong> no contexto do teu projeto WordPress e integr\u00e1-las no processo de deploy.<\/p>\n\n\n\n<div class=\"wp-block-group callout callout-warning is-style-warning 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\">Regra pr\u00e1tica para migra\u00e7\u00f5es<\/h4>\n\n\n<p>Mesmo com deploy at\u00f3mico de ficheiros, uma migra\u00e7\u00e3o \u201cbreaking\u201d na BD pode introduzir downtime funcional (erros, dados inconsistentes) se n\u00e3o for backward-compatible. Planeia migra\u00e7\u00f5es com cuidado e, quando poss\u00edvel, em etapas compat\u00edveis com vers\u00f5es antigas e novas.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Rollback instant\u00e2neo: a vantagem que muda o jogo<\/h2>\n\n\n\n<p>Deploy imut\u00e1vel d\u00e1-te um benef\u00edcio imediato: <strong>rollback r\u00e1pido<\/strong>. Como cada release \u00e9 uma pasta completa e n\u00e3o \u00e9 alterada ap\u00f3s o deploy, reverter \u00e9 s\u00f3 voltar a apontar o symlink <code>current<\/code> para a release anterior.<\/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>Por defeito, o Trellis mant\u00e9m <strong>as cinco releases mais recentes<\/strong> no servidor, o que costuma ser suficiente para reverter rapidamente se apanhares um bug em produ\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hooks de deploy: onde personalizas o processo sem \u201cgambiarras\u201d<\/h2>\n\n\n\n<p>Na pr\u00e1tica, quase ningu\u00e9m quer um deploy completamente \u201cpuro\u201d. Queres limpar cache, correr verifica\u00e7\u00f5es, tirar backups, notificar a equipa. O Trellis prev\u00ea isso com <strong>hooks<\/strong> (pontos de extens\u00e3o do processo) em v\u00e1rias fases.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>deploy_build_before<\/code> e <code>deploy_build_after<\/code> para passos extra de build.<\/li>\n\n\n<li><code>deploy_finalize_before<\/code> e <code>deploy_finalize_after<\/code> para tarefas imediatamente antes\/depois da troca do symlink.<\/li>\n\n\n<li>Hooks para cada grande etapa: initialize, update, prepare, build, share e finalize.<\/li>\n\n<\/ul>\n\n\n\n<p>Isto permite padr\u00f5es \u00fateis como: backup antes do deploy, limpeza de caches depois da troca, notifica\u00e7\u00f5es, ou at\u00e9 <em>smoke tests<\/em> contra a release rec\u00e9m-preparada.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Como come\u00e7ar (sem teres de mudar o teu setup local)<\/h2>\n\n\n\n<p>Um detalhe que muita gente n\u00e3o percebe \u00e0 primeira: n\u00e3o precisas de adotar Trellis como \u201cworkflow completo\u201d para tirares proveito do deploy at\u00f3mico. D\u00e1 para usares o teu ambiente local preferido (Valet, Lando, DDEV, etc.) e ficares com o Trellis apenas para a parte do deploy.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>Estrutura o projeto com <strong>Bedrock<\/strong> (organiza\u00e7\u00e3o mais moderna do WordPress e depend\u00eancias via Composer).<\/li>\n\n\n<li>Instala e configura o <strong>Trellis<\/strong> para os teus ambientes e credenciais de deploy.<\/li>\n\n\n<li>No <code>wordpress_sites.yml<\/code>, aponta para o teu reposit\u00f3rio Git (fonte do c\u00f3digo).<\/li>\n\n\n<li>Executa <code>trellis deploy production<\/code> para o primeiro deploy.<\/li>\n\n<\/ol>\n\n\n\n<p>O primeiro deploy tende a demorar mais porque cria a estrutura no servidor e instala tudo. A partir da\u00ed, os deploys ficam mais previs\u00edveis \u2014 e, mais importante, sem aquela janela de risco em que o site pode ficar \u201ca meio\u201d.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resumo do que ganhas com Trellis neste cen\u00e1rio<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Deploys <strong>sem downtime<\/strong> ao evitar sobrescrever ficheiros em produ\u00e7\u00e3o.<\/li>\n\n\n<li>Mudan\u00e7a <strong>at\u00f3mica<\/strong> via symlink (<code>current<\/code>) \u2014 ou est\u00e1s numa release, ou noutra.<\/li>\n\n\n<li>Releases <strong>imut\u00e1veis<\/strong>, facilitando debugging e previsibilidade.<\/li>\n\n\n<li><strong>Rollback<\/strong> em segundos com <code>trellis rollback<\/code>.<\/li>\n\n\n<li><strong>Hooks<\/strong> para encaixar cache, backups, testes e automatismos no pipeline.<\/li>\n\n<\/ul>\n\n\n<div class=\"references-section\">\n                <h2>Refer\u00eancias \/ Fontes<\/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\">Deployments | Trellis Documentation<\/a><\/li><li><a href=\"https:\/\/roots.io\/bedrock\/\" target=\"_blank\" rel=\"noopener noreferrer\">Bedrock<\/a><\/li><li><a href=\"https:\/\/roots.io\/trellis\/\" target=\"_blank\" rel=\"noopener noreferrer\">Trellis<\/a><\/li><li><a href=\"https:\/\/roots.io\/acorn\/docs\/creating-and-running-laravel-migrations\/\" target=\"_blank\" rel=\"noopener noreferrer\">Creating and running Laravel migrations | Acorn Documentation<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>Se j\u00e1 fizeste deploy via FTP\/rsync e apanhaste o site a meio, com ficheiros \u201cmisturados\u201d, isto \u00e9 para ti. O Trellis aplica uma estrat\u00e9gia moderna de *atomic deployments* para mudar de vers\u00e3o por symlink \u2014 r\u00e1pido, previs\u00edvel e com rollback imediato.<\/p>\n","protected":false},"author":28,"featured_media":149,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22],"tags":[62,65,66,64,10],"class_list":["post-151","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ecossistema-wordpress","tag-bedrock","tag-deploy","tag-devops","tag-trellis","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/posts\/151","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/comments?post=151"}],"version-history":[{"count":1,"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/posts\/151\/revisions"}],"predecessor-version":[{"id":162,"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/posts\/151\/revisions\/162"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/media\/149"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/media?parent=151"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/categories?post=151"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/tags?post=151"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}