OW Agenda — Dokumentacioni
Rezervimi i takimeve online dhe axhenda e përditshme, brenda WordPress, pa abonim. Autor: OptionWeb — Julien Daniel Faqja e plugin-it: https://optionweb.dev/sq/addons/ow-agenda/ Licenca: GPL-2.0-or-later Versioni i mbuluar nga ky dokument: 1.3.1
Tabela e përmbajtjes
- Përmbledhje
- Instalimi
- Fillim i shpejtë
- Rrjedha e rezervimit
- Verifikimi i dyfishtë me email
- Miratimi i kërkesave
- Faqja Axhenda
- Regjistri i klientëve
- Ftesat për seancë
- Email-et dhe skedari i kalendarit (ICS)
- Kujtesat dhe detyra e planifikuar
- Anti-spam dhe kufijtë e shpejtësisë
- GDPR
- Shortkodet
- REST API
- Referencë e cilësimeve
- Të dhënat e ruajtura
- Ndërkombëtarizimi
- Çinstalimi
- Zgjidhja e problemeve
- FAQ
- Changelog
Përmbledhje
OW Agenda i shton WordPress-it një sistem të plotë takimesh: një faqe publike ku vizitori zgjedh ditën e pastaj orën, dhe një faqe « Axhenda » e mbrojtur me kyçje, e menduar për t'u përdorur nga telefoni, ku ju e drejtoni ditën.
Gjithçka qëndron brenda sajtit. Asnjë shërbim i jashtëm, asnjë API e palës së tretë,
asnjë abonim: intervalet llogariten nga serveri juaj, takimet jetojnë në tabelat tuaja
MySQL, email-et nisen përmes wp_mail().
Çfarë vjen me të (gjithçka falas, GPL-2):
- Rezervim online: zgjedhje e ditës, zgjedhje e intervalit, formular i shkurtër, kutiza e pëlqimit GDPR
- Opt-in i dyfishtë me email: një kërkesë bëhet reale vetëm pasi klikohet një lidhje miratimi — botët nuk arrijnë kurrë te axhenda
- Miratim manual (i rekomanduar) ose konfirmim automatik, me butonat Konfirmo / Refuzo direkt brenda email-it të njoftimit (lidhje të firmosura HMAC, pa kyçje)
- Faqe « Axhenda » mobile-first: pamja e ditës, kërkesat në pritje, takime telefonike të shtuara me dorë, bllokim intervalesh, riplanifikim, statuset kryer / mungoi
- Regjistër klientësh: kërkim, krijim, redaktim, fshirje; ushqehet automatikisht nga takimet e miratuara
- Ftesa për seancë: një lidhje private i lejon një klienti ekzistues të zgjedhë datën e seancës së tij, mbi një shërbim dhe një kohëzgjatje që caktoni ju
- Email-e HTML të kujdesura me bashkëngjitje ICS (shtim në kalendarin e telefonit me një lëvizje), kujtesë automatike një ditë përpara, anulim online nga klienti
- Anonimizim automatik i takimeve të kaluara, pastrim i kërkesave që nuk u miratuan kurrë
- REST API e plotë nën namespace-in
owag/v1
Çfarë NUK bën, me qëllim:
- Pa pagesa online: OW Agenda e cakton takimin, nuk arkëton kapar (përdorni WooCommerce nëse kjo është nevoja juaj)
- Një axhendë e vetme: pa menaxhim shumë-profesionistësh dhe pa shumë burime; plugin-i përshkruan një orar, atë të sajtit
- Pa sinkronizim të dyanshëm me Google Calendar ose Outlook: kalendari i klientit përditësohet me skedar ICS (vetëm në një drejtim), padisponueshmëritë tuaja personale shënohen si bllokime
- Pa katalog shërbimesh nga ana e vizitorit: rezervimi publik ka të bëjë me një shërbim të vetëm (emërtim dhe kohëzgjatje të konfigurueshme); shërbimet e tjera kalojnë përmes ftesave për seancë
- Pa takime të përsëritura, pa videokonferencë, pa sallë pritjeje
Kjo listë është një zgjedhje arkitekture, jo një roadmap i fshehur: një axhendë e thjeshtë që nuk e gabon kurrë intervalin vlen më shumë se një makineri e ndërlikuar që askush nuk guxon ta prekë.
Instalimi
Nga .zip-i
- Shkarkoni
ow-agenda-1.3.1.zipnga https://optionweb.dev/sq/addons/ow-agenda/ - Plugins → Add New → Upload Plugin
- Zgjidhni skedarin, klikoni Install Now, pastaj Activate
Me FTP
Shpaketoni arkivin dhe vendosni dosjen ow-agenda në /wp-content/plugins/,
pastaj aktivizojeni plugin-in nga Plugins.
Kërkesat
- WordPress 6.3 ose më i ri
- PHP 7.4 ose më i ri (8.1+ i rekomanduar)
- MySQL 5.7+ / MariaDB 10.2+ — funksionet
GET_LOCK()/RELEASE_LOCK()përdoren për të serializuar rezervimet e njëkohshme - Një dërgim email-esh që funksionon. Kjo është e vetmja varësi reale e plugin-it: e gjithë rrjedha (miratimi, konfirmimi, kujtesa, anulimi) kalon përmes email-it. Në një hosting të përbashkët, instaloni një plugin SMTP përpara se ta hidhni axhendën online.
Çfarë instalohet
Në aktivizim, OW Agenda krijon tri tabela:
| Tabela | Përmbajtja |
|---|---|
{prefix}_owag_appointments | Të gjitha ngjarjet e axhendës: konsulta nga uebi, seanca nga një ftesë, takime të shënuara me dorë, bllokime intervalesh |
{prefix}_owag_invites | Lidhjet private « zgjidhni datën e seancës suaj » |
{prefix}_owag_customers | Regjistri i klientëve |
…dhe, vetëm herën e parë, dy faqe të publikuara:
- « Rezervo një takim » — përmban shortkodin
[ow_agenda] - « Axhenda » — përmban shortkodin
[ow_agenda_admin]
Identifikuesit e tyre ruhen në opsionet owag_page_booking dhe owag_page_admin;
flamuri owag_pages_created garanton që një çaktivizim i ndjekur nga një riaktivizim
nuk krijon dublikata. Ju mund t'i riemërtoni këto faqe, t'i vendosni në një meny, t'u
ndryshoni permalinkun: plugin-i i ndjek sipas ID-së së tyre.
Aktivizimi shton gjithashtu:
- aftësinë
owag_managete roli administrator — është ajo, dhe jomanage_options, që hap axhendën dhe rrugët REST të administrimit; - cilësimet e parazgjedhura në opsionin
owag_settings; - detyrën e planifikuar për orë
owag_hourly_event(ekzekutimi i parë 5 minuta pas aktivizimit).
Një sekret HMAC (owag_admin_secret, 64 karaktere, i pangarkuar automatikisht) gjenerohet
te njoftimi i parë drejt administratorit: është ai që firmos butonat
Konfirmo / Refuzo të email-eve.
T'i jepni akses dikujt tjetër
Faqja Axhenda është e dukshme për çdo përdorues të kyçur që zotëron owag_manage.
Për t'ia hapur axhendën një asistenteje pa i dhënë çelësat e sajtit:
// À exécuter une fois (mu-plugin, ou plugin de gestion des rôles).
$role = get_role( 'editor' );
if ( $role ) { $role->add_cap( 'owag_manage' ); }
Fillim i shpejtë
Pas aktivizimit, shkoni te OW Agenda (menyja kryesore e administrimit). Ekrani i cilësimeve zë një faqe të vetme; pesë minuta mjaftojnë.
1. Oraret e hapjes
Për çdo ditë të javës, vendosni një hapësirë kohore (09:00 → 18:00) dhe, nëse e ndani
mesditën, një hapësirë të dytë (14:00 → 18:30). Një ditë e lënë bosh është ditë e
mbyllur. Si parazgjedhje: nga e hëna deri të premten, 09:00–18:00; e shtuna dhe e diela
të mbyllura.
Oraret interpretohen në zonën kohore të sajtit (Settings → General → Timezone). Verifikojeni përpara se të hapni rezervimin: të gjitha datat ruhen në orën lokale.
2. Shërbimi që rezervohet online
- Emërtimi i konsultës — ajo që vizitori sheh si titull të widget-it (« Konsultë », « Takimi i parë », « Vlerësim »…)
- Kohëzgjatja e konsultës — 60 minuta si parazgjedhje. Është kjo kohëzgjatje që bllokohet në axhendë.
- Hapi i intervaleve — distanca mes dy orëve të ofruara (30 minuta si parazgjedhje). Me një kohëzgjatje 60 dhe një hap 30, ju ofroni 9:00, 9:30, 10:00… dhe takimi i parë i marrë në 9:30 i heq nga lista 9:00 dhe 10:00.
- Pauza mes dy takimeve — minuta frymëmarrjeje të shtuara nga të dyja anët e çdo intervali kandidat (0 si parazgjedhje).
3. Afatet
- Afati minimal i rezervimit — 24 orë si parazgjedhje: një vizitor nuk mund të rezervojë për brenda një ore.
- Horizonti i rezervimit — 60 ditë si parazgjedhje: përtej tij nuk ofrohet më asgjë.
- Anulimi online nga klienti — deri 24 orë përpara takimit; pas këtij afati, faqja e anulimit e fton të telefonojë.
4. Miratimi dhe email-et
- Konfirmimi i kërkesave: miratim manual (i rekomanduar) ose konfirmim automatik.
- Verifikim i dyfishtë me email: lëreni të shënuar. Është mbrojtja më e mirë anti-bot e plugin-it.
- Njoftimet e administrimit dërgohen te: adresa juaj. Si parazgjedhje, email-i i administrimit të sajtit.
Ruani, pastaj hapni faqen « Rezervo një takim »: widget-i shfaq 14 ditët e ardhshme dhe intervalet tuaja të lira. Jeni online.
5. Axhenda në telefon
Hapni faqen « Axhenda » në telefonin tuaj, kyçuni, pastaj përdorni « Shto në ekranin bazë ». Plugin-i publikon një manifest aplikacioni: faqja hapet atëherë në ekran të plotë, pa shiritin e shfletuesit, si një aplikacion.
Rrjedha e rezervimit
Nga ana e vizitorit, faqja e rezervimit është një komponent i pavarur (JavaScript pa
framework, nën 10 KB) që flet me endpoint-et publike owag/v1/public/*.
Hapi 1 — dita
Në ngarkim, widget-i kërkon disponueshmërinë për 14 ditë duke nisur nga sot dhe shfaq një brez ditësh të klikueshme. Një ditë pa asnjë interval të lirë del gri dhe nuk klikohet. Butoni « Shih datat në vijim » ngarkon 14 ditët pasuese, aq herë sa duhet deri te horizonti i konfiguruar.
Datat e widget-it ndërtohen në orën lokale të shfletuesit, kurrë në UTC. Ky është një rregullim i versionit 1.3.0: më parë, një vizitor në lindje të UTC-së që hapte faqen pak pas mesnate e shihte listën duke nisur një ditë më parë dhe humbte një ditë disponueshmërie.
Hapi 2 — ora
Klikimi mbi një ditë thërret /public/slots dhe shfaq orët e lira të nisjes. Një interval
ofrohet kur të gjitha këto kushte plotësohen:
- bie brenda një hapësire hapjeje të ditës përkatëse;
- i gjithë takimi (nisja + kohëzgjatja) hyn përpara mbylljes;
- nis pas tani + afati minimal;
- dita është brenda horizontit të rezervimit;
- nuk mbivendoset me asnjë ngjarje aktive, pauza e përfshirë — dhe « ngjarje aktive » përfshin takimet e konfirmuara, kërkesat në pritje, bllokimet, takimet telefonike të shënuara me dorë, si dhe kërkesat ende të paverifikuara që e mbajnë ende intervalin e tyre.
Ky është pikërisht thelbi: gjithçka që e zë axhendën e mbyll intervalin online. Një takim i marrë me telefon dhe i shënuar në axhendë zhduket menjëherë nga intervalet e ofruara në sajt.
Hapi 3 — formulari
Katër fusha, tri prej të cilave të detyrueshme: emri (minimum 2 karaktere), telefoni (minimum 8 shifra), email-i (i validuar), mesazh i lirë. Një kutizë pëlqimi GDPR, e pashënuar si parazgjedhje, është e detyrueshme.
Formulari mbart veç kësaj dy fusha të padukshme për vizitorin — një kurth për botët dhe një vulë kohore të hapjes së faqes — të përshkruara në seksionin Anti-spam.
Hapi 4 — përgjigjja
Sipas konfigurimit tuaj, tri përfundime:
| Konfigurimi | Statusi i krijuar | Mesazhi i shfaqur |
|---|---|---|
| Verifikimi i dyfishtë me email aktiv (parazgjedhje) | unverified | « Edhe një veprim i fundit: sapo ju është dërguar një email… » |
| Verifikimi i çaktivizuar + miratim manual | pending | « Kërkesa juaj u mor me sukses! » |
| Verifikimi i çaktivizuar + konfirmim automatik | confirmed | « Takimi juaj është konfirmuar! » |
Nëse intervali është zënë ndërmjet shfaqjes së listës dhe dërgimit të formularit,
vizitori merr një mesazh të qartë (owag_slot_taken, HTTP 409) dhe lista e ditëve
ringarkohet automatikisht. Dy vizitorë nuk mund ta marrin të njëjtin interval: seksioni
kritik serializohet nga një kyç i emërtuar MySQL, specifik për bazën tuaj të të
dhënave dhe për prefiksin tuaj të tabelave, gjë që qëndron edhe në një hosting të
përbashkët.
Verifikimi i dyfishtë me email
Kjo është veçoria që e dallon OW Agenda-n nga një formular kontakti i maskuar.
Kur Verifikimi i dyfishtë me email është aktiv (cilësimi email_verify, i aktivizuar
si parazgjedhje):
- Kërkesa regjistrohet me statusin
unverified. Administratori nuk njoftohet. Takimi nuk shfaqet si kërkesë për t'u trajtuar. - Vizitori merr një email « Edhe një veprim i fundit… » që përmban një buton miratimi.
- Intervali mbahet 45 minuta. Pas këtij afati pa miratim, ai bëhet sërish i disponueshëm për të gjithë — pra një bot nuk mund ta ngrijë ditën tuaj.
- Klikimi mbi butonin hap një faqe të pavarur (
?owag_verify=<uid>) që shfaq përmbledhjen e takimit dhe një buton « E konfirmoj kërkesën time ». Miratimi niset vetëm me klikim: antiviruset dhe skanuesit e lidhjeve që vizitojnë URL-të e email-eve nuk miratojnë asgjë. - Kërkesa bëhet atëherë
pending(miratim manual) oseconfirmed(konfirmim automatik), klienti merr email-in përkatës, dhe vetëm atëherë niset njoftimi drejt administratorit. - Kërkesat që nuk miratohen kurrë fshihen pas 48 orësh nga detyra për orë. Ato nuk lënë asnjë gjurmë dhe asnjë të dhënë personale.
Nëse, ndërmjet dërgimit dhe klikimit, intervali është marrë nga dikush tjetër (dritarja prej 45 minutash ka kaluar), miratimi kthen një gabim të qartë dhe kërkesa anulohet — kurrë një takim fantazmë mbi një interval tashmë të zënë.
Pasojë praktike: një adresë email-i e pavlefshme nuk prodhon asnjë takim. Nuk humbni më kohë duke telefonuar numra të rremë. Çmimi që paguhet është një klikim shtesë për klientin; përvoja tregon se shkalla e braktisjes është shumë më e ulët se shkalla e takimeve të rreme që ai shmang.
Rezervimet që vijnë nga një ftesë për seancë e kapërcejnë këtë hap: klienti e ka provuar tashmë se e lexon kutinë postare, duke klikuar lidhjen private që mori.
Miratimi i kërkesave
Miratimi manual (i rekomanduar)
Cilësimi i parazgjedhur: auto_confirm = 0. Një kërkesë e verifikuar mbërrin me statusin
pending. Klientit nuk i premtohet asgjë për sa kohë ju nuk keni bërë asgjë — por
intervali është tashmë i bllokuar, askush nuk mund t'ju kalojë përpara.
Ju merrni një email « Për konfirmim:
- Konfirmo takimin — cian
- Refuzo — me kontur të kuq
Butonat e email-it: lidhje të firmosura HMAC
Këta butona nuk kërkojnë asnjë kyçje. Ata drejtojnë te sajti juaj me tre parametra:
owag_admin_action (confirm ose refuse), uid (identifikuesi i rastësishëm i
takimit) dhe sig, një firmë HMAC-SHA256 e uid|action e llogaritur me sekretin
privat të sajtit (owag_admin_secret).
- Firma verifikohet përpara se të shfaqet qoftë edhe një detaj i vetëm: një lidhje e manipuluar nuk shfaq asgjë tjetër veç « Lidhje e pavlefshme ».
- Krahasimi përdor
hash_equals()— pa rrjedhje informacioni nga koha e përgjigjes. - Faqja shfaq një përmbledhje dhe një buton; veprimi kryhet vetëm me klikim. Një skanues lidhjesh nuk konfirmon pra asgjë në vendin tuaj.
- Një kërkesë e trajtuar tashmë kthen « E trajtuar tashmë (statusi: … ) » në vend të një gabimi.
Konfirmimi dërgon automatikisht email-in e konfirmimit te klienti, bashkë me skedarin e kalendarit. Refuzimi dërgon email-in e anulimit. Në të dyja rastet, axhenda është e përditësuar përpara se ta keni futur telefonin në xhep.
Këto lidhje mbeten të vlefshme për sa kohë takimi është në pritje. Nëse fshini opsionin
owag_admin_secret(rikthim i pjesshëm i bazës, pastrim manual), të gjitha lidhjet e dërguara pushojnë së funksionuari: gjenerohet një sekret i ri dhe firmat e vjetra nuk përputhen më. Kaloni atëherë nga faqja Axhenda.
Konfirmimi automatik
Cilësimi auto_confirm = 1. Një interval i lirë konfirmohet menjëherë: klienti merr
konfirmimin e tij bashkë me skedarin e kalendarit, ju merrni një njoftim
« Takim i ri ». Rezervojeni për veprimtaritë ku çdo interval i hapur është interval i
pranueshëm.
Të dyja cilësimet kombinohen me verifikimin e dyfishtë: edhe në konfirmim automatik,
kërkesa kalon fillimisht nga unverified nëse email_verify është aktiv.
Faqja Axhenda
Faqja « Axhenda » ([ow_agenda_admin]) është vegla e përditshme. Ajo është menduar
së pari për telefonin: butona të gjerë, një kolonë e vetme, pa tabela që duhen
rrëshqitur horizontalisht, dhe natyrisht funksionon po aq mirë në ekranin e një
kompjuteri.
Ajo është e mbrojtur: një vizitor i pakyçur sheh një lidhje kyçjeje, një përdorues i
kyçur pa aftësinë owag_manage sheh « Aksesi është i rezervuar për ekipin ». Faqja është
në noindex,nofollow: nuk do të përfundojë kurrë në Google.
Skeda Axhenda — pamja e ditës
Dita në vazhdim, ngjarje pas ngjarjeje, me orën, kohëzgjatjen, emërtimin, statusin dhe origjinën (sajti, ftesa, shënim manual). Lëvizje nga një ditë te tjetra, buton Sot. Mbi çdo takim:
- Detaje — të dhënat e kontaktit të klientit, mesazhi i lënë gjatë rezervimit, dhe një bllok shënimesh të brendshme (kurrë të dukshme për klientin) që ruhen pa dërguar asnjë email
- Konfirmo ✓ — për një kërkesë ende në pritje; niset email-i i konfirmimit
- Kryer / Mungoi (no-show) — statuse mbylljeje të takimit
- Zhvendos — datë e re, orë e re, kohëzgjatje eventualisht e ndryshuar. Plugin-i ju pyet nëse klienti duhet njoftuar me email; nëse po, ai merr një konfirmim të përditësuar dhe një skedar kalendari që korrigjon ngjarjen tashmë të pranishme në telefonin e tij
- Anulo takimin — sërish me mundësinë për ta njoftuar ose jo klientin
- Hiq bllokimin — për një interval të bllokuar
Kur një veprim krijon një mbivendosje (zhvendosje mbi një interval të zënë), plugin-i paralajmëron dhe kërkon konfirmim: ju mund ta detyroni. Është orari juaj, ju e dini se çfarë bëni — mbrojtja është bllokuese vetëm për vizitorët.
Të shtoni një takim ose një bllokim
Butoni « Shto një takim » hap një formë të vetme që shërben për dy përdorime:
- Takim — klienti ju telefonoi. Emri, telefoni, email-i (opsional), shërbimi, data, ora, kohëzgjatja, shënimet e brendshme. Nëse plotësoni një adresë email-i dhe shënoni opsionin, klienti merr konfirmimin bashkë me skedarin e kalendarit, sikur të kishte rezervuar online. Takimi ushqen gjithashtu regjistrin e klientëve.
- Bllokim (pushim, pauzë…) — një arsye, një datë, një orë, një kohëzgjatje. Asnjë email, asnjë skedë klienti, por intervali zhduket menjëherë nga rezervimi online. Kështu vendoset një javë pushimesh, një trajnim, ose intervali i mesditës që nuk doni ta shihni të rezervuar.
Skeda Në pritje
Lista e kërkesave të verifikuara që presin vendimin tuaj, për të gjitha ditët së bashku (takimet tashmë të kaluara përjashtohen). Dy butona për rresht: Konfirmo dhe Refuzo. Ky është ekrani i parë që hapet në mëngjes.
Këshillë: axhenda si aplikacion
Në faqen Axhenda, plugin-i deklaron një manifest aplikacioni ueb (?owag_manifest=1) me
emrin e sajtit, ikonën e sajtit dhe ngjyrën e temës. Si në Android ashtu edhe në iOS,
menyja e shfletuesit ofron atëherë « Shto në ekranin bazë »: ju merrni një ikonë, një
nisje në ekran të plotë, dhe kurrë më URL për ta rishkruar.
Regjistri i klientëve
Skeda e tretë e faqes Axhenda është një regjistër i lehtë, minimal me qëllim: emri, telefoni, email-i, shënime të lira.
- Mbushet vetë. Sapo një takim miratohet (rezervim online i verifikuar, seancë me ftesë, shënim manual), klienti përputhet me një skedë ekzistuese sipas email-it, pastaj sipas telefonit. Nëse nuk ekziston, skeda krijohet; nëse ekziston, plotësohen vetëm fushat bosh — plugin-i nuk e mbishkruan kurrë atë që keni shkruar ju me dorë.
- Kërkim sipas emrit, telefonit ose email-it (maksimumi 200 skeda të shfaqura).
- Krijim dhe redaktim manual, me një fushë shënimesh për historikun, preferencat, masat që duhen marrë.
- Dy shkurtore për çdo skedë: Takim i ri (paraplotëson formën e shënimit manual) dhe Fto për një seancë (paraplotëson ftesën).
- Fshirje e një skede: takimet e kaluara mbeten në axhendë, zhduket vetëm skeda e regjistrit.
Ky regjistër nuk është një CRM dhe as nuk pretendon të jetë. Ai i përgjigjet një pyetjeje: « Kush ishte, pra, zonja e orës 14:00? »
Ftesat për seancë
Rasti i përdorimit: një klient ekzistues ka të drejtën e një seance — një ndjekje, një retush, një shërbim i shitur diku tjetër — dhe ju doni që ai ta zgjedhë datën pa kaluar nga rezervimi publik, mbi një shërbim dhe një kohëzgjatje që i caktoni ju.
Nga skeda Ftesat:
- Plotësoni emrin e klientit, titullin e seancës (të detyrueshme), kohëzgjatjen e saj (15 deri 720 minuta) dhe, nëse dëshironi, email-in dhe telefonin e tij.
- Zgjidhni vlefshmërinë e lidhjes: 60 ditë si parazgjedhje, nga 1 deri 365.
- Shënoni eventualisht « Dërgoja lidhjen klientit me email » — klienti merr një email « Zgjidhni datën e seancës suaj » me titullin, kohëzgjatjen, datën e skadimit dhe një buton.
- Përndryshe, kopjoni lidhjen dhe dërgojeni me SMS, WhatsApp, ose me butonin e ndarjes nativ të telefonit.
Lidhja drejton te faqja juaj e rezervimit me një token privat
(?owag_invite=<token>, 32 karaktere heksadecimale të nxjerra nga një gjenerues
kriptografik). Widget-i shfaq atëherë titullin dhe kohëzgjatjen e seancës, dhe jo
konsultën standarde. Klienti plotëson të njëjtin formular të shkurtër.
Rregullat që qeverisin një lidhje ftese:
- Përdorim i vetëm. Sapo seanca të rezervohet, lidhja përgjigjet « Kjo lidhje është përdorur tashmë » (HTTP 410). Dy hapje të njëkohshme me të njëjtin token nuk mund të krijojnë dy seanca: konsumimi i tokenit kryhet nën të njëjtin kyç si rezervimi i intervalit.
- Me afat. Pas skadimit, lidhja e fton klientin t'ju rikontaktojë (HTTP 410).
- Pa opt-in të dyfishtë. Klienti e ka marrë tashmë këtë lidhje përmes një kanali që
ju e kontrolloni: seanca krijohet drejtpërdrejt si
confirmed, me konfirmim dhe skedar kalendari. - E riciklueshme në rast anulimi. Nëse seanca anulohet (nga ju ose nga klienti), ftesa lirohet: lidhja bëhet sërish aktive dhe ftesa rishfaqet në listën e ftesave të hapura. Ky është një rregullim i versionit 1.3.0 — më parë, një anulim e vriste përfundimisht lidhjen dhe duhej bërë një e re.
- E revokueshme. Fshirja e një ftese nga lista e çaktivizon lidhjen menjëherë.
Email-et dhe skedari i kalendarit (ICS)
Email-et transaksionale
Të gjitha mesazhet janë në HTML, mbi një strukturë me tabela të pajtueshme me Gmail dhe
Outlook: kartë e bardhë mbi sfond të çelët, emri i sajtit në krye, kuti përmbledhëse me
buzë ciani, butona në formë pilule. Ato dërgohen me wp_mail(), pra respektojnë
konfigurimin tuaj SMTP dhe filtrat e zakonshëm të WordPress.
| Email-i | Marrësi | Nxitësi |
|---|---|---|
| Miratim i kërkesës | Klienti | Rezervim nga uebi kur verifikimi i dyfishtë është aktiv |
| Kërkesa u mor | Klienti | Kërkesë e miratuar, në pritje të vendimit tuaj |
| Takim i konfirmuar | Klienti | Konfirmim (manual, automatik, shënim nga admini, zhvendosje) — me bashkëngjitje ICS |
| Takim i anuluar | Klienti | Anulim nga klienti, refuzim ose anulim nga admini — me bashkëngjitje ICS anulimi |
| Kujtesë | Klienti | Automatikisht, ndërmjet 12 dhe 36 orësh përpara takimit |
| Zgjidhni datën e seancës suaj | Klienti | Krijim i një ftese me dërgim me email |
| Për konfirmim: … | Admini | Kërkesë e re e verifikuar në pritje — me butonat Konfirmo / Refuzo |
| Takim i ri: … | Admini | Takim i ri i konfirmuar (konfirmim automatik, ftesë) |
| Anulim nga klienti: … | Admini | Klienti e anuloi vetë nga email-i i tij |
Adresa e njoftimeve të administrimit është cilësimi notify_email (si parazgjedhje
email-i i administrimit të sajtit). Email-et drejt klientit nisen vetëm nëse adresa është
e vlefshme, dhe kurrë për një bllokim intervali.
Email-et e konfirmimit dhe të anulimit i kujtojnë klientit se mund të anulojë online, me numrin e orëve të paralajmërimit që janë vërtet të konfiguruara.
Bashkëngjitja ICS
Skedari .ics i bashkëngjitur konfirmimeve është ajo që e shndërron një email në një
takim vërtet të pranishëm në telefonin e klientit: një lëvizje mbi bashkëngjitjen, dhe
ngjarja është në kalendarin e tij, me kujtesën e vet.
Skedari është në përputhje me RFC 5545 dhe përmban gjithçka të nevojshme që klientët e kalendarit (Google, Outlook, Apple) t'i trajtojnë saktë përditësimet:
METHOD:REQUESTnë krijim dhe në çdo rishikim orari,METHOD:CANCELnë anulim;- një
UIDi qëndrueshëm i nxjerrë nga identifikuesi i takimit dhe nga domeni i sajtit — është ai që i lejon një rishikimi të zëvendësojë ngjarjen ekzistuese në vend që të krijojë një të dytë; - një
SEQUENCEnë rritje i nxjerrë nga data e modifikimit të fundit, e kthyer në një çast absolut: kalimi në orën e dimrit nuk mund ta kthejë prapa numrin e rishikimit (dhe anulimi shton 1, që të mbetet më i lartë se një rishikim i ndodhur brenda së njëjtës sekondë); ORGANIZER(adresa juaj e njoftimeve) dheATTENDEE(klienti);DTSTART/DTENDnë UTC,STATUS:CONFIRMEDoseSTATUS:CANCELLED;- palosje e rreshtave në 75 bajt pa e ndarë kurrë një karakter UTF-8.
Një zhvendosje takimi e konfirmuar dërgon pra një skedar të ri që korrigjon ngjarjen tashmë të pranishme te klienti; një anulim dërgon një skedar që e fshin atë. Ky është një rregullim i versionit 1.3.0: më parë ora e vjetër mbetej në kalendarin e klientit.
Skedari shkruhet në direktorinë e përkohshme të serverit — kurrë në
wp-content/uploads/, e cila shërbehet publikisht — përmes API-t të skedarëve të
WordPress, dhe fshihet menjëherë pasi përfundon dërgimi, përfshirë rastin kur dërgimi
dështon. Ai mban emrin dhe email-in e klientit: nuk ka pse të qëndrojë në disk asnjë
sekondë më shumë se ç'duhet.
Kujtesat dhe detyra e planifikuar
Një detyrë e vetme e planifikuar, owag_hourly_event, e ekzekutuar çdo orë. Ajo bën tri
gjëra.
1. Kujtesa e një dite më parë
Kujtesa niset kur takimi fillon brenda 12 deri 36 orësh. Kjo nuk është një dritare orare fikse, dhe kjo është e qëllimshme: WP-Cron nxitet vetëm kur vizitohet një faqe. Një sajt pa trafik në mbrëmje i humbte përfundimisht kujtesat e ditës pasuese. Me një dritare rrëshqitëse, kujtesa niset në ekzekutimin e parë të disponueshëm dhe e kap vonesën.
Kushtet: takim i konfirmuar, adresë email-i e plotësuar, të mos jetë bllokim, dhe kujtesa të mos jetë dërguar tashmë.
Çdo kujtesë rezervohet në mënyrë atomike përpara dërgimit (një UPDATE me kusht mbi
flamurin reminder_sent): dy ekzekutime cron-i që mbivendosen nuk mund ta dërgojnë dy
herë të njëjtin mesazh. Nëse dërgimi dështon, rezervimi kthehet dhe kujtesa do të
riprovohet në ekzekutimin pasues. Një kyç i shkurtër (10 minuta) parandalon veç kësaj që
dy kalime të njëkohshme të përshkojnë të njëjtën listë.
Zhvendosja e një takimi e kthen flamurin në zero: klienti merr rregullisht një kujtesë për orarin e ri.
2. Pastrimi i kërkesave të pamiratuara
Kërkesat që mbeten unverified prej më shumë se 48 orësh fshihen. (Intervali i tyre,
nga ana tjetër, ishte liruar tashmë pas 45 minutash.)
3. Anonimizimi GDPR
Shihni seksionin GDPR.
Rrjeta e sigurisë
Një ngjarje WP-Cron mund të zhduket: optimizim i bazës së të dhënave, rikthim i pjesshëm,
plugin pastrimi, rivendosje e opsionit cron. OW Agenda verifikon në çdo ngarkim se
detyra është vërtet e programuar dhe e riprogramon në të kundërt. Kujtesat, pastrimi dhe
ruajtja e të dhënave nuk mund të ndalen në heshtje.
Të përdorni një cron të vërtetë sistemi
WP-Cron varet nga trafiku. Në një sajt pak të vizituar, parapëlqeni një cron sistemi:
// wp-config.php
define( 'DISABLE_WP_CRON', true );
# crontab -e — toutes les 15 minutes
*/15 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null
Anti-spam dhe kufijtë e shpejtësisë
Rezervimi është publik nga vetë natyra e tij: pa llogari, pa kyçje, pa mundësi nonce-i. Pesë mbrojtje të pavarura punojnë pra në rrjedhën e sipërme.
1. Kurthi për botët (honeypot)
Formulari përmban një fushë teksti jashtë ekranit, të padukshme për një njeri dhe tunduese për një bot. Fusha duhet të jetë e pranishme dhe bosh. Një fushë e plotësuar — ose e munguar, gjë që tradhton një dërgim direkt në API — kthen një refuzim të thatë (HTTP 403), pa asnjë detaj të shfrytëzueshëm.
2. Koha e plotësimit
Faqja transmeton vulën kohore të shfaqjes së saj. Një dërgim që mbërrin më pak se 4 sekonda pas ngarkimit refuzohet. Edhe këtu, një vulë kohore e munguar ose e keqformuar është refuzim: në 1.3.0, këto dy fusha u bënë të detyrueshme — heqja e tyre e çaktivizonte thjesht dhe pastër kontrollin.
3. Kuota për orë sipas adresës
5 rezervime në orë dhe për çdo shtrirje. Në IPv4, shtrirja është adresa; në IPv6, është prefiksi /64 — një sulmues disponon aty 2⁶⁴ adresa, të numëroje adresën e plotë nuk do të kufizonte asgjë.
Numëruesi rritet vetëm pas validimit të formularit: një vizitor që e gabon email-in tri herë radhazi nuk bllokohet më për një orë pa arsye.
4. Tavani ditor i kërkesave të paverifikuara
Maksimumi 3 kërkesa në pritje të miratimit me email mund të mbajnë një interval brenda së njëjtës ditë. Pa këtë tavan, pak dërgime mjaftonin për të ngrirë të gjitha intervalet e një date. Përtej tij, vizitori merr një ftesë për të riprovuar më vonë ose për të zgjedhur një ditë tjetër (HTTP 429).
5. Kyçi i rezervimit
Rezervimi i një intervali dhe konsumimi i një ftese kryhen brenda një seksioni kritik të serializuar nga një kyç i emërtuar MySQL, emri i të cilit rrjedh nga baza juaj e të dhënave dhe nga prefiksi juaj i tabelave (dy sajte të të njëjtit hosting i përbashkët nuk bllokojnë pra njëri-tjetrin). Nëse kyçi nuk merret brenda 5 sekondash, kërkesa kthen një HTTP 503 të qartë në vend të një takimi të dyfishtë.
Ky kyç zëvendëson, që nga 1.3.0, një transaksion që mbështetej mbi një SELECT të
zhveshur: nën REPEATABLE READ, ai nuk vendos asnjë kyç rreshti, dhe dy vizitorë të
njëkohshëm mund të rezervonin të njëjtin orar.
Dhe verifikimi i dyfishtë
Ky është shtresa më efikase: edhe duke kapërcyer gjithçka që u tha më sipër, një bot nuk arrin kurrë te axhenda juaj dhe as te kutia juaj postare, pasi njoftimi drejt administratorit dërgohet vetëm pas klikimit mbi një lidhje të marrë me email. Shihni Verifikimi i dyfishtë me email.
GDPR
Një axhendë takimesh trajton të dhëna potencialisht shëndetësore, të dhëna kontakti dhe historikë. Cilësimet e parazgjedhura janë konservatore me qëllim.
Pëlqimi
Kutiza e pëlqimit është e detyrueshme dhe e pashënuar si parazgjedhje në formularin publik: « Pranoj që të dhënat e mia të kontaktit të përdoren për menaxhimin e takimit tim. » Një rezervim pa pëlqim refuzohet nga ana e serverit, jo vetëm nga ana e shfletuesit.
Minimizimi
- Asnjë adresë IP nuk ruhet në bazën e të dhënave. Kuota për orë përdor një numërues të përkohshëm (transient), çelësi i të cilit është një përmbledhje e shtrirjes së rrjetit, i pastruar pas një ore.
- Asnjë user agent, asnjë tracker, asnjë cookie e vendosur nga plugin-i.
- Asnjë e dhënë nuk dërgohet te një shërbim i palës së tretë: pa CDN, pa thirrje të jashtme, pa telemetri.
- Kërkesat që nuk miratohen kurrë fshihen pas 48 orësh — ato nuk lënë asnjë të dhënë pas vetes.
- Takimet e anuluara nuk kthehen më nga API-ja e axhendës: të dhënat personale të panevojshme nuk qarkullojnë.
Anonimizimi automatik
Cilësimi retention_months, 24 muaj si parazgjedhje. Çdo orë, takimet e
përfunduara prej më shumë kohe se ky afat anonimizohen në vend: emri zëvendësohet me
« I anonimizuar », telefoni dhe email-i zbrazen, mesazhi i klientit dhe shënimet e
brendshme fshihen. Rreshti mbetet, gjë që ruan historikun statistikor të veprimtarisë (sa
takime, kur, për cilin shërbim) pa mbajtur asnjë të dhënë personale.
Vendosni 0 për ta çaktivizuar anonimizimin automatik — me vetëdije të plotë.
Për t'u mbajtur shënim: anonimizimi synon takimet që mbartin një adresë email-i. Një takim i shënuar me dorë pa email (vetëm emër dhe telefon) nuk preket nga pastrimi automatik; fshijeni manualisht nëse politika juaj e ruajtjes së të dhënave e kërkon.
E drejta e aksesit dhe e drejta e fshirjes
Plugin-i nuk lidhet me eksportuesit/fshirësit nativë të WordPress (këta punojnë mbi llogari përdoruesish, ndërsa klientët nuk kanë të tilla). Për të trajtuar një kërkesë:
- Akses — kërkoni personin në regjistrin e klientëve (emri, telefoni ose email-i) dhe
shfletoni takimet e tij në axhendë. Administratorët e bazës së të dhënave mund të
pyesin gjithashtu drejtpërdrejt
{prefix}_owag_appointmentsdhe{prefix}_owag_customersmbi kolonëncustomer_email/email. - Fshirje — fshini skedën e regjistrit, pastaj anuloni ose lini të anonimizohen
takimet përkatëse. Një fshirje e menjëhershme kryhet në bazën e të dhënave mbi
customer_email.
-- Effacement manuel des données personnelles d'une personne (adaptez le préfixe).
UPDATE wp_owag_appointments
SET customer_name = 'Anonymisé', customer_phone = '', customer_email = '',
customer_msg = NULL, admin_notes = NULL
WHERE customer_email = 'personne@example.com';
DELETE FROM wp_owag_customers WHERE email = 'personne@example.com';
Regjistri i veprimtarive të përpunimit
Për regjistrin tuaj: qëllimi menaxhimi i takimeve; baza ligjore pëlqimi (rezervim online) ose ekzekutimi i një kontrate / masa parakontraktuale (takim i marrë me telefon); kategoritë identiteti, të dhënat e kontaktit, përmbajtja e mesazhit, shënimet e brendshme; kohëzgjatja 24 muaj si parazgjedhje, pastaj anonimizim; marrësit asnjë përpunues përveç hostit tuaj dhe shërbimit tuaj të dërgimit të email-eve.
Shortkodet
[ow_agenda] — rezervimi nga vizitori
Vendoset në një faqe publike. Asnjë atribut: shërbimi, kohëzgjatja dhe oraret vijnë nga cilësimet. Shortkodi ngarkon fletën e vet të stilit dhe skriptin e vet (nën 12 KB në total, pa asnjë varësi) dhe kthen një kontejner që mbushet pas thirrjes së parë drejt API-t.
[ow_agenda]
Është ky shortkod që interpreton parametrin e URL-së ?owag_invite=<token>: e njëjta faqe
shërben konsultën standarde dhe seancat me ftesë.
[ow_agenda_admin] — faqja e menaxhimit
Vendoset në një faqe të dedikuar. Asnjë atribut. Shortkodi e menaxhon vetë aksesin:
- vizitor i pakyçur → lidhje kyçjeje që e kthen te faqja;
- i kyçur pa aftësinë
owag_manage→ mesazh aksesi të kufizuar; - i kyçur me aftësinë → ndërfaqja e plotë (axhenda, në pritje, klientët, ftesat).
[ow_agenda_admin]
Të dyja faqet krijohen automatikisht në aktivizim me këta shortkode. Nëse i keni fshirë,
mjafton të krijoni një faqe dhe të ngjitni aty shortkodin — mos harroni atëherë të
përditësoni opsionin owag_page_admin (ose owag_page_booking), që lidhjet e email-eve
dhe manifesti të drejtojnë në vendin e duhur.
Faqet e pavarura
Katër parametra URL-je, të kapur në çfarëdo faqeje të sajtit, prodhojnë faqe të pavarura
të shërbyera jashtë temës (renderim minimal, noindex,nofollow):
| URL | Roli |
|---|---|
?owag_verify=<uid> | Miratimi i kërkesës nga klienti (opt-in i dyfishtë) |
?owag_cancel=<uid> | Anulim online nga klienti |
?owag_admin_action=confirm|refuse&uid=…&sig=… | Konfirmim / refuzim nga email-i i administrimit |
?owag_manifest=1 | Manifesti i aplikacionit i faqes Axhenda |
Këto faqe nuk kryejnë kurrë asnjë veprim gjatë ngarkimit: ato shfaqin një përmbledhje dhe një buton. Asnjë bot, asnjë antivirus poste dhe asnjë prefetch shfletuesi nuk mund të konfirmojë ose të anulojë një takim në vend të një njeriu.
REST API
Të gjitha endpoint-et jetojnë nën namespace-in owag/v1, te rrënja e zakonshme REST
(https://example.com/wp-json/owag/v1/…).
Endpoint-et publike
Asnjë autentikim: këto janë rrugët e widget-it të rezervimit dhe të lidhjeve të marra me email. Siguria e tyre mbështetet mbi tokena të rastësishëm (32 karaktere heksadecimale të nxjerra nga një gjenerues kriptografik), mbi firma HMAC, dhe mbi mbrojtjet e përshkruara te Anti-spam.
| Metoda | Shtegu | Parametrat | Roli |
|---|---|---|---|
GET | /public/days | from (Y-m-d, parazgjedhje: sot), token (ftesë, opsionale) | Kthen label, duration dhe days: 14 ditë duke nisur nga from, secila me numrin e vet të intervaleve të lira |
GET | /public/slots | date (Y-m-d, i detyrueshëm), token | Kthen slots: orët e lira të nisjes (HH:MM) |
POST | /public/book | date, time, name, phone, email, message, consent, website (kurth), ts (vulë kohore), token | Krijon kërkesën; kthen status dhe mesazhin që duhet shfaqur |
POST | /public/verify | uid | Miraton një kërkesë unverified |
POST | /public/cancel | uid | Anulon një takim pending ose confirmed, brenda afatit të paralajmërimit |
POST | /public/admin-action | uid, action (confirm|refuse), sig | Konfirmon ose refuzon nga email-i i administrimit (firmë HMAC) |
Shembull rezervimi:
curl -X POST https://example.com/wp-json/owag/v1/public/book \
-H 'Content-Type: application/json' \
-d '{
"date": "2026-09-15",
"time": "14:30",
"name": "Marie Dupont",
"phone": "0470 12 34 56",
"email": "marie@example.com",
"message": "Première visite",
"consent": 1,
"website": "",
"ts": 1757942400
}'
{
"ok": true,
"status": "unverified",
"message": "Un dernier geste : un e-mail vient de vous être envoyé…"
}
Endpoint-et e administrimit
Të gjitha kërkojnë aftësinë owag_manage dhe një nonce REST të vlefshëm të WordPress
(header-i X-WP-Nonce).
| Metoda | Shtegu | Parametrat | Roli |
|---|---|---|---|
GET | /admin/agenda | from, to (Y-m-d) | events (intervali i kërkuar, të anuluarat përjashtohen) dhe pending (të gjitha kërkesat në pritje që vijnë) |
POST | /admin/appointment | kind (manual|block|consult|seance), date, time, duration (5–720 min), label, name, phone, email, notes, force, send_email | Krijon një takim manual ose një bllokim |
POST | /admin/appointment/{id} | status (pending|confirmed|cancelled|done|noshow), name, phone, email, label, notes, date, time, duration, force, silent | Përditëson, zhvendos, ndryshon statusin. silent=1 heq çdo dërgim email-i |
GET | /admin/customers | q (kërkim) | Regjistri (maksimumi 200 skeda) |
POST | /admin/customers | name (i detyrueshëm), phone, email, notes | Krijon një skedë |
POST | /admin/customers/{id} | njësoj | Përditëson një skedë |
DELETE | /admin/customers/{id} | — | Fshin një skedë |
GET | /admin/invites | — | Ftesat e hapura (të papërdorura kurrë ose të liruara, të paskaduara) |
POST | /admin/invites | name (i detyrueshëm), label (i detyrueshëm), duration (15–720), days_valid (1–365, parazgjedhje 60), email, phone, send_email | Krijon një ftesë; kthen url dhe email_sent |
DELETE | /admin/invites/{id} | — | Fshin një ftesë |
GET | /admin/settings | — | Cilësimet efektive |
POST | /admin/settings | trup JSON (shihni Referencë e cilësimeve) | Ruan cilësimet |
Çdo rrugë e deklaron shprehimisht kontrollin e vet të aksesit; aftësia verifikohet përpara ekzekutimit të çdo përpunimi.
Kodet e gabimeve
Gabimet janë WP_Error standarde, me një kod të lexueshëm dhe një status HTTP.
| Kodi | HTTP | Kuptimi |
|---|---|---|
owag_spam | 403 | Kurthi për botët i plotësuar, ose vulë kohore që mungon / tepër e re |
owag_rate | 429 | Kuota për orë e arritur për këtë adresë |
owag_day_full | 429 | Tepër kërkesa në pritje miratimi për këtë datë |
owag_busy | 503 | Kyçi i rezervimit nuk u mor — riprovoni pas pak |
owag_slot_taken | 409 | Intervali u zu ndërkohë |
owag_overlap | 409 | Mbivendosje e zbuluar (admin) — ridërgoni me force |
owag_invite_invalid | 404 | Token ftese i panjohur |
owag_invite_used | 410 | Ftesë tashmë e konsumuar |
owag_invite_expired | 410 | Ftesë e skaduar |
owag_too_late | 403 | Anulim online jashtë afatit të paralajmërimit |
owag_bad_sig | 403 | Firmë HMAC e pavlefshme |
owag_not_found | 404 | Takim ose skedë që nuk gjendet |
owag_name, owag_phone, owag_email, owag_consent | 400 | Fushë e pavlefshme ose pëlqim që mungon |
owag_bad_input, owag_bad_date | 400 | Datë, orë ose e dhënë e pavlefshme |
owag_noop | 400 | Kërkesë përditësimi bosh |
owag_insert | 500 | Dështim shkrimi në bazën e të dhënave |
Hook-et për zhvilluesit
Në 1.3.1, OW Agenda nuk ekspozon as filtër, as action publik: nuk ka një API zgjerimi
për t'u dokumentuar, dhe asgjë nga sa vijon nuk duhet hamendësuar. I vetmi hook i
përdorshëm është ngjarja e planifikuar owag_hourly_event, mbi të cilën mund të lidhni
mirëmbajtjen tuaj:
add_action( 'owag_hourly_event', function () {
// Votre traitement horaire, exécuté juste après celui du plugin.
} );
Për gjithçka tjetër, REST API është pika e integrimit: ajo ekspozon saktësisht atë që bën ndërfaqja, as më shumë e as më pak.
Referencë e cilësimeve
Të gjitha cilësimet qëndrojnë brenda një opsioni të vetëm, owag_settings. Lexim dhe
shkrim në PHP:
$s = owag_settings(); // réglages effectifs (défauts + enregistrés)
$duree = (int) $s['consult_duration'];
update_option( 'owag_settings', array_merge( owag_settings(), [
'consult_duration' => 45,
'buffer' => 10,
] ) );
Vlerat e parazgjedhura
[
// Horaires : clé = 1 (lundi) … 7 (dimanche), valeur = liste de plages [début, fin]
'hours' => [
'1' => [ [ '09:00', '18:00' ] ],
'2' => [ [ '09:00', '18:00' ] ],
'3' => [ [ '09:00', '18:00' ] ],
'4' => [ [ '09:00', '18:00' ] ],
'5' => [ [ '09:00', '18:00' ] ],
'6' => [], // samedi fermé
'7' => [], // dimanche fermé
],
'slot_step' => 30, // granularité des créneaux proposés (minutes)
'consult_duration' => 60, // durée d'une consultation (minutes)
'buffer' => 0, // battement autour de chaque rendez-vous (minutes)
'min_notice_hours' => 24, // délai minimum avant réservation
'max_advance_days' => 60, // horizon maximum de réservation
'auto_confirm' => 0, // 0 = validation manuelle, 1 = confirmation automatique
'email_verify' => 1, // double vérification par e-mail
'cancel_notice_hours' => 24, // préavis d'annulation en ligne par le client
'notify_email' => get_option( 'admin_email' ),
'retention_months' => 24, // anonymisation des RDV passés (0 = jamais)
'consult_label' => 'Consultation',
]
Në hollësi
| Cilësimi | Lloji | Kufijtë e ndërfaqes | Efekti |
|---|---|---|---|
hours | tabelë | 1 ose 2 hapësira në ditë | Dy hapësira lejojnë ndarjen e mesditës. Një hapësirë merret parasysh vetëm nëse nisja dhe fundi janë të vlefshme dhe nisja < fundi. Një ditë bosh = e mbyllur |
slot_step | numër i plotë | 5 → 120 min | Distanca mes orëve të ofruara. Sa më i imët, aq më e gjatë lista |
consult_duration | numër i plotë | 15 → 480 min | Kohëzgjatja e rezervuar në axhendë për një konsultë nga uebi |
buffer | numër i plotë | 0 → 120 min | Pauza e zbatuar nga të dyja anët e intervalit kandidat |
min_notice_hours | numër i plotë | 0 → 168 orë | Asgjë nuk ofrohet përpara tani + ky afat |
max_advance_days | numër i plotë | 7 → 365 ditë | Horizonti përtej të cilit nuk ofrohet më asnjë interval |
auto_confirm | 0 / 1 | — | Miratim manual ose konfirmim i menjëhershëm |
email_verify | 0 / 1 | — | Opt-in i dyfishtë me email (lëreni aktiv) |
cancel_notice_hours | numër i plotë | 0 → 168 orë | Përtej tij, anulimi online refuzohet me një mesazh që fton të telefonojë |
notify_email | — | Marrësi i njoftimeve të administrimit; shërben gjithashtu si ORGANIZER në skedarët ICS | |
retention_months | numër i plotë | 0 → 120 muaj | Anonimizimi i takimeve të përfunduara; 0 e çaktivizon |
consult_label | tekst | — | Titulli i shfaqur në widget-in e rezervimit |
Dy konstante të pakonfigurueshme meritojnë të njihen, sepse qeverisin sjelljen e opt-in-it të dyfishtë: intervali i një kërkese të paverifikuar mbahet 45 minuta, dhe kërkesa fshihet pas 48 orësh.
Ruajtja përmes REST API pranon të njëjtët çelësa në JSON; numrat e plotë sillen në minimum zero, adresa e njoftimeve pranohet vetëm nëse është e vlefshme, dhe çdo hapësirë orare rivalidohet nga ana e serverit.
Të dhënat e ruajtura
Tri tabela, të gjitha me prefiksin e instalimit tuaj. Datat janë DATETIME në orën
lokale të sajtit, kurrë në UTC — kjo është ajo që i bën të lexueshme query-t dhe
triviale krahasimet e orareve.
{prefix}_owag_appointments
| Kolona | Lloji | Shënime |
|---|---|---|
id | BIGINT | Çelës primar |
uid | CHAR(32) | Token publik unik (heksadecimal, gjenerues kriptografik). Shërben si çelës për lidhjet e miratimit, të anulimit dhe të veprimit të administrimit, si dhe si UID ICS |
kind | VARCHAR(16) | consult, seance, manual, block |
service_label | VARCHAR(120) | Emërtimi i shfaqur |
customer_name, customer_phone, customer_email | VARCHAR | Të dhënat e kontaktit |
customer_msg | TEXT | Mesazhi i lënë nga klienti |
admin_notes | TEXT | Shënime të brendshme, kurrë të dërguara te klienti |
start_dt, end_dt | DATETIME | Kufijtë e intervalit (të indeksuar mbi start_dt) |
status | VARCHAR(16) | unverified, pending, confirmed, cancelled, done, noshow |
source | VARCHAR(16) | web, invite, admin |
invite_id | BIGINT | Ftesa e origjinës, kur ka të tillë |
reminder_sent | TINYINT | Flamuri i kujtesës (kthehet në 0 në rast zhvendosjeje) |
created_at, updated_at | DATETIME | updated_at ushqen numrin e rishikimit ICS |
{prefix}_owag_invites
id, token (CHAR(32), unik), të dhënat e kontaktit të klientit, service_label,
duration_min, expires_at, appointment_id (plotësohet kur lidhja konsumohet, kthehet
në NULL nëse takimi anulohet), created_at.
{prefix}_owag_customers
id, name, phone, email, notes, created_at, updated_at. Indeks mbi name dhe
email.
Vetëm një opsion mban konfigurimin (owag_settings); të tjerët janë teknikë:
owag_admin_secret (sekreti HMAC), owag_db_version, owag_pages_created,
owag_page_booking, owag_page_admin.
Ndërkombëtarizimi
E gjithë ndërfaqja është e përkthyeshme: cilësimet e administrimit, widget-i i
rezervimit, faqja Axhenda, faqet e pavarura, mesazhet e API-t dhe shabllonet e
email-eve. Gjuha burim është anglishtja; plugin-i deklaron domenin e përkthimit
ow-agenda dhe shtegun /languages.
Paketa sjell shabllonin languages/ow-agenda.pot. Ofrohet një përkthim i plotë
frëngjisht, i prodhuar nisur nga formulimi origjinal i ndërfaqes.
Të instaloni një përkthim manualisht
Kompiloni .po-në dhe vendosni .mo-në në dosjen e përkthimeve të WordPress:
msgfmt ow-agenda-fr_FR.po -o ow-agenda-fr_FR.mo
# puis : wp-content/languages/plugins/ow-agenda-fr_FR.mo
WordPress e ngarkon katalogun te vargu i parë i përkthyer; nuk nevojitet asnjë thirrje manuale.
Dy kurthe për përkthyesit
- Vargjet e destinuara për JavaScript përdorin shënjues të numëruar
(
%1$s,%2$s) dhe kurrë një%stë thjeshtë: formatuesi i vogël i integruar në skripte kupton vetëm ata. Një shënjues i panumëruar do të shfaqej fjalë për fjalë. - Dy vargje janë formate date PHP, jo fjali:
l, F j, Y \a\t g:i adhel j F Y \a\t H:i. Përkthejini si formate (rirenditni tokenat, mbroni me kundërpjerrëse shkronjat e marra fjalë për fjalë). Frëngjishtja përdorl j F Y \à H\hi.
Çinstalimi
Çaktivizimi i plugin-it bën vetëm një gjë: heq detyrën e planifikuar për orë. Të dhënat, cilësimet dhe faqet tuaja mbeten të paprekura, dhe gjithçka rinis me riaktivizimin.
Fshirja e plugin-it nga WordPress ekzekuton çinstalimin e plotë:
- fshirja e tri tabelave (
owag_appointments,owag_invites,owag_customers); - fshirja e opsioneve
owag_settings,owag_admin_secret,owag_db_version,owag_pages_created,owag_page_booking,owag_page_admin; - heqja e detyrës së planifikuar;
- heqja e aftësisë
owag_managenga roli administrator.
Dy faqet e krijuara në aktivizim nuk fshihen — ato mund të jenë ripunuar, vendosur në meny, indeksuar. Është në dorën tuaj t'i hidhni në kosh nëse nuk i doni më.
Fshirja e tabelave është e pakthyeshme. Eksportoni bazën tuaj përpara, nëse historiku i takimeve ka vlerë për ju.
Zgjidhja e problemeve
Nuk shfaqet asnjë interval në faqen e rezervimit
Kalojini me radhë:
- A janë plotësuar oraret e asaj dite? Një ditë bosh është ditë e mbyllur.
- Afati minimal (24 orë si parazgjedhje) e fsheh detyrimisht sotin dhe një pjesë të nesërmes.
- A hyn kohëzgjatja brenda hapësirës? Me një hapësirë 09:00–12:00 dhe një kohëzgjatje prej 240 minutash, nuk mund të ekzistojë asnjë interval.
- Horizonti: ditët përtej
max_advance_daysnuk ofrohen kurrë. - Pauza: një pauzë e gjerë mbi një orar të ngarkuar mund të mbyllë gjithçka.
- Një bllokim ndoshta e mbulon ditën. Hapni faqen Axhenda te dita përkatëse.
- Zona kohore e sajtit (Settings → General): një zonë e keqvendosur i zhvendos të gjitha llogaritjet.
Email-et nuk mbërrijnë
Është pothuajse gjithmonë dorëzueshmëria, jo plugin-i.
- Verifikoni se takimi ekziston vërtet në faqen Axhenda: nëse është aty, plugin-i e ka bërë punën e vet.
- Instaloni një plugin SMTP (Fluent SMTP, WP Mail SMTP…). Funksioni
mail()i PHP-së refuzohet nga shumica dërrmuese e serverave marrës. - Verifikoni SPF, DKIM dhe DMARC të domenit tuaj.
- Provoni adresën te OW Agenda → Njoftimet e administrimit dërgohen te: një adresë e pavlefshme i bllokon njoftimet në heshtje.
Kujtesa e një dite më parë nuk u nis
Kujtesa varet nga WP-Cron, i cili varet nga trafiku. Në një sajt pak të vizituar, kaloni në një cron të vërtetë sistemi (shihni Kujtesat dhe detyra e planifikuar). Verifikoni gjithashtu se takimi është vërtet i konfirmuar, se mbart një adresë email-i dhe se nuk është bllokim.
Faqja Axhenda shfaq « Aksesi është i rezervuar për ekipin »
Përdoruesi i kyçur nuk e ka aftësinë owag_manage. Ajo u jepet administratorëve në
aktivizim; për rolet e tjera, shihni Instalimi.
Butoni « Konfirmo » i email-it shfaq « Lidhje e pavlefshme »
Tri shkaqe të mundshme: lidhja u pre nga klienti i postës (provoni të kopjoni URL-në e plotë), takimi është trajtuar tashmë (mesazhi e saktëson këtë), ose sekreti HMAC i sajtit është rigjeneruar. Në këtë rast të fundit, kaloni nga faqja Axhenda: lidhjet e vjetra nuk mund të miratohen më, nga vetë ndërtimi.
Dy takime përfundojnë mbi të njëjtin interval
Që nga 1.3.0, kjo është e pamundur përmes rezervimit online. Në të kundërt, admini mund
të detyrojë një mbivendosje nga faqja Axhenda (plugin-i e sinjalizon dhe kërkon
konfirmim): verifikoni së pari se nuk bëhet fjalë për një detyrim të qëllimshëm.
Verifikoni gjithashtu se baza juaj e mbështet vërtet GET_LOCK() — një hosting ekzotik do
të kthente atëherë gabime 503 gjatë rezervimit, në vend të dublikatave.
Faqet « Rezervo » dhe « Axhenda » nuk u krijuan
Ato krijohen vetëm një herë, në aktivizimin e parë. Nëse i keni fshirë, krijoni dy faqe me
shortkodet [ow_agenda] dhe [ow_agenda_admin], pastaj drejtojini nga ato opsionet
owag_page_booking dhe owag_page_admin, që lidhjet e email-eve të mbeten të sakta:
update_option( 'owag_page_booking', 42 ); // ID de votre page de réservation
update_option( 'owag_page_admin', 43 ); // ID de votre page Agenda
Skedari i kalendarit nuk bashkëngjitet
Skedari shkruhet në direktorinë e përkohshme të serverit përmes API-t të skedarëve të WordPress. Nëse kjo direktori nuk është e shkruajtshme (kuota, të drejta, hosting i mbyllur), email-i niset pa bashkëngjitje në vend që të dështojë. Verifikoni të drejtat e shkrimit dhe hapësirën në disk.
Oraret janë të zhvendosura me një orë
Settings → General → Timezone. Zgjidhni një qytet (Europe/Brussels) në vend të një
zhvendosjeje fikse UTC: vetëm një zonë kohore e emërtuar e menaxhon kalimin në orën e
verës.
FAQ
A është OW Agenda vërtet falas?
Po. GPL-2.0-or-later, i shkarkueshëm si .zip nga
https://optionweb.dev/sq/addons/ow-agenda/. Pa version Pro, pa çelës licence, pa veçori
të bllokuar, pa llogari për të krijuar, pa kuotë takimesh.
A i marrin parasysh intervalet online takimet e marra me telefon? Po. Çdo ngjarje e axhendës — rezervim nga uebi, takim i shënuar me dorë, seancë me ftesë, bllokim — e bën hapësirën e vet kohore të padisponueshme për rezervimin online.
A duhet të krijojë llogari klienti? Jo. Asnjë llogari, asnjë fjalëkalim. Të gjitha veprimet e klientit (miratimi, anulimi) kalojnë përmes lidhjeve private të marra me email.
A mund të menaxhohen disa profesionistë ose disa dhoma? Jo. OW Agenda përshkruan një orar të vetëm. Për dy axhenda të pavarura, duhen dy sajte (ose dy sajte të një rrjeti multisite).
A sinkronizohet me Google Calendar? Në kuptimin që ka rëndësi për klientin: po. Çdo konfirmim mbart një skedar kalendari standard që e shton — dhe e përditëson, dhe e fshin — ngjarjen në Google Calendar, Outlook ose kalendarin e iPhone-it. Nga ana tjetër, plugin-i nuk i lexon kalendarët tuaj të jashtëm: padisponueshmëritë tuaja personale shënohen si bllokime.
A mund të kërkohet një kapar në momentin e rezervimit? Jo, kjo është jashtë perimetrit të marrë përsipër nga plugin-i.
Sa shërbime mund të ofrohen online? Vetëm një, të cilit i zgjidhni emërtimin dhe kohëzgjatjen. Shërbimet e tjera kalojnë përmes ftesave për seancë, që ju lënë ta caktoni titullin dhe kohëzgjatjen rast pas rasti. Kjo zgjedhje është e qëllimshme: një meny shërbimesh në një faqe publike i shumëfishon kërkesat e keqorientuara.
A funksionon në një multisite? Po. Çdo sajt i rrjetit ka tabelat e veta, cilësimet e veta dhe axhendën e vet.
A e ngadalëson plugin-i sajtin? Jo. Asnjë skript nuk ngarkohet jashtë dy faqeve përkatëse; widget-i i rezervimit peshon nën 12 KB, pa jQuery e pa framework. Puna periodike zë një detyrë të vetme për orë.
Çfarë ndodh nëse një klient nuk e miraton kurrë email-in e tij? Intervali i tij lirohet pas 45 minutash dhe kërkesa e tij fshihet pas 48 orësh. Ju nuk dëgjoni kurrë për të.
Ku gjendet mbështetja?
- Portali i mbështetjes: https://optionweb.dev/sq/addons/support/
- Email: support@optionweb.dev
- Dokumentacioni: https://optionweb.dev/sq/addons/ow-agenda/
Changelog
1.3.1
Përputhshmëri
- Faqet e pavarura të veprimit, të verifikimit dhe të anulimit nuk e printojnë më CSS-në
dhe JavaScript-in e tyre inline: të dyja janë tashmë skedarë të regjistruar dhe të
shërbyer nga API-ja e enqueue e WordPress. Dy ngjyrat e ndryshueshme të butonave kalojnë
përmes vetive CSS të personalizuara, dhe skripti konfigurohet me
wp_localize_script(). - Katalogët e përkthimit nuk vijnë më brenda paketës: dorëzohet vetëm
languages/ow-agenda.pot, ndërsa frëngjishtja shpërndahet nga paketat gjuhësore të WordPress.org të ushqyera nga translate.wordpress.org. - Versioni minimal i WordPress kthehet në 6.3: asgjë në paketë nuk varet më nga zbulimi i përkthimeve të integruara, i futur në 6.7.
REST API
- Çdo rrugë administrimi e deklaron tashmë
permission_callback-un e vet shprehimisht, në vend që ta ndajë përmesarray_merge(). Kontrolli i aftësisë zbatohej edhe më parë; tani është i dukshëm për analizën statike.
Asnjë ndryshim sjelljeje.
1.3.0
Ndërkombëtarizim
- Plugin plotësisht i përkthyeshëm (domeni
ow-agenda, anglishtja si gjuhë burim): cilësimet, faqet publike, mesazhet e API-t, email-et dhe ndërfaqja JavaScript. - Shablloni
languages/ow-agenda.poti dorëzuar dhe përkthim i plotë frëngjisht.
Siguri
- Identifikuesit publikë të takimeve dhe tokenat e ftesave gjenerohen nga një gjenerues
kriptografik (
random_bytes()). Këta tokena janë i vetmi autentikim i lidhjeve të anulimit, të miratimit dhe të ftesës. - Kurthi për botët dhe vula kohore u bënë të detyrueshme: heqja e tyre i çaktivizonte kontrollet anti-spam.
- Kuota për orë grumbullohet sipas prefiksit /64 në IPv6, dhe një tavan ditor i kufizon kërkesat e paverifikuara — një vizitor nuk mund të mbajë më të gjitha intervalet e një dite.
- Kuota zbritet vetëm pas validimit të formularit: një gabim shtypi nuk e bllokon më një vizitor legjitim për një orë.
Besueshmëri
- Rezervimet e njëkohshme të të njëjtit interval serializohen nga një kyç i emërtuar MySQL. Transaksioni i mëparshëm nuk vendoste asnjë kyç rreshti: dy vizitorë mund të rezervonin të njëjtin orar.
- Kujtesa e një dite më parë përdor një dritare rrëshqitëse prej 12 deri 36 orësh dhe e kap vonesën; çdo dërgim rezervohet në mënyrë atomike, dy ekzekutime cron-i nuk mund ta dërgojnë më dy herë të njëjtën kujtesë.
- Detyra për orë riprogramohet automatikisht nëse zhduket: kujtesat, pastrimi dhe anonimizimi nuk mund të ndalen më në heshtje.
- Zhvendosja e një takimi e përditëson kalendarin e klientit (
SEQUENCE,METHOD:REQUEST, organizatori dhe pjesëmarrësi); anulimi dërgon njëMETHOD:CANCELqë e fshin ngjarjen. - Datat e widget-it llogariten në orë lokale dhe jo në UTC: nuk humbet më asnjë ditë për vizitorët në lindje të UTC-së.
- Anulimi i një takimi që rrjedh nga një ftesë e liron ftesën, e cila bëhet sërish e përdorshme.
- Takimet e anuluara dhe kërkesat e pamiratuara të skaduara nuk i kthehen më axhendës: më pak të dhëna personale në përgjigje, më asnjë takim fantazmë.
1.2.1
- Përputhshmëri me Plugin Check: escaping i daljeve, pastrim i hyrjeve, nonce mbi cilësimet, readme.
- Çinstalimi fshin gjithashtu tabelën e regjistrit të klientëve dhe sekretin HMAC.
1.2.0
- Email-e HTML (strukturë me kartë, ngjyrë theksuese e sajtit) për të gjitha njoftimet.
- Butonat Konfirmo / Refuzo në email-in e administrimit (lidhje të firmosura HMAC).
- Regjistër klientësh: kërkim, krijim, redaktim, fshirje, shkurtore drejt një takimi të ri dhe një ftese.
1.1.0
- Verifikim i dyfishtë me email kundër botëve (interval i mbajtur 45 minuta, pastrim pas 48 orësh).
1.0.0
- Version fillestar: rezervim online, axhendë administrimi mobile-first, ftesa për seancë, email-e me skedar kalendari dhe kujtesë një ditë përpara.
Ndërtuar nga OptionWeb — Julien Daniel, Châtelet, Belgjikë.