Drejtpërdrejt · statusi OK
Dokumentacion · OW Agenda v1.3.1

OW Agenda
Dokumentacion

Rezervimi i takimeve në WordPress që nuk lë askënd t'i zërë kot intervalet e tua.

v1.3.1GPL-2.0-or-laterDokumentacion

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

  1. Përmbledhje
  2. Instalimi
  3. Fillim i shpejtë
  4. Rrjedha e rezervimit
  5. Verifikimi i dyfishtë me email
  6. Miratimi i kërkesave
  7. Faqja Axhenda
  8. Regjistri i klientëve
  9. Ftesat për seancë
  10. Email-et dhe skedari i kalendarit (ICS)
  11. Kujtesat dhe detyra e planifikuar
  12. Anti-spam dhe kufijtë e shpejtësisë
  13. GDPR
  14. Shortkodet
  15. REST API
  16. Referencë e cilësimeve
  17. Të dhënat e ruajtura
  18. Ndërkombëtarizimi
  19. Çinstalimi
  20. Zgjidhja e problemeve
  21. FAQ
  22. 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

  1. Shkarkoni ow-agenda-1.3.1.zip nga https://optionweb.dev/sq/addons/ow-agenda/
  2. Plugins → Add New → Upload Plugin
  3. Zgjidhni skedarin, klikoni Install Now, pastaj Activate

Me FTP

Shpaketoni arkivin dhe vendosni dosjen ow-agenda/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:

TabelaPërmbajtja
{prefix}_owag_appointmentsTë gjitha ngjarjet e axhendës: konsulta nga uebi, seanca nga një ftesë, takime të shënuara me dorë, bllokime intervalesh
{prefix}_owag_invitesLidhjet private « zgjidhni datën e seancës suaj »
{prefix}_owag_customersRegjistri 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_manage te roli administrator — është ajo, dhe jo manage_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:

  1. bie brenda një hapësire hapjeje të ditës përkatëse;
  2. i gjithë takimi (nisja + kohëzgjatja) hyn përpara mbylljes;
  3. nis pas tani + afati minimal;
  4. dita është brenda horizontit të rezervimit;
  5. 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:

KonfigurimiStatusi i krijuarMesazhi 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 manualpending« Kërkesa juaj u mor me sukses! »
Verifikimi i çaktivizuar + konfirmim automatikconfirmed« 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):

  1. Kërkesa regjistrohet me statusin unverified. Administratori nuk njoftohet. Takimi nuk shfaqet si kërkesë për t'u trajtuar.
  2. Vizitori merr një email « Edhe një veprim i fundit… » që përmban një buton miratimi.
  3. 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.
  4. 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ë.
  5. Kërkesa bëhet atëherë pending (miratim manual) ose confirmed (konfirmim automatik), klienti merr email-in përkatës, dhe vetëm atëherë niset njoftimi drejt administratorit.
  6. 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: » që përmban përmbledhjen e plotë (shërbimi, data, emri, telefoni, email-i, mesazhi i klientit) dhe dy butona:

  • 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:

  1. 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.
  2. Zgjidhni vlefshmërinë e lidhjes: 60 ditë si parazgjedhje, nga 1 deri 365.
  3. 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.
  4. 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-iMarrësiNxitësi
Miratim i kërkesësKlientiRezervim nga uebi kur verifikimi i dyfishtë është aktiv
Kërkesa u morKlientiKërkesë e miratuar, në pritje të vendimit tuaj
Takim i konfirmuarKlientiKonfirmim (manual, automatik, shënim nga admini, zhvendosje) — me bashkëngjitje ICS
Takim i anuluarKlientiAnulim nga klienti, refuzim ose anulim nga admini — me bashkëngjitje ICS anulimi
KujtesëKlientiAutomatikisht, ndërmjet 12 dhe 36 orësh përpara takimit
Zgjidhni datën e seancës suajKlientiKrijim i një ftese me dërgim me email
Për konfirmim: …AdminiKërkesë e re e verifikuar në pritje — me butonat Konfirmo / Refuzo
Takim i ri: …AdminiTakim i ri i konfirmuar (konfirmim automatik, ftesë)
Anulim nga klienti: …AdminiKlienti 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:REQUEST në krijim dhe në çdo rishikim orari, METHOD:CANCEL në anulim;
  • një UID i 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ë SEQUENCE në 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) dhe ATTENDEE (klienti);
  • DTSTART / DTEND në UTC, STATUS:CONFIRMED ose STATUS: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_appointments dhe {prefix}_owag_customers mbi kolonën customer_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):

URLRoli
?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=1Manifesti 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.

MetodaShteguParametratRoli
GET/public/daysfrom (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/slotsdate (Y-m-d, i detyrueshëm), tokenKthen slots: orët e lira të nisjes (HH:MM)
POST/public/bookdate, time, name, phone, email, message, consent, website (kurth), ts (vulë kohore), tokenKrijon kërkesën; kthen status dhe mesazhin që duhet shfaqur
POST/public/verifyuidMiraton një kërkesë unverified
POST/public/canceluidAnulon një takim pending ose confirmed, brenda afatit të paralajmërimit
POST/public/admin-actionuid, action (confirm|refuse), sigKonfirmon 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).

MetodaShteguParametratRoli
GET/admin/agendafrom, 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/appointmentkind (manual|block|consult|seance), date, time, duration (5–720 min), label, name, phone, email, notes, force, send_emailKrijon 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, silentPërditëson, zhvendos, ndryshon statusin. silent=1 heq çdo dërgim email-i
GET/admin/customersq (kërkim)Regjistri (maksimumi 200 skeda)
POST/admin/customersname (i detyrueshëm), phone, email, notesKrijon një skedë
POST/admin/customers/{id}njësojPërditëson një skedë
DELETE/admin/customers/{id}Fshin një skedë
GET/admin/invitesFtesat e hapura (të papërdorura kurrë ose të liruara, të paskaduara)
POST/admin/invitesname (i detyrueshëm), label (i detyrueshëm), duration (15–720), days_valid (1–365, parazgjedhje 60), email, phone, send_emailKrijon një ftesë; kthen url dhe email_sent
DELETE/admin/invites/{id}Fshin një ftesë
GET/admin/settingsCilësimet efektive
POST/admin/settingstrup 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.

KodiHTTPKuptimi
owag_spam403Kurthi për botët i plotësuar, ose vulë kohore që mungon / tepër e re
owag_rate429Kuota për orë e arritur për këtë adresë
owag_day_full429Tepër kërkesa në pritje miratimi për këtë datë
owag_busy503Kyçi i rezervimit nuk u mor — riprovoni pas pak
owag_slot_taken409Intervali u zu ndërkohë
owag_overlap409Mbivendosje e zbuluar (admin) — ridërgoni me force
owag_invite_invalid404Token ftese i panjohur
owag_invite_used410Ftesë tashmë e konsumuar
owag_invite_expired410Ftesë e skaduar
owag_too_late403Anulim online jashtë afatit të paralajmërimit
owag_bad_sig403Firmë HMAC e pavlefshme
owag_not_found404Takim ose skedë që nuk gjendet
owag_name, owag_phone, owag_email, owag_consent400Fushë e pavlefshme ose pëlqim që mungon
owag_bad_input, owag_bad_date400Datë, orë ose e dhënë e pavlefshme
owag_noop400Kërkesë përditësimi bosh
owag_insert500Dë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ësimiLlojiKufijtë e ndërfaqesEfekti
hourstabelë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_stepnumër i plotë5 → 120 minDistanca mes orëve të ofruara. Sa më i imët, aq më e gjatë lista
consult_durationnumër i plotë15 → 480 minKohëzgjatja e rezervuar në axhendë për një konsultë nga uebi
buffernumër i plotë0 → 120 minPauza e zbatuar nga të dyja anët e intervalit kandidat
min_notice_hoursnumër i plotë0 → 168 orëAsgjë nuk ofrohet përpara tani + ky afat
max_advance_daysnumër i plotë7 → 365 ditëHorizonti përtej të cilit nuk ofrohet më asnjë interval
auto_confirm0 / 1Miratim manual ose konfirmim i menjëhershëm
email_verify0 / 1Opt-in i dyfishtë me email (lëreni aktiv)
cancel_notice_hoursnumër i plotë0 → 168 orëPërtej tij, anulimi online refuzohet me një mesazh që fton të telefonojë
notify_emailemailMarrësi i njoftimeve të administrimit; shërben gjithashtu si ORGANIZER në skedarët ICS
retention_monthsnumër i plotë0 → 120 muajAnonimizimi i takimeve të përfunduara; 0 e çaktivizon
consult_labeltekstTitulli 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ë DATETIMEorë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

KolonaLlojiShënime
idBIGINTÇelës primar
uidCHAR(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
kindVARCHAR(16)consult, seance, manual, block
service_labelVARCHAR(120)Emërtimi i shfaqur
customer_name, customer_phone, customer_emailVARCHARTë dhënat e kontaktit
customer_msgTEXTMesazhi i lënë nga klienti
admin_notesTEXTShënime të brendshme, kurrë të dërguara te klienti
start_dt, end_dtDATETIMEKufijtë e intervalit (të indeksuar mbi start_dt)
statusVARCHAR(16)unverified, pending, confirmed, cancelled, done, noshow
sourceVARCHAR(16)web, invite, admin
invite_idBIGINTFtesa e origjinës, kur ka të tillë
reminder_sentTINYINTFlamuri i kujtesës (kthehet në 0 në rast zhvendosjeje)
created_at, updated_atDATETIMEupdated_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ë %s të 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 a dhe l 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ërdor l 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_manage nga 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ë:

  1. A janë plotësuar oraret e asaj dite? Një ditë bosh është ditë e mbyllur.
  2. Afati minimal (24 orë si parazgjedhje) e fsheh detyrimisht sotin dhe një pjesë të nesërmes.
  3. 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.
  4. Horizonti: ditët përtej max_advance_days nuk ofrohen kurrë.
  5. Pauza: një pauzë e gjerë mbi një orar të ngarkuar mund të mbyllë gjithçka.
  6. Një bllokim ndoshta e mbulon ditën. Hapni faqen Axhenda te dita përkatëse.
  7. 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.

  1. Verifikoni se takimi ekziston vërtet në faqen Axhenda: nëse është aty, plugin-i e ka bërë punën e vet.
  2. Instaloni një plugin SMTP (Fluent SMTP, WP Mail SMTP…). Funksioni mail() i PHP-së refuzohet nga shumica dërrmuese e serverave marrës.
  3. Verifikoni SPF, DKIM dhe DMARC të domenit tuaj.
  4. 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?


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ërmes array_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.pot i 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:CANCEL që 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ë.