Ferment
Restoranisait, kus broneerimine, kinnituskirjad ja kakskeelsus on kõik oma koodis — ilma page builder'ita ja praktiliselt ilma pluginateta.
Klient: Ferment — pitsa-, pasta- ja veinirestoran Noblessneris Tehtud töö: kohandatud WordPressi teema, broneerimissüsteem, e-kirjade automaatika, kakskeelsus, e-turunduse integratsioon Tehnoloogia: WordPress (kohandatud teema), PHP, vanilla JavaScript, CSS
Lühikokkuvõte
Ferment sai alguse suvise pop-up’ina ja kolis püsivasse asukohta Noblessneris. Uus kodulehekülg pidi kandma sama meeleolu, mis restoran ise — aeglane kääritamine, käsitöö, soojus — ning samal ajal ära lahendama igapäevase praktilise mure: laudade broneerimise.
Tulemuseks on üheleheline sait ilma ühegi page builder’ita ja praktiliselt ilma pluginateta, kus broneerimine, kinnituskirjad, kakskeelsus ja uudiskirjaga liitumine on kõik oma koodis — kiire, hallatav ja täielikult brändi nägu.
Väljakutse
Klient tuli disainikontseptiga (Lovable’is tehtud React/Vite prototüüp) ja praktilise nimekirjaga:
- Broneerimine oli väljaspool saiti. Laudu broneeriti välise teenuse (DinnerBooking) kaudu — link viis külalise saidilt ära, bränd katkes ja restoranil puudus ülevaade oma kodulehel.
- Disain oli ebatavaline. Hõljuvad purgid, suur logotüüp, terrakota-kreem palett ja Playfair Display — tüüpiline restoranimall poleks seda kandnud.
- Sait pidi olema kakskeelne. Tallinna restoran teenindab nii kohalikke kui turiste.
- Haldus pidi olema lihtne. Restoranipere ei ole IT-inimesed — broneeringu kinnitamine peab käima ühe klikiga, ka telefonist.
Lahendus
1. Kohandatud teema, mitte mall
Prototüüp porditi käsitsi kohandatud WordPressi teemaks. Ei Elementorit, ei WPBakeryt, ei kümmet pluginat — kogu sisu elab PHP-mallides ja kogu stiil ühes CSS-failis disainitokenitega:
--bg: hsl(45 100% 95%) /* soe kreem */
--fg: hsl(5 63% 30%) /* terrakota */
Kõige iseloomulikum detail — 27 hõljuvat purki avavaates — on originaali Framer Motion animatsiooni ustav port: seeded pseudojuhuslikud teekonnad, mis genereeritakse JavaScriptis CSS-i @keyframes-ideks. Suuremad purgid triivivad aeglasemalt, väiksemad kiiremini. Null animatsiooniteeki, null lisasõltuvust.
Menüü avaneb kohandatud lightbox’is, mis toetab klaviatuuri (Esc, nooled) ja puuteekraani libistust.
2. Broneerimissüsteem nullist
Väline broneerimislink asendati saidisisese vormiga, mis on kirjutatud samas keeles kui ülejäänud sait.
Külalise vaates: nimi, e-post, telefon, seltskonna suurus, kuupäev, kellaaeg ja vabatahtlik märkuste väli („Kas peaksime midagi teadma?” — allergiad, sünnipäev, istekoha soov). Vorm saadetakse AJAX-iga, ilma lehe uuesti laadimiseta, ja vastus kuvatakse kohe vormi all.
Kohandatud kalender. Brauseri enda date picker ei ole stiliseeritav ega oska nädalapäevi keelata, seega kirjutasime selle asemele oma kalendri: brändivärvides, klaviatuuriga juhitav (nooled, PageUp/Down, Esc), ning möödunud kuupäevad ja esmaspäevad-teisipäevad on hallid ja mitteklikitavad, sest siis on restoran kinni.
Nädalapäevapõhised kellaajad. Klient märkas hiljem, et liiga hiliseid broneeringuid tuli pidevalt tagasi lükata. Lisasime viimase broneeritava aja iga päeva kohta (K 20:30 · N/R/L 21:30 · P 17:30). Ajad on defineeritud ühes kohas ja jagatud nii PHP-le kui JavaScriptile — kellaajamenüü kohandub kohe, kui kuupäev valitakse, ja server valideerib valiku uuesti. Kui restorani lahtiolek muutub, on see ühe rea muudatus.
Turvalisus ja rämpspost: WordPressi nonce, peidetud honeypot-väli botide püüdmiseks ning kogu sisendi puhastamine ja valideerimine serveripoolel. Iga broneering salvestatakse ka wp-admini alla „Bookings” sektsiooni, nii et ükski soov ei kao, isegi kui e-kiri peaks tõrkuma.
3. Kinnita või lükka tagasi — ühe klikiga, ilma sisse logimata
See osa lahendab kliendi tegeliku igapäevatöö.
Iga uue broneeringu kohta saabub brändikujundusega HTML-kiri kahe nupuga: Kinnita ja Lükka tagasi. Nupu vajutamine ei nõua WordPressi sisselogimist — töötaja saab broneeringu kinnitada otse telefonist, kirja seest.
Tehniliselt: iga broneering saab salajase token’i ja nupud viivad avalikku, token’iga kaitstud aadressi. Turvalisuse ja töökindluse nimel:
- token’i võrdlus on timing-safe (
hash_equals), vale või aegunud link ei tee midagi; - GET → POST kaheastmeline kinnitus — e-posti turvaskännerid (nt Outlook Safe Links), mis linke ette laadivad, ei saa kogemata broneeringut kinnitada;
- idempotentne — juba käsitletud broneeringut ei kinnitata teist korda ega saadeta topeltkirja.
Kinnitamisel saab külaline automaatselt brändikujundusega kinnituskirja; tagasilükkamisel viisaka teate koos kutsega leida teine aeg. Sama toiming on ka wp-admini broneeringu vaates (nonce + õiguste kontroll), ning broneeringu staatus (ootel / kinnitatud / tagasi lükatud) on seal värvikoodiga näha.
4. Oma SMTP, mitte plugin
Restoraniäris on kirjade kohalejõudmine kriitiline: kinnituskiri, mis maandub rämpsposti, on sama hea kui saatmata.
Selle asemel et paigaldada e-posti plugin, ühendasime WordPressi enda PHPMaileri otse kliendi postkastiga (phpmailer_init) — autenditud SMTP üle SSL-i. Saatja aadress ja ümbriku saatja (Return-Path) viidi kokku, et SPF ja DKIM ühtiksid. Domeenil on SPF, DKIM ja DMARC p=reject — see tähendab, et valest kohast saadetud kiri lükatakse tagasi, mistõttu oli korrektne SMTP-seadistus tingimata vajalik, mitte lisavõimalus.
Paroolid ei ela teemas ega koodihoidlas, vaid wp-config.php-s. Lisaks tegime wp-admini alla väikese „Email Test” lehe, kust saab ühe klikiga testkirja saata ja näha täpset veateadet, kui midagi on viltu — nii ei pea järgmine hooldaja logisid lappama.
5. Kakskeelsus ilma tõlkepluginata
TranslatePress ja WPML on mõeldud suurtele, andmebaasipõhistele saitidele. Sellel saidil oleks see olnud kahurist varblase pihta.
Selle asemel kirjutasime kerge oma i18n-kihi: üks sõnastikufail (~110 stringipaari), abifunktsioonid, keele tuvastus (?lang= + küpsis) ja EN/ET lüliti nii töölaua- kui mobiilimenüüs. Kaetud on kogu sait — pealkirjad, tekstid, vormiväljad, veateated, 404-leht — ning ka JavaScript: kalender kuvab eestikeelseid kuunimesid ja nädalapäevi (E T K N R L P) ning kuupäevavormingut („11. juuni 2026″).
Kõige olulisem detail: iga broneeringu juurde salvestatakse külalise keel, nii et hilisem kinnitus- või tagasilükkamiskiri saadetakse samas keeles, milles külaline broneeris. Töötajatele suunatud kirjad ja kinnituslehed on seevastu alati eestikeelsed.
6. E-turundus ja detailid
- Klaviyo integreeritud korduvkülastuse ja uudiskirja jaoks, liitumisvorm jaluses.
- Kommentaarid välja lülitatud kogu saidil — restoranisaidil pole neid vaja ja need on rämpsposti magnet.
- Ligipääsetavus: „liigu sisu juurde” link, ARIA-sildid, klaviatuurinavigatsioon,
aria-livevormi tagasisidele. - Jõudlus: emoji-skriptid eemaldatud, versioonitud failid vahemälu jaoks, ei jQueryt ega väliseid teeke.
Tulemus
- Broneerimine toimub nüüd saidil endal — külaline ei lahku brändikeskkonnast ja restoran omab kogu protsessi.
- Ükski broneering ei kao — kirjad ja andmebaas dubleerivad teineteist.
- Kinnitamine käib sekunditega, ka telefonist, ilma sisselogimiseta.
- Külalised saavad kirjad omas keeles, restoranipere haldab kõike eesti keeles.
- Sait on kiire ja hallatav — üks teema, null page builder’it, minimaalne pluginate koorem, kõik seaded ühes failis dokumenteeritud.
Tehniline kokkuvõte
| Valdkond | Lahendus |
|---|---|
| Teema | Kohandatud WordPressi teema, ilma page builder’ita |
| Front-end | Vanilla JS (ei jQueryt, ei animatsiooniteeke), CSS custom properties |
| Broneerimine | AJAX-vorm + kohandatud sisutüüp (custom post type), nonce, honeypot, serveripoolne valideerimine |
| Kalender | Nullist kirjutatud, klaviatuuriga juhitav, suletud päevad blokeeritud |
| E-kirjad | Brändikujundusega HTML-mallid, oma SMTP, SPF/DKIM/DMARC vastavuses |
| Töövoog | Token’iga kaitstud kinnita/lükka tagasi ilma sisselogimiseta + wp-admini nupud |
| Keeled | Oma i18n-kiht (EN/ET), keelepõhised e-kirjad, ei tõlkepluginat |
| Turundus | Klaviyo onsite + uudiskirja liitumisvorm |
Mida sellest projektist kaasa võtame
Kõige rohkem väärtust ei loonud siin mitte disain ega kood eraldi, vaid tähelepanu sellele, kuidas restoran päriselt töötab. Kellaaegade piiramine nädalapäeva kaupa, ühe klikiga kinnitamine ilma sisselogimiseta, keele meelespidamine kuni kinnituskirjani — need on väikesed asjad, mis säästavad iga päev minuteid ja väldivad ebamugavaid vestlusi külalisega.
Ja kogu see loogika mahub ühte teemasse, mille saab järgmine arendaja avada ja aru saada — ilma kümne plugina litsentsi ja ühegi page builder’i lukustuseta.

