De ce am plecat de pe WordPress după 15 ani

Pe WordPress, blogul meu stătea în 181 de tabele, 26 de pluginuri și un PHP pe care trebuia să-l păzesc zi și noapte. Site-ul pe care îl citești acum e un teanc de fișiere gata tipărite, pe care n-are prea ce să se spargă.
Îți spun de la început de unde vin: scriu aici din 2012, lucrez în marketing de peste 15 ani și nu sunt programator. Platforma nouă am construit-o cu ajutorul AI (da, Claude a scris codul, eu am pus întrebările, banii și frânele), pe serverul meu. Nimeni nu mă plătește să laud sau să înjur vreo tehnologie din articolul ăsta.
Mai jos îți arăt de ce am plecat, ce folosesc acum, ce am mutat, ce am construit după mutare și ce m-a costat. Inclusiv ce am stricat, că și aia face parte.
De ce am plecat, cu cifre, nu cu nervi
Baza de date ajunsese la 954 MB și 181 de tabele. Din ele, cam 130 erau rămășițe de la pluginuri șterse de ani. Un singur tabel, al unui plugin de newsletter care nu mai există, ocupa 363 MB.
Tradus: mai bine de o treime din baza mea de date era un cadavru.
Recunosc, o parte din mizerie era opera mea. 15 ani de „hai să încerc și pluginul ăsta" se adună. Dar restul e felul în care funcționează WordPress: fiecare plugin lasă urme, iar urmele rămân și după ce pluginul pleacă.
Pagina unui articol îți trimitea 134 KB de HTML, 18 fișiere de JavaScript, 14 fișiere de CSS și contacta 15 domenii străine. Ca să citești text.
Iar la ușă se bătea non-stop. wp-login.php primea încercări de autentificare zilnic, xmlrpc.php la fel. Am văzut pe serverul meu un site care ardea constant 65% dintr-un procesor doar din cereri către xmlrpc.php. La un vârf de trafic, PHP-ul blogului a rămas de două ori fără memorie și site-ul a picat scurt. Atât mi-a trebuit.
Ce folosesc acum
Două piese, ținute deliberat la distanță una de alta.
Site-ul public e făcut cu Astro și e static. Gândește-te la WordPress ca la un bucătar care îți gătește pagina de fiecare dată când o ceri: la fiecare vizită, PHP-ul se apucă de treabă. Un site static e o carte deja tipărită. O iei de pe raft și o citești. N-are ce să dea eroare la tipar când tu ești deja cu ea în mână.
Partea în care scriu e un CMS separat, Payload, cu baza lui PostgreSQL. Stă pe altă adresă, în spatele Cloudflare, cu autentificare în doi pași. E biroul meu, cu ușa încuiată. Tu nu treci niciodată prin el.
Totul rulează pe serverul meu, un VPS la Viena, administrat prin Coolify: un fel de administrator de bloc pentru aplicații, care le pornește, le supraveghează și le face rost de certificate. În față, peste tot, Cloudflare.
Am cântărit și varianta „WordPress headless", adică să țin WordPress la scris și să servesc site-ul altfel. Am renunțat repede: păstra PHP-ul, tabelele, pluginurile și atacurile. Adică fix ce voiam să las în urmă.
Ce am mutat
La momentul mutării: 3.476 de articole, 24.863 de comentarii, peste 11.300 de imagini, 21 de categorii și 989 de etichete. Nicio adresă schimbată.
Textul a fost verificat automat, articol cu articol, literă cu literă. Potrivirea a ieșit 100% în medie, iar cel mai prost articol a ieșit 99,58%, cu diferențele scrise una câte una într-un fișier.
E ca și cum ai muta o bibliotecă strânsă în 15 ani dintr-o casă în alta și, la final, fiecare carte e pe același raft, deschisă la aceeași pagină.
N-am luat tot, să fie clar. Am găsit 3 GB de backupuri uitate prin foldere și mii de imagini redimensionate pentru rubrici care nu mai există. Alea au rămas acolo. Mutarea e cel mai bun prilej să nu-ți cari și praful după tine.
Iar de atunci am mai și tăiat
Cifrele de mai sus sunt de la mutare. De atunci am șters peste o sută de articole și o să mai șterg.
Nu e nostalgie prost înțeleasă, e curățenie. Un articol din 2013 despre cum faci update la WordPress 3.6 nu ajută pe nimeni azi. Îmi diluează doar blogul și îl pune pe Google să aleagă între mine cel de acum și mine cel de acum doisprezece ani.
Recunosc că pe WordPress n-aș fi făcut-o. Nu fiindcă n-aș fi putut, ci fiindcă nu vedeam ce am. Când tot conținutul stă într-o bază de date la care ajungi prin trei ecrane, nu-ți faci o imagine. Când stă în fișiere pe care le poți căuta și număra dintr-o comandă, îți sare în ochi cât cari degeaba.
Comentariile s-au întors, cu ușa păzită
Prima variantă a site-ului nou avea comentariile doar ca arhivă: cele peste 24.000 vechi rămâneau publicate, dar nu puteai să scrii unul nou. Mi-a lipsit repede.
Acum poți comenta din nou. Comentariile sunt ale mele, nu ale nimănui altcuiva: nu e Disqus, nu e Facebook, nu vine niciun script străin în pagina ta. Intră direct la mine în CMS, în moderare.
Ce nu vezi tu: formularul e semnat, are câteva capcane pentru roboți, și un cântar care pune un scor pe fiecare mesaj. Ce miroase a spam ajunge într-un folder separat, nu la coș. Diferența contează: dacă arunci direct, într-o zi arunci și un om.
Adresa ta de email, dacă o lași, e folosită la un singur lucru: să te anunț când ți-am răspuns. Nu ajunge publică, nu ajunge în fișierele site-ului și nu ajunge pe nicio listă.
Rubrica de dimineață se scrie singură
De la mutare am adăugat ceva ce pe WordPress n-aș fi încercat: o rubrică zilnică de știri, „Cafeaua cu știri".
Cum merge: dimineața devreme, un program citește vreo două duzini de surse, aruncă duplicatele, alege 7 știri, scrie ediția în vocea mea și mi-o pune ca ciornă în CMS. Eu o citesc de pe telefon și apăs Publică. Dacă n-o aprob până la prânz, newsletterul zilei se anulează singur.
Partea cu „apăs eu" nu e cochetărie. E regula casei și rămâne așa: nimic scris de AI nu ajunge pe blog fără să fi trecut prin mine. Ediția are și o etichetă care spune limpede că e scrisă cu AI, iar eticheta aia nu se scoate.
Ce face AI-ul aici, și ce nu-l las să facă
Am câteva butoane în editor.
- Propune SEO citește articolul și îmi propune titlul, descrierea și câteva întrebări cu răspunsuri, luate strict din ce am scris, nu inventate. Le văd într-un panou și aplic doar ce-mi place, câmp cu câmp.
- Generează imaginea îmi face coperta. Coperta articolului ăstuia, de exemplu.
- Propune un răspuns e cel mai nou. Când intră un comentariu, primesc pe telefon textul lui și o propunere de răspuns scrisă în stilul meu. Dacă e bună, o trimit dintr-o apăsare. Dacă nu, scriu eu.
Regula e aceeași peste tot: butonul propune, omul decide. Nicio generare în masă, niciun articol scris de AI fără să treacă prin mine. Dacă te interesează cum se scrie în era răspunsurilor generate de AI, am povestit pe larg în articolul despre GEO.
Mai rapid pentru tine, mai discret cu datele tale
Paginile de articol nu încarcă niciun script de la alții. Ce încarcă e al meu: statisticile Umami, găzduite tot la mine, plus câțiva kilobytes pentru partajare și comentarii.
Nici filmele moștenite din vechile articole, peste 800 la număr, nu fac excepție. Vezi o imagine cu un buton de play, iar YouTube sau Facebook află de tine abia dacă apeși. Până atunci, browserul tău nu vorbește deloc cu ei.
Umami nu pune cookie-uri și nu te identifică. De aia n-ai mai văzut banner de cookie-uri pe blog: n-are ce să anunțe. La schimb au zburat Google Analytics, Tag Manager și bannerul lor, vreo 60 KB de JavaScript la fiecare pagină.
Iar căutarea merge acum cu și fără diacritice: „bucatarie" și „bucătărie" găsesc același lucru. Pare mărunt. Nu e, dacă scrii în română.
Nu poți sparge o ușă care nu există
Pe site-ul public nu mai există wp-login.php, nu mai există xmlrpc.php, nu mai există PHP deloc. Fișiere și atât.
Antetele de securitate, care pe site-ul vechi lipseau cu desăvârșire, sunt acum la locul lor. CMS-ul, singura poartă prin care se poate scrie, stă în spatele Cloudflare, cu autentificare în doi pași. Iar serverul nu mai răspunde direct nimănui: dacă nu vii prin Cloudflare, nu intri.
Backup? În fiecare noapte, automat, criptat, în alt colț de lume decât serverul. Și, mai important, l-am și restaurat de probă, ca să știu că nu e doar un fișier care se umflă frumos. Un backup neîncercat e o promisiune, nu o plasă.
Și acum partea la care am dat-o în bară
N-a fost curat. Mutarea a mers, dar după ea am descoperit lucruri rupte pe care nu le vedea nimeni.
Cel mai scump: linkurile mele de recomandare, alea scurte de forma /go/ceva, au dat eroare 404 două zile întregi. Peste 250 de linkuri, în vreo 90 de articole. Pe WordPress le rezolva un plugin. La mutare am adus în CMS lista lor, dar am uitat să construiesc drumul propriu-zis. Nimeni nu s-a plâns, fiindcă cine dă click pe un link stricat pur și simplu pleacă.
Concret: am pierdut bani și n-am aflat de la mine. Am aflat la o verificare făcută două zile mai târziu.
Ce am învățat din asta e mai util decât reparația: dacă nimic nu verifică automat un lucru, lucrul ăla o să se strice în tăcere. Așa că acum am verificări care se plâng singure. La fiecare schimbare de cod, o listă de teste trece prin formularul de contact, prin newsletter, prin comentarii și prin toate linkurile de recomandare. Dacă unul e rupt, aflu în două minute, nu în două zile.
Ce m-a costat, cinstit
Serverul e ceva mai scump decât găzduirea de dinainte, dar pe el stau mai multe site-uri, nu doar blogul. Domeniul e domeniu. Iar la capitolul nou: plătesc lunar tokeni AI, adică uneltele cu care scriu și administrez. Suma variază după cât le pun la treabă.
Cel mai mult m-a costat însă timpul. Nu zile, săptămâni. Nu-ți vinde nimeni mutarea asta ca pe o după-amiază.
Și n-o recomand oricui. Dacă WordPress îți merge și nu te doare nimic, stai acolo. Eu am plecat fiindcă mă durea: baza umflată, atacurile, paginile grele, senzația că întrețin o casă în care nu mai stau decât pluginurile.
WordPress mi-a ținut blogul 15 ani și nu-l vorbesc de rău. Doar că ajunsesem să lucrez pentru platformă, nu invers.
Dacă pleci, nu pleca după modă. Pleacă atunci când poți spune, cu cifre, ce anume te doare.
Iar apoi verifică. Mereu verifică.
Întrebări frecvente
Pe ce rulează blogul acum?
Site-ul public e generat static cu Astro, iar scrisul se întâmplă în Payload CMS, cu o bază PostgreSQL. Totul rulează pe un server propriu, administrat prin Coolify, cu Cloudflare în față.
S-a stricat vreo adresă veche la mutare?
Nu. Toate articolele au rămas la aceleași adrese. Unde am șters articole între timp, adresa veche trimite mai departe sau spune cinstit că pagina nu mai există, în loc să dea o eroare seacă.
Se pot lăsa comentarii pe blog?
Da. Comentariile sunt găzduite la mine, cu moderare, fără niciun script străin în pagină. Cele peste 24.000 de comentarii vechi au rămas publicate.
Trebuie să fii programator ca să faci mutarea asta?
Eu nu sunt. Ai nevoie de răbdare, de un buget pentru tokeni AI și de obiceiul de a nu accepta un răspuns pe care nu-l înțelegi. Partea în care AI-ul scrie codul e cea ușoară; partea grea e să știi ce ceri și să verifici ce primești.
Cât a durat mutarea?
Săptămâni, nu zile, și asta doar pentru mutarea propriu-zisă. Reparațiile de după au continuat, fiindcă unele lucruri rupte se văd abia când le caută cineva.
Învață AI în 21 de zile, gratuit
4 comentarii
Un demers cel puțin interesant pentru tine Gabriel... nu pot decât să te felicit pentru ambiție. Altfel sunt curios de Umami, am intrat și eu pe site dar m-am blocat la capitolul prețuri și n-am stat să aprofundezi. Cât privește banii pe care zici că i-ai pierdut, la câți vizitatori ai momentan pe site nu e o pierdere prea mare. Ca fapt divers, știi că un site e profilat și prin intermediul brower-ului, nu? Adică chiar fără nici un fel de cod pe site, cel puțin Chrome colectează diverse date despre site-urile pe care le accesăm și pune informația cap la cap.
Mulțumesc. La Umami nu vreau să-ți dau cifre pe care să le inventez acum, așa că uită-te tu pe grila lor: ideea e că poate fi ținut și pe server propriu, iar acolo plătești serverul, nu abonamentul. La partea cu browserul ai dreptate, Chrome adună date indiferent ce fac eu în pagină. Diferența e la ce controlez: pe WordPress trimiteam cititorul către 15 domenii străine, acum nu mai plec eu cu datele lui în lume. Restul ține de browserul pe care îl alege fiecare. Iar la bani, da, nu e o pierdere mare. Mă interesa mai mult să văd unde ajung decât cât recuperez.
Vezi că totuși ai câteva chestii care se stochează în browserul vizitatorului: ceva de la Amazon, ceva de la Google (Trust Tokens sau Privacy Sandbox) și mecanismul bfcache.
Mersi, e genul de observație care ajută. Sincer, nu am verificat punct cu punct ce se stochează în browser după mutare, așa că nu îți pot spune acum de unde vine fiecare, mai ales partea de la Amazon. Mă uit. Ce am urmărit a fost să scot scripturile străine din pagină (comentariile sunt la mine, fără Disqus sau Facebook), dar clar nu înseamnă zero. bfcache e altă poveste, e mecanism al browserului, nu ceva pus de mine. Dacă ai lista exactă din DevTools, o iau ca atare.