{"id":129,"date":"2025-10-02T00:00:00","date_gmt":"2025-10-01T22:00:00","guid":{"rendered":"https:\/\/helloblog.io\/ro\/deploy-uri-wordpress-fara-downtime-cu-trellis\/"},"modified":"2026-01-20T06:32:55","modified_gmt":"2026-01-20T05:32:55","slug":"deploy-uri-wordpress-fara-downtime-cu-trellis","status":"publish","type":"post","link":"https:\/\/helloblog.io\/ro\/deploy-uri-wordpress-fara-downtime-cu-trellis\/","title":{"rendered":"Deploy-uri WordPress f\u0103r\u0103 downtime cu Trellis: atomic, imutabil \u0219i cu rollback instant"},"content":{"rendered":"\n<p>\u00cen ecosistemul WordPress, \u201edeploy\u201d \u00eenc\u0103 \u00eenseamn\u0103 prea des copiere de fi\u0219iere peste produc\u021bie: FTP, <code>rsync<\/code>, sau un mecanism \u201eone-click\u201d de la hosting care, \u00een spate, face acela\u0219i lucru. Pentru site-urile cu trafic, magazine WooCommerce sau proiecte unde pui accent pe stabilitate, metoda asta vine cu un risc constant: \u00een fereastra de upload, utilizatorii pot nimeri un amestec de fi\u0219iere vechi \u0219i noi.<\/p>\n\n\n\n<p>Trellis (din suita Roots) vine cu o abordare modern\u0103, standard \u00een lumea aplica\u021biilor web: <strong>zero downtime deployments<\/strong> pe baza unui model <strong>atomic<\/strong> \u0219i <strong>imutabil<\/strong>. Partea bun\u0103: po\u021bi s\u0103-l folose\u0219ti doar pentru deploy, chiar dac\u0103 local lucrezi cu altceva (Valet, Lando, DDEV etc.) \u0219i chiar dac\u0103 serverul nu e provisionat integral cu Trellis.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ce \u00eenseamn\u0103, practic, \u201ezero downtime\u201d la deploy<\/h2>\n\n\n\n<p>\u201eZero downtime\u201d nu e marketing pentru \u201edeploy rapid\u201d, ci o garan\u021bie de comportament: pe tot parcursul procesului de deploy, site-ul r\u0103m\u00e2ne accesibil \u0219i func\u021bional. Diferen\u021ba major\u0103 fa\u021b\u0103 de un deploy clasic e c\u0103 nu se suprascriu fi\u0219ierele direct \u00een directorul servit de web server.<\/p>\n\n\n\n<p>\u00cen loc s\u0103 actualizeze live fi\u0219ierele, Trellis preg\u0103te\u0219te o versiune complet\u0103 a release-ului \u00eentr-un director separat, apoi face comutarea c\u0103tre noua versiune <strong>instant<\/strong>, \u00eentr-un singur pas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">De ce se \u201erupe\u201d WordPress-ul la deploy-urile tradi\u021bionale<\/h2>\n\n\n\n<p>Majoritatea metodelor comune au aceea\u0219i problem\u0103 structural\u0103: modific\u0103 fi\u0219ierele \u00een loc (in-place), \u00een timp ce site-ul ruleaz\u0103:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>FTP<\/strong>: upload manual peste fi\u0219ierele existente; dureaz\u0103 \u0219i serve\u0219ti un mix de versiuni.<\/li>\n\n\n<li><strong>Sincronizare cu <code>rsync<\/code><\/strong>: mai rapid, dar tot suprascriere live; nu exist\u0103 un punct atomic de comutare.<\/li>\n\n\n<li><strong>Deploy prin plugin \/ mecanism de hosting<\/strong>: convenabil, dar de multe ori actualizeaz\u0103 in-place \u0219i nu are rollback real, doar \u201ere-deploy\u201d sau interven\u021bie manual\u0103.<\/li>\n\n<\/ul>\n\n\n\n<p>Efectele sunt previzibile: pagini cu erori intermitente, asset-uri lips\u0103 (CSS\/JS), incompatibilit\u0103\u021bi temporare \u00eentre PHP code \u0219i template-uri, \u0219i un rollback greoi atunci c\u00e2nd ceva nu merge.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cum rezolv\u0103 Trellis: deploy-uri atomice \u0219i imutabile<\/h2>\n\n\n\n<p>Trellis folose\u0219te un model de deploy <strong>atomic<\/strong>: trecerea de la versiunea veche la cea nou\u0103 se face instant. \u0218i un model <strong>imutabil<\/strong>: odat\u0103 ce un release a fost publicat, fi\u0219ierele lui nu mai sunt modificate; fiecare deploy creeaz\u0103 un director nou pentru release.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Structura de directoare: \u201ecurrent\u201d e cheia<\/h3>\n\n\n\n<p>Pe server, Trellis organizeaz\u0103 proiectul \u00eentr-o structur\u0103 predictibil\u0103. Web serverul serve\u0219te mereu din <code>current\/<\/code>, care nu e un director \u201ereal\u201d, ci un symlink c\u0103tre release-ul activ:<\/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 catre release-ul activ\n\u251c\u2500\u2500 releases\/            # Toate release-urile deploy-ate\n\u2502   \u251c\u2500\u2500 20250930124530\/\n\u2502   \u251c\u2500\u2500 20250930083045\/\n\u2502   \u2514\u2500\u2500 20250930141622\/  # Cel mai recent\n\u251c\u2500\u2500 shared\/              # Fisiere partajate intre release-uri\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 catre release-ul activ<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u251c\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> releases\/<\/span><span style=\"color:#6A737D\">            # Toate release-urile deploy-ate<\/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\">  # Cel mai recent<\/span><\/span>\n<span class=\"line\"><span style=\"color:#B392F0\">\u251c\u2500\u2500<\/span><span style=\"color:#9ECBFF\"> shared\/<\/span><span style=\"color:#6A737D\">              # Fisiere partajate intre release-uri<\/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>Rezultatul: nu mai exist\u0103 \u201ejum\u0103t\u0103\u021bi de deploy\u201d. P\u00e2n\u0103 c\u00e2nd nu e gata tot release-ul nou, <code>current<\/code> r\u0103m\u00e2ne pe release-ul vechi.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ce se \u00eent\u00e2mpl\u0103 la <code>trellis deploy production<\/code><\/h3>\n\n\n\n<p>C\u00e2nd rulezi <code>trellis deploy production<\/code>, Trellis parcurge, \u00een esen\u021b\u0103, ace\u0219ti pa\u0219i (fiecare \u00eentr-o zon\u0103 izolat\u0103 de site-ul live):<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>Initialize<\/strong>: verific\u0103\/creeaz\u0103 structura de directoare \u0219i un nou director de release (timestamp).<\/li>\n\n\n<li><strong>Update<\/strong>: cloneaz\u0103 codul din Git \u00eentr-un director de surse separat de site-ul live.<\/li>\n\n\n<li><strong>Prepare<\/strong>: copiaz\u0103 fi\u0219ierele necesare \u00een noul director de release.<\/li>\n\n\n<li><strong>Build<\/strong>: ruleaz\u0103 <code>composer install<\/code> pentru dependen\u021be.<\/li>\n\n\n<li><strong>Share<\/strong>: leag\u0103 (symlink) directoarele\/fi\u0219ierele partajate (de exemplu <code>uploads<\/code>) din <code>shared\/<\/code> c\u0103tre noul release.<\/li>\n\n\n<li><strong>Finalize<\/strong>: schimb\u0103 symlink-ul <code>current<\/code> c\u0103tre noul release.<\/li>\n\n<\/ol>\n\n\n\n<p>Momentul \u201eatomic\u201d este pasul de finalizare: \u00eentr-o clip\u0103, <code>current<\/code> trece de la un release la altul. Nu exist\u0103 fereastr\u0103 \u00een care utilizatorii s\u0103 prind\u0103 fi\u0219iere amestecate.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Baza de date: nu e inclus\u0103 automat \u00een conceptul de zero downtime<\/h2>\n\n\n\n<p>Deploy-ul atomic rezolv\u0103 partea de cod \u0219i fi\u0219iere, dar schema bazei de date e o alt\u0103 discu\u021bie. Conform documenta\u021biei Trellis, <strong>migra\u021biile de baz\u0103 de date nu sunt incluse implicit<\/strong> \u00eentr-un deploy Trellis.<\/p>\n\n\n\n<p>Dac\u0103 folose\u0219ti Acorn, ai op\u021biunea s\u0103 gestionezi schimb\u0103rile de schem\u0103 prin <strong>Laravel migrations<\/strong> (migrations = scripturi versionate care modific\u0103 schema \u00een mod controlat) \u0219i s\u0103 le rulezi ca parte din procesul 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\">Aten\u021bie la compatibilitate \u00een migra\u021bii<\/h4>\n\n\n<p>Chiar \u0219i cu deploy atomic la nivel de fi\u0219iere, o migra\u021bie care schimb\u0103 schema poate introduce incompatibilit\u0103\u021bi dac\u0103 noul cod \u0219i vechiul cod nu pot func\u021biona pe aceea\u0219i schem\u0103 pentru o perioad\u0103 scurt\u0103. Ideal: migra\u021bii compatibile \u00eenapoi (backwards-compatible) sau strategii \u00een doi pa\u0219i.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Rollback instant: beneficiul care schimb\u0103 jocul<\/h2>\n\n\n\n<p>Pentru c\u0103 release-urile sunt imutabile \u0219i p\u0103strate separat, rollback-ul devine o opera\u021biune banal\u0103: Trellis mut\u0103 symlink-ul <code>current<\/code> \u00eenapoi c\u0103tre release-ul anterior. Comanda arat\u0103 a\u0219a:<\/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>Implicit, Trellis p\u0103streaz\u0103 un num\u0103r limitat de release-uri recente pe server (\u00een materialul Roots este men\u021bionat 5). Asta \u00eenseamn\u0103 rollback rapid, f\u0103r\u0103 s\u0103 refaci build-ul \u0219i f\u0103r\u0103 s\u0103 recopiezi fi\u0219iere manual.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hooks de deploy: cum integrezi pa\u0219i custom f\u0103r\u0103 s\u0103 \u201estrici\u201d fluxul<\/h2>\n\n\n\n<p>Un detaliu foarte practic \u00een Trellis este sistemul de <strong>hooks<\/strong> (puncte unde po\u021bi injecta task-uri proprii \u00een pipeline-ul de deploy). Exist\u0103 hook-uri \u00eenainte\/dup\u0103 build \u0219i \u00eenainte\/dup\u0103 finalizare, plus hook-uri pentru fiecare etap\u0103 major\u0103 (initialize, update, prepare, build, share, finalize).<\/p>\n\n\n\n<p>Asta \u00ee\u021bi permite s\u0103 standardizezi lucruri pe care altfel le faci manual sau cu scripturi ad-hoc:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>backup de DB \u00eenainte de deploy<\/li>\n\n\n<li>golire cache (aplica\u021bie, obiect cache, CDN) dup\u0103 comutarea release-ului<\/li>\n\n\n<li>notific\u0103ri c\u0103tre echip\u0103 (Slack\/Email) c\u00e2nd s-a f\u0103cut deploy<\/li>\n\n\n<li>smoke tests rulate pe release-ul nou \u00eenainte de a-l face activ<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Cum \u00eencepi (minimal) dac\u0103 vrei Trellis doar pentru deploy<\/h2>\n\n\n\n<p>Dac\u0103 vrei s\u0103 beneficiezi de deploy-uri zero downtime f\u0103r\u0103 s\u0103-\u021bi schimbi complet fluxul local, pa\u0219ii de baz\u0103 arat\u0103 a\u0219a (conform recomand\u0103rilor Roots):<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>Structureaz\u0103 proiectul pe <strong>Bedrock<\/strong> (organizare mai clar\u0103 a unui proiect WordPress, \u00een special pentru dependen\u021be \u0219i configur\u0103ri).<\/li>\n\n\n<li>Instaleaz\u0103 \u0219i configureaz\u0103 <strong>Trellis<\/strong> pentru mediul \u021bint\u0103 (staging\/production).<\/li>\n\n\n<li>Completeaz\u0103 <code>wordpress_sites.yml<\/code> cu informa\u021biile despre repository-ul Git din care se face deploy.<\/li>\n\n\n<li>Ruleaz\u0103 <code>trellis deploy production<\/code>.<\/li>\n\n<\/ol>\n\n\n\n<p>Primul deploy dureaz\u0103, \u00een mod normal, mai mult (setup de directoare, instalare dependen\u021be). Deploy-urile urm\u0103toare tind s\u0103 fie mai rapide \u0219i, mai important, elimin\u0103 complet fereastra clasic\u0103 \u00een care site-ul poate servi fi\u0219iere inconsistente.<\/p>\n\n\n<div class=\"references-section\">\n                <h2>Referin\u021be \/ Surse<\/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\/acorn\/docs\/creating-and-running-laravel-migrations\/\" target=\"_blank\" rel=\"noopener noreferrer\">Creating and running Laravel migrations | Acorn 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><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>Dac\u0103 ai f\u0103cut vreodat\u0103 deploy pe WordPress \u0219i ai prins fix atunci erori \u201erandom\u201d sau pagini \u00eenc\u0103rcate pe jum\u0103tate, problema e aproape mereu aceea\u0219i: fi\u0219iere suprascrise live. Trellis rezolv\u0103 asta cu deploy-uri atomice \u0219i rollback printr-un simplu symlink switch.<\/p>\n","protected":false},"author":30,"featured_media":128,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[69,73,72,71,10],"class_list":["post-129","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ecosistem-wordpress","tag-bedrock","tag-deployment","tag-devops","tag-trellis","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/posts\/129","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/users\/30"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/comments?post=129"}],"version-history":[{"count":1,"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/posts\/129\/revisions"}],"predecessor-version":[{"id":145,"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/posts\/129\/revisions\/145"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/media\/128"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/media?parent=129"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/categories?post=129"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/ro\/wp-json\/wp\/v2\/tags?post=129"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}