Drejtpërdrejt · statusi OK
Dokumentacion · OW Consent v1.4.3

OW Consent
Dokumentacion

Pëlqimi për WordPress që i bllokon gjurmuesit para klikimit, jo pas tij.

v1.4.3GPL-2.0-or-laterDokumentacion

OW Consent — Dokumentacion

Menaxhimi i plotë i pëlqimit në WordPress: banner shumëjuridiksional, bllokim i gjurmuesve, skaner, dokumente ligjore, regjistër provash dhe portal të drejtash. Autor: OptionWeb — Julien Daniel Faqja e shtojcës: https://optionweb.dev/sq/addons/ow-consent/ Licenca: GPL-2.0-or-later Versioni i mbuluar nga ky dokument: 1.4.3


Tabela e përmbajtjes

  1. Vështrim i përgjithshëm
  2. Instalimi
  3. Nisja e shpejtë
  4. Njëmbëdhjetë profilet e përputhshmërisë
  5. Kategoritë e cookie-ve
  6. Banneri
  7. Bllokimi automatik
  8. Skaneri i gjurmuesve
  9. Gjeneruesi i dokumenteve ligjore
  10. Regjistri i pëlqimeve
  11. Portali i të drejtave (DSAR)
  12. Opt-out-i CCPA «Do Not Sell or Share»
  13. Google Consent Mode v2
  14. IAB TCF v2.2
  15. Global Privacy Control
  16. Zbulimi rajonal
  17. Integrimi me OW Forms
  18. Butoni pluskues
  19. Shortcode-et
  20. API REST
  21. Referenca e cilësimeve
  22. Zgjidhja e problemeve
  23. FAQ

Vështrim i përgjithshëm

OW Consent është një suitë për menaxhimin e pëlqimit në WordPress. Ajo mbulon gjithë zinxhirin: shfaqjen e një zgjedhjeje, zbatimin e saj real te gjurmuesit, ruajtjen e provës, publikimin e dokumenteve që e shpjegojnë atë dhe pritjen e kërkesave të subjekteve të të dhënave.

Vijnë të gatshme njëmbëdhjetë profile përputhshmërie — nga GDPR-ja te CCPA-ja, duke kaluar nga Ligji 25 i Kebekut, LGPD-ja braziliane apo DPDP-ja e Indisë. Profili aktiv vendos modelin e pëlqimit (opt-in ose opt-out), vlerat e parazgjedhura të Google Consent Mode, tekstin e dokumenteve të gjeneruara, të drejtat e publikuara dhe autoritetin mbikëqyrës që citohet.

Gjithçka qëndron brenda faqes suaj. Shtojca kontakton vetëm një shërbim të jashtëm, Global Vendor List-in e IAB Europe, dhe vetëm nëse aktivizoni modulin TCF, i cili është i çaktivizuar si parazgjedhje. Pa telemetri, pa llogari, pa abonim.

E pajtueshme me një cache të plotë faqesh, nga vetë ndërtimi

Ky është pika arkitekturore që qeveris gjithçka tjetër. Asgjë nga ajo që jep serveri nuk varet nga cookie-ja e pëlqimit. HTML-ja është e njëjtë për të gjithë vizitorët: gjurmuesit rishkruhen si etiketa inerte për të gjithë, dhe është një runtime JavaScript ai që i liron brenda shfletuesit, kategori pas kategorie, duke lexuar cookie-n para renderimit të parë.

Pasojë praktike: LiteSpeed Cache, WP Rocket, Varnish apo një CDN nuk mund t'ia shërbejnë zgjedhjet e një vizitori një tjetri. Vetëm përgjigjet vërtet personale — faqja e konfirmimit të identitetit për një kërkesë të drejtash, përgjigjet REST që përmbajnë të dhëna të vizitorit — shënohen shprehimisht si të pacache-ueshme. Asnjë nonce nuk shtypet as brenda HTML-je të cache-ueshme: banneri merr një të freskët nga një endpoint no-store pak para çdo shkrimi.

Çfarë vjen brenda

  • Banner pëlqimi: katër pozicione, temë e çelët / e errët / automatike, «Refuzoji të gjitha» po aq i dukshëm sa «Pranoji të gjitha», panel preferencash i përdorshëm me tastierë, plotësisht i përkthyeshëm.
  • Bllokim automatik i gjurmuesve: skripte, fragmente inline, iframe, piksela, sugjerime burimesh (preconnect, dns-prefetch, preload), fletë stilesh analytics/marketing dhe media palësh të treta, nisur nga 175 firma të përfshira dhe të redaktueshme.
  • Skaner gjurmuesish: shfletim i faqeve tuaja me WP-Cron, lexim i header-ave Set-Cookie, sondë shfletuesi e rezervuar për administratorët, dhe një panel që thotë gjithnjë çfarë ka mbuluar vërtet shfletimi.
  • Gjenerues dokumentesh ligjore: politikë privatësie dhe politikë cookie-sh për të njëmbëdhjetë profilet, në gjuhën e juridiksionit; njoftim ligjor dhe kushte të përgjithshme në frëngjisht.
  • Regjistër pëlqimesh: çdo veprim i shtohet një tabele të lidhur në zinxhir me HMAC, bashkë me profilin në fuqi, hash-in e dokumenteve të publikuara dhe hash-in e bannerit që u shfaq vërtet.
  • Portal të drejtash (DSAR): formular me shortcode, verifikim me e-mail, afati i nenit 12.3 që nis nga konfirmimi i identitetit, lidhje me eksportuesin dhe fshirësin vendas të WordPress-it.
  • Google Consent Mode v2, IAB TCF v2.2, Global Privacy Control, zbulim rajonal, integrim me OW Forms: secili aktivizohet më vete.
  • API REST e plotë nën namespace-in owc/v1.

Çfarë nuk bën — lexojeni para se të angazhoheni

Në një çështje juridike, një premtim i tepruar ju ekspozon aq sa ekspozon edhe botuesin. Ja kufijtë, ashtu siç janë shkruar në kod.

  • Dokumentet e gjeneruara janë modele, jo këshillë juridike. Çdo dokument mbyllet me një paralajmërim që e thotë këtë, dhe ai paralajmërim është aktiv si parazgjedhje. Jepini dokumentet për rishikim para se t'i publikoni.
  • Moduli TCF nuk është një CMP i regjistruar pranë IAB Europe. Ai kërkon një CMP ID që duhet ta siguroni vetë, nuk ofron asnjë zgjedhje në nivel ofruesi, dhe ofruesit kanë të drejtë ta refuzojnë sinjalin e tij. Nëse të ardhurat reklamuese nën TCF kanë peshë për ju, përdorni një CMP të certifikuar.
  • Regjistri është i pafalsifikueshëm vetëm me kusht. Zinxhiri është provë vetëm nëse çelësi i tij i nënshkrimit qëndron jashtë bazës së të dhënave. Shtojca e zbulon rastin e kundërt, e raporton vetë dhe jua thotë në administrim, në vend që të pretendojë të kundërtën.
  • Skaneri nuk ekzekuton asnjë JavaScript. Ai sheh çfarë përmban HTML-ja juaj dhe çfarë lëshojnë header-at tuaj Set-Cookie; atë që një menaxher etiketash injekton në runtime e sheh vetëm një sondë e rezervuar për administratorët e kyçur.
  • Bllokimi i parazgjedhur nuk është «gjithçka e palës së tretë». Një skript i panjohur i palës së tretë lejohet si parazgjedhje; janë iframe-t e panjohura që bllokohen si parazgjedhje. Bllokimi mbështetet te katalogu i firmave, të cilin mund ta pasuroni.
  • Pa JavaScript, asnjë zgjedhje nuk mund të regjistrohet. Vizitori sheh një bllok <noscript> dhe asgjë jothelbësore nuk ngarkohet, por as nuk regjistrohet asgjë.
  • Pa ndarje shtet për shtet në SHBA e as provincë për provincë në Kanada brenda zbulimit rajonal: gjithë territori amerikan merr profilin ccpa, gjithë Kanadaja merr quebec.
  • Njoftimi ligjor dhe kushtet e përgjithshme ekzistojnë vetëm në frëngjisht. Për çdo juridiksion, gjuha e së cilës nuk është frëngjishtja, gjeneruesi refuzon t'i prodhojë këto dy dokumente në vend që të publikojë një tekst të papërshtatshëm.
  • Asnjë rol i dedikuar: gjithë administrimi kërkon lejen manage_options.

Kjo listë është zgjedhje e pranuar hapur, jo një udhërrëfyes i fshehur. Në përputhshmëri, një mjet që i deklaron vrimat e veta vlen më shumë se një mjet që i fsheh.


Instalimi

Nga .zip-i

  1. Shkarkoni ow-consent-1.4.3.zip nga https://optionweb.dev/sq/addons/ow-consent/
  2. Shtojcat → Shto të re → Ngarko shtojcën
  3. Zgjidhni skedarin, klikoni Instalo, pastaj Aktivizo

Me FTP

Shpaketoni arkivin dhe vendoseni dosjen ow-consent/wp-content/plugins/, pastaj aktivizoni shtojcën nga Shtojcat.

Kërkesat paraprake

  • WordPress 6.2 ose më i ri — kjo është një refuzim nisjeje, jo një rekomandim (shihni më poshtë)
  • PHP 7.4 ose më i ri
  • MySQL 5.7+ / MariaDB 10.2+
  • WP-Cron funksional nëse përdorni skanerin, ruajtjen e regjistrit, kujtesat e afatit DSAR ose modulin TCF

Mbrojtësi WordPress 6.2. Që nga 1.3.0, çdo identifikues tabele lidhet me shënuesin %iwpdb::prepare(), të cilin WordPress-i e kupton vetëm nga 6.2 e tutje. Në një bërthamë më të vjetër, prepare() do të kthente një varg bosh, katalogu i gjurmuesve do të zgjidhej në heshtje si një grup bosh, dhe banneri do të vazhdonte t'i premtonte vizitorit një bllokim që s'do të ndodhte. Prandaj shtojca refuzon të niset dhe shfaq një mesazh gabimi që thotë shprehimisht se asgjë nuk bllokohet dhe se asnjë pëlqim nuk regjistrohet. Header-i Requires at least e pengon tashmë aktivizimin nën 6.2, por ai nuk mbulon as një kthim pas të bërthamës nën një instalim në shërbim, as një kopje të hedhur me FTP.

Çfarë instalohet

Në aktivizim, OW Consent krijon katër tabela:

TabelaPërmbajtja
{prefix}owc_ledgerRegjistri i pëlqimeve, i lidhur në zinxhir me hash
{prefix}owc_dsarKërkesat për ushtrimin e të drejtave
{prefix}owc_scannerGjetjet e skanerit të gjurmuesve
{prefix}owc_scriptsKatalogu i firmave që përdor bllokimi

Një tabelë e pestë, {prefix}owc_form_links, krijohet veçmas nga integrimi me OW Forms nëse shtojca motër është aktive (shihni Integrimi me OW Forms).

Aktivizimi shton gjithashtu:

  • opsionin owc_settings, të mbjellë bosh — me qëllim: për sa kohë nuk keni ruajtur asgjë, të gjithë tekstet vijnë nga parazgjedhjet angleze, të përkthyera në çast në gjuhën e faqes, në vend që të ngurtësojnë në bazë lokalen e personit që aktivizoi shtojcën;
  • opsionin owc_version;
  • katalogun e gjurmuesve që vjen brenda (data/tracker-catalog.json), të futur në grupe nga 100 me INSERT IGNORE, me një flamur mbjelljeje sipas versionit (owc_catalog_seeded_1.4.3);
  • detyrën ditore owc_daily_maintenance, të planifikuar një orë pas aktivizimit.

Pesë ngjarje të tjera cron armatosen nga modulet që i përdorin. Gjashtë hook-et cron të shtojcës janë: owc_scanner_run, owc_scanner_run_batch, owc_ledger_retention, owc_tcf_refresh_gvl, owc_run_upgrade dhe owc_daily_maintenance.

Në multisite, tabelat krijohen për çdo faqe, kurrë të përbashkëta (wp_2_owc_ledger, etj.). Një aktivizim në nivel rrjeti i shfleton të gjitha faqet vetëm nëse rrjeti ka jo më shumë se 200 faqe; përtej kësaj, çdo faqe furnizohet me përtaci në kërkesën e saj të parë. Një nënfaqe e krijuar pas një aktivizimi rrjeti furnizohet nga hook-u wp_initialize_site.

Çfarë duhet përcaktuar në wp-config.php

Asnjëra prej këtyre konstanteve nuk është e detyrueshme, por dy prej tyre e ndryshojnë vlerën provuese të asaj që prodhon shtojca.

// Rekomandohet: e nxjerr çelësin e nënshkrimit të regjistrit jashtë bazës së të dhënave.
define( 'OWC_LEDGER_KEY', 'një varg i gjatë i rastësishëm, unik për këtë faqe' );

// Rekomandohet: salt-et standarde të WordPress-it. Pa to, WordPress i ruan në bazë,
// dhe regjistri e sinjalizon vetë veten si të falsifikueshëm.
define( 'AUTH_KEY',  '…' );
define( 'AUTH_SALT', '…' );

// Nëse faqja qëndron pas një CDN-je, një balancuesi ngarkese ose një reverse proxy-je.
// Pa këtë konstante, CF-Connecting-IP, X-Forwarded-For dhe X-Real-IP SHPËRFILLEN
// dhe përdoret vetëm REMOTE_ADDR — çka u jep të gjithë vizitorëve tuaj të njëjtin
// identitet për kufizimin e shpeshtësisë.
define( 'OWC_TRUSTED_PROXY', '198.51.100.0/24, 2001:db8::/32' );
// `OWC_TRUSTED_PROXIES` pranohet si alias; vlen edhe një varg, edhe një grup.

// Vetëm për zbulimin rajonal: deklaron cilët header shtetesh janë të besueshëm.
define( 'OWC_GEO_TRUSTED_HEADERS', 'cloudflare' ); // 'cloudflare'|'cloudfront'|'proxy'|'all'
define( 'OWC_BEHIND_CLOUDFLARE', true );
define( 'OWC_BEHIND_CLOUDFRONT', true );

OWC_LEDGER_KEY shërben edhe për të nxjerrë çelësin e cookie-s së zbulimit rajonal. Nëse nuk përcaktohet, çelësi i regjistrit bie te wp_salt('auth').

Kush ka qasje

Gjithë administrimi i shtojcës dhe të gjitha rrugët REST të administrimit kërkojnë lejen manage_options. Nuk ekziston as rol i dedikuar, as leje më e imët: t'ia hapësh ekranin e shtojcës dikujt do të thotë t'i japësh cilësimet e faqes.

Rruga e përditësimit

Shtojca nuk e migron kurrë skemën e vet drejtpërdrejt mbi një faqe anonime. Kur ndryshon versioni, owc_version dhe një flamur owc_pending_upgrade shkruhen menjëherë, pastaj:

  • migrimi kryhet inline nëse kërkesa është një kërkesë administrimi jashtë AJAX-it, një ekzekutim cron-i ose një komandë WP-CLI;
  • përndryshe planifikohet një ngjarje owc_run_upgrade pesë sekonda më vonë.

admin-ajax.php trajtohet si kërkesë anonime: është pikë hyrjeje publike. Migrimi kryhet nën një kyç (owc_upgrade_lock, i vjedhur pas 300 sekondash), dhe një rrjetë sigurie mbi admin_init i kap faqet ku WP-Cron-i është i çaktivizuar. Në një version identik, kostoja e plotë është një get_option() i vetëm.

Çaktivizimi dhe fshirja

Çaktivizimi i ruan të gjitha të dhënat dhe fshin vetëm gjashtë ngjarjet cron. Në çaktivizim rrjeti shfletohen të gjitha faqet në grupe nga 200 — ndryshe nga aktivizimi — sepse një cron i lënë i armatosur nuk do të zhdukej kurrë.

Fshirja e shtojcës nis uninstall.php, i cili vepron në dy faza:

  1. Gjithnjë, pavarësisht cilësimit tuaj: gjashtë cron-et fshihen dhe tabela {prefix}owc_dsar hiqet, bashkë me transient-et e saj të kufizimit të shpeshtësisë. Është e vetmja tabelë që përmban të dhëna personale drejtpërdrejt identifikuese për palë të treta (adresë e-maili, emër, tekst i lirë); sapo shtojca të ketë ikur, asgjë nuk e kufizon më ruajtjen e saj dhe asnjë ekran nuk lejon t'u përgjigjeni, t'i eksportoni apo t'i fshini. Eksportoni kërkesat që duhet të ruani përpara se ta fshini shtojcën.
  2. Vetëm nëse delete_data_on_uninstall është aktivizuar shprehimisht: fshihen tabelat owc_ledger, owc_dsar, owc_scanner, owc_scripts dhe owc_form_links, opsionet me emër, të gjitha opsionet me prefiksin owc_ (përfshirë transient-et) dhe usermeta me prefiksin owc_. Në multisite, opsionet e rrjetit ndjekin vendimin e faqes kryesore.

Ky cilësim është i çaktivizuar si parazgjedhje: prova e pëlqimit, e kërkuar nga neni 7.1 i GDPR-së, i mbijeton fshirjes së shtojcës.


Nisja e shpejtë

Pas aktivizimit, hapni zërin OW Consent në shiritin anësor të administrimit. Gjithë shtojca rri në këtë ekran të vetëm, në dhjetë skeda: Dashboard, Banner, Compliance, Legal identity, Categories, Policies, Scanner, Tracker catalogue, Audit ledger, DSAR requests.

Një ruajtje prek vetëm skedën e hapur. Kjo është me qëllim: çdo vlerë boolean ka një fushë të fshehur binjake, dhe një çelës që mungon në formular do të thotë «kjo fushë ndodhet në një skedë tjetër», kurrë «e pashënuar». Pa këtë, ruajtja e një skede do të mbishkruante cilësimet e të gjitha të tjerave.

1. Zgjidhni profilin tuaj të përputhshmërisë

Skeda Compliance. Profili vendos modelin e pëlqimit, vlerat e parazgjedhura të Consent Mode, dokumentet e gjeneruara dhe të drejtat e publikuara. Si parazgjedhje: gdpr.

compliance_strict është i aktivizuar si parazgjedhje: është ai që e shtrin bllokimin përtej skripteve të regjistruara nga WordPress-i. Lëreni aktiv nëse doni që të trajtohen iframe-t, pikselat dhe skriptet e shkruara drejt e në temën tuaj.

2. Plotësoni identitetin ligjor

Skeda Legal identity. Këto fusha janë lënda e parë e dokumenteve të gjeneruara, dhe gjenerimi refuzohet për sa kohë një fushë e detyrueshme mbetet bosh — bashkë me listën e çelësave që mungojnë, jo me një dështim në heshtje.

Minimumi për të gjitha dokumentet: legal_company_name dhe legal_company_email. Për gjithçka veç politikës së cookie-ve, shtoni adresën dhe shtetin. Për njoftimin ligjor, shtoni edhe telefonin, drejtorin e botimit dhe të dhënat e plota të strehuesit; në Francë, Belgjikë dhe Luksemburg bëhen të detyrueshme edhe forma juridike dhe numri i regjistrimit.

Lëreni legal_dpa_authority bosh: autoriteti mbikëqyrës nxirret nga shteti dhe profili juaj. Ta plotësoni me dorë në një faqe shumëjuridiksionale do të thotë të emërtoni rregullatorin e gabuar.

3. Kontrolloni kategoritë tuaja

Skeda Categories. Të gjashtë kategoritë janë të disponueshme si parazgjedhje. Çaktivizoni ato që faqja juaj nuk i përdor: një kategori që mungon në ndërfaqe nuk është fitim përputhshmërie, është një burim i bllokuar përgjithmonë pa asnjë çelës për ta liruar — bllokimi atëherë e kalon te marketing.

Lërini etiketat bosh sa kohë ju përshtaten: kështu ato ndjekin gjuhën e faqes. Sapo të personalizoni një tekst, ai tekst pushon së ndjekuri gjuhën.

4. Rregulloni bannerin

Skeda Banner. Pozicioni, tema, butonat, etiketat, kohëzgjatja e rinovimit.

Dy pika që nuk duhen humbur: lëreni banner_reject_all aktiv («Refuzo» duhet të jetë po aq i thjeshtë e po aq i dukshëm sa «Prano»), dhe lëreni kryqin e mbylljes të çaktivizuar — ai mungon si parazgjedhje sepse një mbyllje pa zgjedhje barazohet me refuzim të nënkuptuar. Nëse e aktivizoni, një klikim mbi kryq kryen gjithë rrugën «Refuzoji të gjitha», kurrë një mbyllje në heshtje.

5. Gjeneroni dokumentet tuaja

Skeda Policies. Katër dokumente: politika e cookie-ve, politika e privatësisë, njoftimi ligjor, kushtet e përgjithshme. Secili bëhet një faqe WordPress me versione, lidhja e së cilës riinjektohet në cilësime.

Gjeneroni fillimisht në parapamje, rilexoni, pastaj publikoni. Dhe jepini për rishikim te një profesionist: shiriti i paralajmërimit në fund të çdo dokumenti nuk është dekorativ.

6. Hapni portalin e të drejtave

Krijoni një faqe dhe ngjisni në të [owc_dsar_form]. Plotësoni dsar_email në skedën DSAR requests: kjo është adresa e kontaktit që publikohet nën formular dhe marrësi i njoftimeve. Pa të, shtojca bie te legal_dpo_email, pastaj te admin_email — por admin_email nuk publikohet kurrë në një faqe publike.

7. Kontrolloni para se ta hapni për publikun

Paneli i kontrollit kryen pesëmbëdhjetë verifikime përputhshmërie dhe i dallon gabimet nga paralajmërimet: banner i çaktivizuar, «Refuzoji të gjitha» që mungon, kryq mbyllje i aktivizuar, identitet ligjor i paplotë, portal të drejtash i mbyllur, regjistër i çaktivizuar, asnjë politikë e lidhur, autoritet mbikëqyrës në kundërshtim me profilin aktiv (me një buton «Fix this» që e rikthen në gjendjen fillestare), faqe jo në HTTPS, gjurmues të pakategorizuar, kërkesa DSAR jashtë afatit, rregulla katalogu që nuk mund të aktivizohen kurrë.

Kalojini këto pesëmbëdhjetë rreshta në të gjelbër përpara se të shpallni se faqja juaj është në përputhshmëri.


Njëmbëdhjetë profilet e përputhshmërisë

Profili i përputhshmërisë nuk është kozmetik. Ai drejton modelin ligjor, ndërfaqen, sinjalet teknike dhe përmbajtjen e dokumenteve të publikuara.

Lista

ProfiliRegjimi i synuarModeli
gdprGDPR + ePrivacy (BE/ZEE)Opt-in
uk_pecrUK GDPR + PECR (Mbretëria e Bashkuar)Opt-in
ch_nfadpnFADP zviceraneOpt-in
quebecLigji 25 (Kebek)Opt-in
lgpdLGPD (Brazil)Opt-in
popiaPOPIA (Afrika e Jugut)Opt-in
piplPIPL (Kinë)Opt-in
dpdpDPDP Act 2023 (Indi)Opt-in
ccpaCCPA / CPRA (Kaliforni)Opt-out
us_genericLigje shtetërore amerikane të përgjithshmeOpt-out
auPrivacy Act (Australi)Opt-out

Cilësimi: compliance_profile, parazgjedhja gdpr.

Opt-in do të thotë se para çdo zgjedhjeje jepen vetëm kategoritë e detyruara. Opt-out do të thotë se gjithçka është e dhënë deri në refuzim. Tre profilet opt-out janë ccpa, us_generic dhe au. Runtime-i JavaScript zbaton saktësisht të njëjtën rregull si PHP-ja, kështu që serveri dhe shfletuesi nuk mund të raportojnë dy gjendje të ndryshme.

Çfarë ndryshon vërtet profili

Çfarë ndryshonDetaji
Modeli i pëlqimitOpt-in, veç ccpa, us_generic, au
Vlerat e parazgjedhura të Consent ModeTë shtatë sinjalet kalojnë në granted nën një profil opt-out
Lidhja «Do Not Sell or Share» e detyrueshmeVetëm ccpa dhe us_generic
GPC ligjërisht detyruesVetëm ccpa dhe us_generic — Australia përjashtohet shprehimisht: regjim opt-out, por që nuk e njeh GPC-në
Perimetri «zbatohet GDPR-ja» për TCF27 shtete të BE-së + IS, LI, NO + GB + CH, pra 31 kode
Gjuha e dokumentit të gjeneruarquebec → frëngjisht; lgpd → portugalisht; gdpr me shtet FR, BE ose LU → frëngjisht; gjithë pjesa tjetër → anglisht
Autoriteti mbikëqyrës i cituarTabelë sipas profilit, e imtësuar sipas shtetit për GDPR-në
Lista e të drejtave të publikuaraNjë listë e shkruar për çdo profil, me citim neni
Trupi «regjimi i cookie-ve» i dokumentit anglishtTekst, perimetër transferimi dhe garanci të ndryshme sipas profilit

Dokumentet e gjeneruara sipas profilit

Politika e privatësisë dhe politika e cookie-ve ekzistojnë për të njëmbëdhjetë profilet. Shabllonet zgjidhen sipas kësaj radhe, fiton i pari që gjendet: <lloji>_<profili>_<gjuha>, pastaj <lloji>_<profili>, pastaj <lloji>_<gjuha>, pastaj <lloji>.

Trupat anglisht të politikës së cookie-ve janë të vetëdijshëm për profilin: rregulla e zbatueshme, perimetri i transferimit, garancitë dhe teksti i panelit ndryshojnë për gdpr, uk_pecr, ch_nfadp, au, pipl, dpdp, ccpa dhe us_generic, me citimet përkatëse (neni 5(3) i direktivës 2002/58, PECR reg. 6, neni 45c(b) LTC dhe neni 19/6(7)(b) nLPD, APP 8, neni 24 PIPL, seksionet 5/6/7/9(3)/16 të DPDP Act 2023, §1798.121 dhe Cal. Code Regs. tit. 11 §7025, VCDPA/CPA/CTDPA/UCPA/TDPSA).

Autoriteti mbikëqyrës i cituar

ProfiliAutoriteti i emërtuar
gdpr, shteti FRCNIL
gdpr, shteti BEAPD-GBA
gdpr, shteti LUCNPD
gdpr, shteti DEBfDI
gdpr, shtet tjetër i ZEE-sëFormulim i përgjithshëm («autoriteti mbikëqyrës kompetent»)
uk_pecrICO
ch_nfadpPFPDT / FDPIC
quebecCommission d'accès à l'information
lgpdANPD
ccpaCalifornia Privacy Protection Agency
popiaInformation Regulator (South Africa)
piplCyberspace Administration of China
dpdpData Protection Board of India
auOAIC
us_genericAttorney General i shtetit tuaj

Nëse e keni ndryshuar legal_dpa_authority, fiton ajo që keni shkruar ju mbi këtë nxjerrje automatike.

Kufijtë e mbulimit juridiksional

  • Vetëm katër shtete të ZEE-së kanë autoritet të emërtuar (FR, BE, LU, DE). Një faqe nën GDPR në Spanjë, Itali ose Holandë publikon një formulim të përgjithshëm.
  • Pa ndarje shtet për shtet në SHBA. Profili us_generic ekziston dhe mbart tekstet e veta VCDPA/CPA/CTDPA/UCPA/TDPSA, por asnjë zbulim automatik nuk ia cakton: zgjidhet me dorë.
  • Pa ndarje sipas provincave në Kanada.
  • Vetëm tri gjuhë dokumentesh: frëngjisht, anglisht, portugalisht. Trupat nuk kalojnë nga mekanizmi i përkthimit të WordPress-it — kjo është me qëllim: një dokument ligjor duhet të jetë njëgjuhësh dhe gjuha e tij ndjek juridiksionin, kurrë lokalen e administratorit.
  • Njoftimi ligjor dhe kushtet e përgjithshme: vetëm shabllone frëngjisht. Gjeneruesi refuzon prerazi për çdo gjuhë tjetër të synuar, veç nëse jepni trupin tuaj përmes filtrit owc_policy_template.

Kategoritë e cookie-ve

Lista kanonike

Gjashtë kategori, në këtë radhë shfaqjeje, necessary gjithmonë e para:

SlugEtiketa e përfshirëPërshkrimi i përfshirë
necessaryNecessaryStrictly required for the site to function (cart, login, language preferences). Cannot be disabled.
functionalFunctionalEnhance the experience (chat, embedded videos, maps). Without them some features may not work.
analyticsStatisticsHelp us understand how you use the site (anonymously). No personal data is shared for commercial purposes.
marketingMarketingEnable us to show you ads and content tailored to your interests on other sites.
preferencesPreferencesRemember your interface choices (layout, saved filters).
socialSocial & embedsAllow embedded social content (YouTube, Instagram, X) to load.

Vlerat e mësipërme janë parazgjedhjet angleze që mund të ruhen. Në një faqe shqip, vizitori sheh përkthimin — shihni mekanizmin e përkthimit më poshtë.

Disponueshmëria

Cilësimi cat_<slug>_available, një për çdo kategori. Të gjashtë janë të disponueshme si parazgjedhje. Çelësi i vjetër cat_<slug>_enabled lexohet ende si rezervë, pa migrim.

preferences dhe social vijnë të disponueshme sepse katalogu fillestar i klasifikon YouTube, Spotify, SoundCloud, Instagram, X dhe Facebook si social: pa këtë kategori në ndërfaqe, këto integrime do të mbeteshin të bllokuara përgjithmonë pa asnjë mënyrë opt-in-i.

necessary është e detyruar: nuk mund të çaktivizohet (neni 5.3 ePrivacy). Prandaj ajo nuk ka çelës disponueshmërie në administrim, veçse një etiketë dhe një përshkrim.

Mekanizmi i përkthimit

Cilësimet cat_<slug>_label dhe cat_<slug>_desc. Vlera e ruajtur kthehet fjalë për fjalë vetëm nëse nuk është bosh dhe ndryshon nga parazgjedhja angleze; përndryshe del përkthimi.

Pasojë që duhet ditur: për sa kohë nuk personalizoni asgjë, ndryshimi i gjuhës së faqes ndryshon gjuhën e kategorive. Sapo të shkruani tekstin tuaj, ai tekst ngurtësohet në gjuhën në të cilën e keni shkruar. E njëjta rregull vlen për tekstet e bannerit.

Përshkrimi i përkthyer i necessary ndërtohet nga dy vargje: i dyti emërton cookie-t e vetë shtojcës, owc_consent (deri në 13 muaj) dhe owc_geo (24 orë, i shkruar vetëm kur zbulimi rajonal është aktiv).

Përputhja me Google Consent Mode v2 — detyruese

Ky është burimi i vetëm i së vërtetës në shtojcë: banneri, bllokimi dhe bootstrap-i e lexojnë të gjithë këtë tabelë, prandaj nuk mund të divergojnë.

KategoriaSinjalet Consent Mode v2
necessarysecurity_storage, functionality_storage
functionalfunctionality_storage, personalization_storage
analyticsanalytics_storage
marketingad_storage, ad_user_data, ad_personalization
preferencespersonalization_storage
socialad_storage, ad_user_data

Nuancë e rëndësishme: nëse faqja juaj e shfaq kategorinë functional, atëherë functionality_storage hiqet nga lista e necessary. Përndryshe do të jepej para çdo pëlqimi, ndonëse i përket një kategorie opsionale.

Përputhja me TCF — vetëm përshkruese

functionalfunctional, analyticsmeasurement, marketingadvertising, preferencespersonalization, socialsocial_media.

Këto janë etiketa shfaqjeje. Përputhja detyruese nga ana e TCF-së është tabela e identifikuesve numerikë të qëllimeve IAB, e përshkruar në seksionin IAB TCF v2.2. Mos e lidhni kurrë një sjellje TCF me këto pesë etiketa.

Çfarë ndodh nëse zhduket një kategori

Nëse një rregull katalogu tregon drejt një kategorie që faqja juaj nuk e shfaq më — keni çaktivizuar social, për shembull — bllokimi e kalon burimin te marketing, ose, në mungesë, te kategoria e parë opsionale e disponueshme. Pa këtë normalizim, burimi do të mbetej i bllokuar përgjithmonë pa asnjë çelës për ta liruar.


Banneri

Kur shfaqet

Banneri renderohet mbi wp_footer me prioritet 5, ndërsa burimet e tij vendosen në radhë mbi wp_enqueue_scripts. Ai del menjëherë nëse është i vërtetë njëri prej këtyre kushteve: kontekst administrimi, feed RSS, robots.txt, ose banner_enabled i çaktivizuar. Del edhe nëse wp_head nuk është nisur kurrë — një temë që nuk thërret wp_head() do të merrte përndryshe një kod inert dhe pa stil.

HTML-ja është e njëjtë për të gjithë vizitorët. Të gjitha kutizat e panelit renderohen në OFF nga ana e serverit dhe pastaj hidratohen nga ana e klientit prej cookie-s. Është JavaScript-i ai që vendos <html data-owc="given|none"> në mënyrë sinkrone, para renderimit të parë; CSS-ja e shfaq bannerin vetëm mbi data-owc="none".

Rrjedhim që duhet ditur: një vizitor pa JavaScript nuk e sheh kurrë bannerin, prandaj nuk mbetet kurrë i mbyllur pas një modaleje që s'e mbyll dot. Në vend të tij sheh një bllok <noscript> që shpjegon se preferencat e tij nuk mund të regjistrohen dhe se asnjë cookie jothelbësore nuk ngarkohet sa kohë nuk është bërë ndonjë zgjedhje.

Pozicionet dhe tema

CilësimiVleratParazgjedhja
banner_positionbottom-bar, bottom-card, center-modal, top-barbottom-bar
banner_styleauto, light, darkauto

Vetëm center-modal merr role="dialog", aria-modal="true", një sfond të errësuar, një kurth fokusi dhe tastin Esc. Tri pozicionet e tjera janë një role="region": Esc-i nuk kapet (tema ruan trajtimin e vet) dhe fokusi nuk vidhet në renderimin e parë, çka do ta shtynte një përdorues tastiere përtej të gjitha lidhjeve të kapërcimit.

Paleta e errët zbatohet nën prefers-color-scheme: dark me mbrojtëse që të mos mbishkruajë një temë e cila deklaron shprehimisht light. Tema e faqes mund ta drejtojë paletën me variabla CSS: --owc-paper-tint, --owc-ink, --owc-smoke, --owc-fog, --owc-ui, --owc-accent, --owc-accent-strong, --owc-accent-darker.

Detaje zbatimi: z-index 99998 për bannerin dhe 99997 për sfondin, mbështetje për env(safe-area-inset-*) për prerjet e iOS-it, zhvendosje automatike nën shiritin e administrimit të WordPress-it kur pozicioni është lart.

Butonat

CilësimiParazgjedhjaEfekti
banner_accept_alltrueShfaq «Pranoji të gjitha»
banner_reject_alltrueShfaq «Refuzoji të gjitha»
banner_preferencestrueShfaq «Personalizo»
banner_close_xfalseShfaq kryqin e mbylljes
banner_show_logotrueShfaq logon e faqes

«Pranoji të gjitha» dhe «Refuzoji të gjitha» ndajnë të njëjtën klasë formatimi: i njëjti sfond, i njëjti bordurë, e njëjta trashësi, e njëjta mbushje. Kjo është përgjigjja ndaj kërkesës së CNIL / EDPB (udhëzimet 03/2022): refuzimi duhet të jetë po aq i thjeshtë e po aq i dukshëm sa pranimi.

Kryqi i mbylljes

Ai është i çaktivizuar si parazgjedhje, sepse një kryq mbylljeje barazohet me refuzim të nënkuptuar. Tri sjellje që duhen ditur:

  1. Kur banner_close_x është off, kryqi ndodhet në kod por mbart atributin hidden, dhe CSS-ja e heq krejtësisht: as i dukshëm, as i fokusueshëm, as i shpallur te lexuesit e ekranit.
  2. Kur aktivizohet, klikimi mbi kryq kryen gjithë rrugën «Refuzoji të gjitha», kurrë një mbyllje në heshtje.
  3. Ai zbulohet nga runtime-i dhe rietiketohet në një rast të vetëm: kur një refuzim nuk ka mundur të regjistrohet fare. Atëherë ai nuk refuzon më asgjë, veçse e mbyll njoftimin — dhe kjo mbyllje nuk numërohet si zgjedhje. Një vizitor të cilit serveri ia refuzon vendimin nuk lihet përballë një banneri që s'e mbyll dot.

Shtresa e parë

  • Titulli (text_title) dhe mesazhi (text_message). Mesazhi është e vetmja fushë me HTML të pasur e shtojcës; ai renderohet me një wp_kses të kufizuar te <a href target rel>.
  • Lidhja drejt politikës së privatësisë: link_privacy_policy, me rezervë te faqja e politikës e deklaruar në WordPress nëse cilësimi është bosh.
  • Lidhja drejt politikës së cookie-ve: link_cookie_policy, pa rezervë.
  • Emri i kontrolluesit të të dhënave: legal_company_name, përndryshe emri i faqes, i shfaqur si «Kontrollues i të dhënave: …» (neni 13(1)(a)).
  • Logoja: logoja e personalizuar e temës në madhësinë medium, përndryshe ikona e faqes.

Paneli i preferencave

Një rresht për çdo kategori të disponueshme, brenda një role="group" me emër.

  • Një kategori e detyruar shfaq një distinktiv tekstual «Always active», pa çelës.
  • Një kategori opsionale shfaq një <button role="switch"> me aria-checked, aria-labelledby dhe aria-describedby. Gjendja mbahet nga aria-checked, nga pozicioni i kursorit dhe nga një fjalë e dukshme On/Off — kurrë vetëm nga ngjyra.
  • Objektiv prekjeje i zgjeruar në 44 px në ekran të vogël (WCAG 2.2 AA, kriteri 2.5.8).
  • Shiriti i veprimeve të panelit është sticky poshtë, që «Ruaji zgjedhjet e mia» të mbetet i arritshëm ndërsa lista rrëshqet.

Nëse moduli TCF është aktiv, shfaqen dy blloqe shtesë: qëllimet TCF të arritshme dhe veçoritë speciale të deklaruara. Shihni IAB TCF v2.2.

Rinovimi i pëlqimit

CilësimiParazgjedhjaKufijtë
consent_renewal_months120 deri 13
consent_policy_hash_checktrue

0 nuk do të thotë «mos pyet kurrë më». Vlera 0 kthehet në 13 muaj, dhe 13 muaj është tavani i fortë (vendimi CNIL 2020-091). Prandaj kohëzgjatja efektive është gjithnjë mes 1 dhe 13 muajsh, dhe është pikërisht kjo vlerë që qeveris kohëzgjatjen e cookie-s, kontrollin e skadimit nga ana e serverit dhe kohëzgjatjen e publikuar në dokumentet e gjeneruara. Konstantja OWC_COOKIE_TTL që duket në kodin burimor është vetëm një rezervë.

consent_policy_hash_check e rikërkon pëlqimin kur ndryshojnë dokumentet tuaja: cookie-ja mbart një hash të faqeve të politikave të lidhura, dhe një ndryshim e rihap bannerin. Hash-i është varg bosh kur asnjë faqe nuk është e lidhur — kjo lejon të dallohet «e panjohur» nga «e ndryshuar» dhe të mos rikërkohet kurrë gjithë një faqe mbi një krahasim bosh.

Tekstet

Shtatë vende, të gjitha bosh si parazgjedhje dhe pra të përkthyera automatikisht: text_title, text_message, text_accept_all, text_reject_all, text_preferences, text_save, dhe floating_button_label për butonin pluskues.

Në administrim, çdo fushë e shfaq parazgjedhjen e vet të përkthyer si tekst udhëzues: duke e lënë bosh ruani parazgjedhjen që ndjek gjuhën e vizitorit.

Filtri owc_banner_texts lejon zëvendësimin e këtyre teksteve me kod. Pranohen edhe vende shtesë; vlerat joskalare ose bosh shpërfillen që një callback i pakujdesshëm të mos mund ta zbrazë bannerin.

Si regjistrohet vërtet zgjedhja

Runtime-i JavaScript është në ES5 strikt — pa funksione shigjetë, pa literale shabllonesh — që të punojë në shfletuesit e integruar brenda aplikacioneve dhe në WebView-t e vjetra. Sekuenca e tij e shkrimit ia vlen të njihet, sepse është ajo që shpjegon shumicën e mesazheve të gabimit.

  1. Riankorimi i origjinës. URL-të REST vijnë nga konfigurimi i WordPress-it. Nëse vizitorët tuaj lëvizin mbi një host tjetër (www kundrejt apex-it, alias, domen parapamjeje, proxy që rishkruan Host), kjo URL është cross-origin dhe shfletuesi refuzon ta ruajë Set-Cookie-n ndërsa WordPress-i përgjigjet me 200. Prandaj runtime-i e riankoron rrugën e dhënë nga PHP-ja mbi origjinën ku ndodhet vërtet vizitori.
  2. Nonce. Merret i freskët nga GET /owc/v1/nonce pak para shkrimit, kurrë i futur në HTML të cache-ueshme, i dërguar në header-in X-OWC-Nonce. Marrja ka tavan 4 sekonda, dhe një nonce që mungon, është bosh ose i paarritshëm nuk e pengon kurrë shkrimin e as nuk i raportohet vizitorit.
  3. page_url i shprehur brenda trupit të kërkesës, që rreshti i regjistrit të mos varet nga header-i Referer, të cilin një shtesë, një meta-referrer ose një proxy mund ta heqë.
  4. Mbrojtëse kundër bllokimit prej 15 sekondash me AbortController: kërkesa anulohet, jo thjesht shpërfillet, që një POST i vonuar të mos shkruajë një rresht të dytë.
  5. Përkufizimi i suksesit. POST-i është sukses nëse, dhe vetëm nëse: përgjigjja është ok, trupi është JSON i analizueshëm, json.ok === true, dhe cookie-ja rilexohet brenda shfletuesit. Një faqe cache-i, një sfidë në skaj ose një WAF i shërbyer me 200 nuk numërohen.
  6. Nëse serveri përgjigjet me cookie_set: false, runtime-i e shkruan vetë cookie-n me parametrat e kthyer, pastaj rilexon. Një dështim mbetet dështim: asgjë nuk publikohet, asgjë nuk zhbllokohet.
  7. Vetëm një ridërgim, dhe vetëm mbi një 403 kodi i të cilit është owc_bad_nonce, rest_cookie_invalid_nonce ose rest_nonce_invalid, dhe vetëm nëse nonce-i i marrë është vërtet i ndryshëm.
  8. Ajo që publikon runtime-i është ajo që ka ruajtur serveri: kategoritë e refuzuara nga serveri zbriten nga gjendja lokale.

Sa kohë POST-i nuk ka pasur sukses, asgjë nuk zbulohet, asgjë nuk zhbllokohet, dhe nuk lëshohet asnjë sinjal Consent Mode «granted».

Taksonomia e gabimeve

Runtime-i dallon nëntë shkaqe, secili me mesazhin e vet të dukshëm: network, refused, ratelimit, unexpected, timeout, browser, config, cookie, owc_cookie_not_persisted. Statusi HTTP dhe kodi i serverit vendosen mbi element (data-owc-status, data-owc-code) dhe regjistrohen një herë me console.warn — kurrë të renderuara si tekst i dukshëm. Prandaj një pamje ekrani mbështetjeje e emërton shkakun pa qenë nevoja për një gjurmë rrjeti.

API-ja JavaScript e bannerit

window.OWCBanner.show();              // hap në modalitetin banner
window.OWCBanner.hide();              // mbyll
window.OWCBanner.openPreferences();   // hap panelin e preferencave
window.OWCBanner.openDnsmpi();        // hap panelin me marketing, social
                                      // dhe preferences tashmë në OFF (hyrja CCPA)
window.OWCBanner.reset();             // fshin cookie-n nga ana e klientit, dërgon një
                                      // tërheqje, pastaj ringarkon faqen
window.OWCBanner.acceptCategory( 'social' );  // kthen një premtim që zgjidhet me true
                                              // vetëm nëse serveri e ka ruajtur vërtet

Një bootstrap më i lehtë shtypet në <head> me prioritet 1 dhe e ekspozon window.OWConsent: .config, .categories, .geo, .profile, .optOut, .state, .has(cat), .refresh(), .paint(), .gcmSignals(state). Konfigurimi i tij filtrohet me owc_bootstrap_config — por gjithçka që ndodhet aty është publike dhe e përbashkët me cache-in: mos vendosni kurrë aty një të dhënë të veçantë të një vizitori.

Si të hapet paneli nga faqet tuaja

Tri mënyra, të gjitha të barasvlershme:

  • fragmenti i URL-së #owc-preferences (ose #owc-dnsmpi), i marrë parasysh në ngarkim dhe mbi hashchange;
  • çdo element që mbart klasën owc-open-preferences ose atributin data-owc-open;
  • atributi data-owc-dnsmpi="1" për të detyruar sjelljen «Do Not Sell».

Një ngjarje owc:consent-changed transmetohet në çdo ndryshim, me ngarkesën e dërguar në detaj. Atë e dëgjojnë bootstrap-i, butoni pluskues, runtime-i CCPA dhe moduli TCF; mund ta dëgjoni edhe ju.

Kufijtë e bannerit

  • Gjithçka varet nga wp_head() dhe wp_footer(): një temë që nuk i thërret nuk merr asgjë.
  • Pa window.fetch dhe window.Promise nuk është i mundur asnjë shkrim dhe shfaqet gabimi browser.
  • Një pëlqim mund të regjistrohet nga ana e serverit pa u ruajtur nga ana e shfletuesit (adresë e faqes e ndryshme nga hosti ku ndodhet vizitori, ruajtje e bllokuar, jar i mbushur). Runtime-i e zbulon këtë rast, refuzon ta numërojë si sukses, shfaq një mesazh të dedikuar dhe ia përcjell faktin serverit në shkrimin e radhës.
  • Banneri nuk ka shortcode: ai shfaqet kudo ose askund.

Bllokimi automatik

Ky është moduli që e kthen një zgjedhje në efekt real. Ai i rishkruan etiketat që mbartin gjurmues para çdo pëlqimi, për të gjithë, dhe ia lë runtime-it t'i lirojë brenda shfletuesit.

Dy modalitete, një cilësim i vetëm

compliance_strict, i aktivizuar si parazgjedhje.

  • I çaktivizuar (modalitet i butë): lidhet vetëm filtri script_loader_tag. Me fjalë të tjera, rishkruhen vetëm skriptet e regjistruara me wp_enqueue_script(). Një <script> i shkruar drejt e në temë, një embed, një iframe, një piksel <img>: asgjë nuk preket.
  • I aktivizuar (modalitet strikt): përveç filtrit, një buffer daljeje kap gjithë dokumentin, dhe trajtohet edhe kodi i renderuar përmes API-së REST. Në administrim, nëse kërkesa është një admin-ajax.php, një buffer i veçantë mbulon përgjigjet që i shërbejnë edhe pjesës publike («ngarko më shumë», arkiva të filtruara) — por vetëm nëse vetë trajtuesi ka deklaruar Content-Type: text/html.

Çfarë nuk vihet kurrë në buffer

Buffer-i strikt del menjëherë për: administrimin, kërkesat AJAX, feed-et, robots.txt, trackback-et, cron-in, favicon-at, kërkesat REST, kërkesat JSON, parapamjen e mjetit të personalizimit, sitemap-et, si dhe pikat e hyrjes wp-login.php, wp-register.php, wp-signup.php, xmlrpc.php, wp-cron.php, wp-trackback.php — të testuara mbi emrin e saktë të skriptit, kurrë si nënvarg i URL-së. Ai del edhe për kërkesat e skanerit, të cilat kanë nevojë për HTML-në e papërpunuar.

Pesë kalimet

Rishkrimi bëhet me shprehje të rregullta të kalibruara, kurrë me një analizues DOM. Tre mbrojtëse e rrethojnë tërësinë: një dokument mbi 8 MB kthehet i paprekur, një dështim i motorit PCRE e kthen dokumentin të paprekur, dhe nëse rezultati del më pak se gjysma e madhësisë fillestare, kthehet origjinali. Me fjalë të tjera, modaliteti i dështimit të bllokimit është «faqe e shërbyer pa bllokim», kurrë «faqe e thyer».

Kalimi 0 — maskimi. Komentet HTML, <style> dhe <textarea> zëvendësohen me shënues të bazuar në karaktere kontrolli, që asnjë model i mëvonshëm të mos përputhet brenda tyre.

Kalimi 1 — <script>. Vendimi, sipas radhës:

  1. tashmë i trajtuar → i paprekur;
  2. skript i vetë shtojcës → i paprekur;
  3. type="text/plain" ose tip jo-JS (ld+json, importmap, x-template) → i paprekur;
  4. URL-ja kërkohet në src, data-src, data-rocket-src, data-lazy-src, data-litespeed-src, data-cfsrc — pra mbulohen atributet e shtojcave të performancës;
  5. host në listën e lejimeve → i paprekur; burim first-party që nuk i ngjan një gjurmuesi → i paprekur;
  6. përputhje me katalogun në formën host + shteg; një URL data: ose javascript: dekodohet dhe gjykohet si trup inline;
  7. një rregull i klasifikuar necessary nuk bllokohet kurrë (Stripe.js, reCAPTCHA, Turnstile, cdnjs…): bllokimi i tij nuk fiton asnjë përputhshmëri dhe e thyen fragmentin që e thërret;
  8. asnjë përputhje → blocker_unknown_script_policy, parazgjedhja allow;
  9. përndryshe rishkrim në type="text/plain" me data-owc-cat, data-owc-vendor, data-owc-src dhe, nëse tipi origjinal ishte i veçantë (module, për shembull), data-owc-type që të mos degradohet skripti i rikthyer.

Trupat inline krahasohen fillimisht me rregullat e katalogut të tipit inline_signature, pastaj me katërmbëdhjetë firma të ankoruara të koduara në kod: fbq(, _fbq.push, gtag(, dataLayer.push(, ga('…, _gaq.push, _paq.push, hjid, clarity(, ttq.load|track|page, snaptr(, twq(, lintrk(, pintrk(. Përjashtim i shprehur: një gtag('consent', …) i vetëm, domethënë një deklarim i parazgjedhur i Consent Mode pa shënues tjetër, mbetet i ekzekutueshëm.

Kalimi 2 — <iframe>. Të njëjtat atribute URL-je, plus data-original dhe data-srcset. First-party ose listë lejimesh → i paprekur. necessary → i paprekur, përndryshe një formular me captcha do të bëhej i padërgueshëm. Pa përputhje → blocker_unknown_iframe_policy, parazgjedhja block. Iframe-ja e bllokuar bëhet src="about:blank" dhe mbështillet në një zëvendësues vizual që përmban një buton «Prano » i cili e zhbllokon kategorinë përkatëse.

Kalimi 3 — <img>, vetëm pikselat e gjurmimit. Rregull e rëndësishme: një rresht katalogu i vetëm nuk mjafton kurrë për të neutralizuar një imazh. Nëse imazhi përputhet me katalogun, por kategoria e tij nuk është as analytics as marketing — një CDN imazhesh, një shërbim gravatarësh, një strehues fontesh — ai lihet i paprekur, përndryshe do të fshiheshin mediat e faqes në vend të një gjurmuesi. Vetëm heuristika e etiketës mund të bllokojë: njëmbëdhjetë pika mbledhjeje të njohura (facebook.com/tr, px.ads.linkedin.com, ct.pinterest.com, bat.bing.com, analytics.twitter.com, t.co/i/adsct, tr.snapchat.com, analytics.tiktok.com, google-analytics.com/collect, googleads.g.doubleclick.net, pixel.quantserve.com) ose një imazh i palës së tretë me përmasa 1×1 piksel. Atëherë src-ja zëvendësohet me një GIF transparent, dhe fshihen të gjitha atributet që mbartin URL, që një ngarkues me përtaci të mos e rikthejë origjinalin.

Kalimi 4 — <link>. I kushtëzuar nga blocker_block_resource_hints, parazgjedhja true. Trajton vetëm hostet që ndodhen tashmë në katalog, kurrë një të panjohur.

  • Sugjerimet e burimeve (preconnect, dns-prefetch, prefetch, prerender, preload, modulepreload) drejt një pale të tretë të katalogueshme fshihen, jo shtyhen: një sugjerim hap një lidhje TCP+TLS dhe zbulon IP-në e gjurmën TLS të vizitorit, dhe nuk ka asgjë për t'u rikthyer më pas.
  • Një fletë stilesh e klasifikuar analytics ose marketing neutralizohet.
  • Google Fonts dhe hostet e tjerë të tipografisë të klasifikuar functional nuk preken kurrë: neutralizimi i tyre jep tekst me font rezervë në gjithë faqen, pa asnjë fitim përputhshmërie.

Kalimi 5 — <object>, <embed>, <source>, <video>, <audio>. Kurrë bllokim si parazgjedhje: trajtohet vetëm një palë e tretë që ndodhet tashmë në katalog. Atributet autoplay dhe preload hiqen.

Çfarë numërohet si «first party»

URL-ja e faqes, URL-ja e WordPress-it, URL-ja e përmbajtjes, URL-ja e includes-ave, ekuivalentët e tyre të rrjetit në multisite, dhe baza e ngarkimeve. www.-ja hiqet gjatë krahasimit. Çdo shteg që nis me /wp-content/ ose /wp-includes/ është first-party pavarësisht hostit, për të mbuluar rishkrimet e CDN-ve. Skemat jo-HTTP (data:, blob:, javascript:) nuk janë kurrë first-party.

Kundërpërjashtim: një URL që përmban gtag, gtm.js, analytics, pixel, fbevents, hotjar, matomo, piwik ose clarity trajtohet edhe mbi hostin e vetë faqes. Kjo është ajo që kap një GTM ose një Matomo të vetëstrehuar, si dhe proxy-t first-party.

Runtime-i i zhbllokimit

I shtypur në <head> me prioritet 2. Konfigurimi i tij JSON përmban vetëm emrin e cookie-s dhe listën e hosteve të mbikëqyrur — asgjë që varet nga vizitori.

  • Leximi i gjendjes: cookie-ja owc_consent dekodohet derisa të stabilizohet, me maksimum tri kalime, sepse cookie-t e shkruara para 1.4.3-shit kodoheshin dy herë.
  • Mbrojtja e skripteve të injektuara në mënyrë dinamike: setter-i HTMLScriptElement.prototype.src dhe setAttribute mbështillen. Një ngarkues first-party që i cakton s.src = 'https://www.googletagmanager.com/gtm.js?id=…' kapet dhe elementi vuloset para ekzekutimit. Lista e mbikëqyrur ka njëzet hoste: googletagmanager.com, google-analytics.com, googleadservices.com, googlesyndication.com, doubleclick.net, connect.facebook.net, static.hotjar.com, script.hotjar.com, clarity.ms, cdn.matomo.cloud, analytics.tiktok.com, snap.licdn.com, sc-static.net, static.ads-twitter.com, bat.bing.com, s.pinimg.com, cdn.segment.com, js.hs-scripts.com, cdn.amplitude.com, cdn.mxpnl.com. Gjithçka që nuk ndodhet aty kalon pa u prekur. Hostet e listës suaj të lejimeve hiqen nga kjo listë para shtypjes.
  • Riinjektim sipas radhës së dokumentit. Një skript i jashtëm i rikthyer e bllokon radhën deri te onload ose onerror-i i tij, me një vonesë maksimale prej 5 sekondash që një ofrues i paarritshëm të mos bllokojë pjesën tjetër. Atributi async zbatohet vetëm nëse ishte i pranishëm që në origjinë — pa këtë, një skript i krijuar me createElement do të detyrohej asinkron dhe fragmenti i konfigurimit do të ekzekutohej para bibliotekës së vet. Për një skript inline të rikthyer, document.write ridrejtohet përkohësisht që të mos fshihet dokumenti.
  • Tërheqja e pëlqimit: nëse një kategori e zbatuar tashmë kalon shprehimisht në false, runtime-i e ringarkon faqen. Një skript i ekzekutuar nuk mund të shkarkohet (neni 7.3 GDPR). Një kategori që thjesht mungon në ngarkesë nuk është tërheqje.
  • Një MutationObserver e riskanon kodin e injektuar pas ngarkimit (AJAX, seksione me përtaci).
  • Një klikim mbi butonin e një embed-i të bllokuar thërret OWCBanner.acceptCategory(); nëse API-ja e bannerit nuk ekziston, embed-i zhbllokohet lokalisht, pa ruajtur asgjë.

Katalogu i firmave

Tabela {prefix}owc_scripts. Skedari i përfshirë, data/tracker-catalog.json, përmban 175 rreshta që mbulojnë 71 ofrues të veçantë:

NdarjaDetaji
Sipas objektivit110 modele URL-je, 65 emra cookie-sh
Sipas tipit172 fragmente teksti, 3 shprehje të rregullta
Sipas kategorisënecessary 55, marketing 37, functional 37, analytics 36, social 10

Kolonat: pattern, pattern_type (host, regex, inline_signature), match_target (url ose cookie), name, vendor, category, privacy_policy_url, gcm_signal, tcf_vendor_id, retention_days.

Dy sjellje që duhen ditur:

  • Rreshtat me match_target = 'cookie' nuk përdoren kurrë nga bllokimi. Ato shërbejnë vetëm për tabelën e cookie-ve të dokumenteve të gjeneruara. Krahasimi i tyre si nënvarg URL-je ishte pikërisht ajo që e thyente JavaScript-in e faqeve.
  • Një model i tipit host që synon një URL, me më pak se gjashtë karaktere dhe pa pikë, refuzohet: «fr» ose «IDE» do të përputheshin me «frame.js» dhe «provider.js».

Katalogu ruhet në cache-in e objekteve (1 orë) dhe në një transient (12 orë). Një rezultat bosh nuk ruhet kurrë në cache. Çdo shkrim nis veprimin owc_catalog_updated, i cili i zbraz këto cache.

Skeda Tracker catalogue lejon shtimin, modifikimin, fshirjen dhe kërkimin e rregullave, me një filtër «vetëm rregullat që nuk mund të aktivizohen»: model bosh ose i padukshëm, shprehje e rregullt që nuk kompilohet ose që bën backtracking katastrofik, model shumë i shkurtër dhe pa pikë për një URL, kategori që nuk ekziston më. Ky diagnostikim bëhet në PHP, sepse vetëm motori PCRE mund të thotë nëse një shprehje kompilohet.

Cilësimet e bllokimit

CilësimiParazgjedhjaVlerat
compliance_stricttrueboolean
blocker_unknown_script_policyallowallow, block
blocker_unknown_iframe_policyblockallow, block
blocker_block_resource_hintstrueboolean
blocker_allowlist''një host për rresht

Pikat e zgjerimit

// Hoste që nuk bllokohen kurrë, përveç blocker_allowlist.
add_filter( 'owc_blocker_allowlist', function ( array $hosts ) {
    $hosts[] = 'cdn.partneri-im.example';
    return $hosts;
} );

// Rreshtat e katalogut para validimit.
add_filter( 'owc_scripts_catalog', function ( array $rows ) {
    $rows[] = array(
        'pattern'      => 'tracker.example.com',
        'pattern_type' => 'host',
        'match_target' => 'url',
        'name'         => 'Shembull',
        'vendor'       => 'Shembull SH.A.',
        'category'     => 'analytics',
    );
    return $rows;
} );

Metoda publike OWC_Blocker::block_html_fragment( $html ) e zbaton bllokimin mbi një fragment që nuk ka kaluar nga buffer-i i daljes.

Kufijtë e bllokimit

  1. Pa compliance_strict, trajtohen vetëm skriptet e vendosura në radhë nga WordPress-i.
  2. Një skript i panjohur i palës së tretë lejohet si parazgjedhje. Bllokimi real mbështetet te katalogu dhe te firmat inline — pasurojini.
  3. Mbrojtja e skripteve të injektuara nga JavaScript-i mbulon vetëm njëzet hoste; një gjurmues jashtë listës, i injektuar nga kod first-party, kalon.
  4. Fletët e stileve të klasifikuara functional (fonte web) lihen të kalojnë me qëllim.
  5. Një gjurmues i katalogueshëm si <img> por i klasifikuar ndryshe nga analytics ose marketing nuk neutralizohet.
  6. Mediat (object, embed, source, video, audio) nuk bllokohen kurrë si parazgjedhje: trajtohet vetëm një palë e tretë që ndodhet tashmë në katalog.
  7. Një dokument mbi 8 MB, një dështim i PCRE-së ose një humbje mbi 50 % e përmbajtjes japin një faqe të shërbyer pa asnjë bllokim, në heshtje.
  8. Tërheqja e pëlqimit shkakton një ringarkim të plotë të faqes.

Skaneri i gjurmuesve

Skaneri inventarizon çfarë ngarkojnë vërtet faqet tuaja. Ai është i çaktivizuar si parazgjedhje: aktivizojeni në skedën Scanner.

Tri burime zbulimi

Çdo gjetje e ruan prejardhjen e vet dhe informacionin «a mund të veprojë bllokimi mbi të».

1. HTML-ja e shërbyer. Skaneri merr një mostër të URL-ve të vetë faqes suaj dhe lexon kodin: <script src> dhe <script data-owc-src> — pra shihen edhe skriptet e bllokuara tashmë —, firmat inline, <iframe>, fletët e jashtme të stileve dhe imazhet URL-ja e të cilave përmban 1x1, pixel, track, beacon ose impression. Nuk ekzekutohet asnjë JavaScript: ajo që një menaxher etiketash injekton në runtime është e padukshme për këtë kalim.

2. Header-at Set-Cookie. Këto janë të vetmet cookie që shfletimi nga serveri mund t'i provojë, përfshirë cookie-t HttpOnly që një sondë shfletuesi nuk do t'i shohë kurrë. Ato shënohen si të pabllokueshme: asgjë brenda bllokimit nga ana e klientit nuk mund ta ndalë një cookie të lëshuar nga serveri. Cookie-t e vetë shtojcës shpërfillen.

3. Sonda e shfletuesit. Shtypet në fundfaqe vetëm për një përdorues të kyçur që ka manage_options, dhe vetëm nëse skaneri është aktiv. Ajo fotografon document.cookie në ngarkim, vëzhgon mutacionet e DOM-it — kjo është ajo që kap atë që injekton një menaxher etiketash —, e pyet document.cookie çdo 5 sekonda për cookie-t e shkruara nga ana e klientit, dhe i përcjell vëzhgimet e veta çdo 2 sekonda si dhe mbi beforeunload. Përgjigjja që mbart sondën shënohet si e pacache-ueshme.

Kufi i pranuar në kod: një administrator zakonisht i ka pranuar tashmë të gjitha. Prandaj sonda përshkruan gjendjen pas pëlqimit, jo gjendjen para pëlqimit.

Shfletimi

Radha e URL-ve ndërtohet për të mbuluar shabllone, jo faqe: fillimisht URL-të bazë (ballina, faqja statike e hyrjes, faqja e artikujve, dhe katër faqet e politikave të lidhura), pastaj një ndërthurje rrethore sipas familjes — deri në 30 faqe, 15 artikuj, 5 për çdo lloj përmbajtjeje publike të personalizuar, 3 kategori dhe 3 etiketa. Pa këtë ndërthurje, tridhjetë faqe thuajse identike e hanin gjithë buxhetin dhe shabllonet e WooCommerce-it nuk arriheshin kurrë.

Filtri owc_scanner_urls lejon shtimin e URL-ve, por rezultati rikufizohet sërish te hosti i faqes: skaneri nuk del kurrë jashtë domenit tuaj.

Çdo kërkesë bëhet me ridrejtime të ndjekura me dorë (maksimum dy kërcime, çdo kërcim i ritestuar kundrejt hostit të faqes), me përgjigje me tavan 2 MB, me një header Cache-Control: no-cache, no-store dhe një parametër URL-je unik që të mos lexohet një faqe cache-i, si dhe me user-agent-in OW-Consent-Scanner/<version>. Një përgjigje jo-HTML numërohet si e shpërfillur, jo si dështim.

Një sekret anashkalimi dërgohet në header-in X-OWC-Scanner që bllokimi të tërhiqet dhe të lejojë shikimin e HTML-së së papërpunuar. Ai krahasohet në kohë konstante, dhe header-i testohet i pari që një vizitor i zakonshëm të mos e nisë as leximin e opsionit.

Buxheti, kyçi, rifillimi

KufizimiVlera
URL për ekzekutimscanner_max_urls, parazgjedhja 25, kufijtë 1 deri 500
Afati për kërkesëscanner_timeout, parazgjedhja 8 s, kufijtë 1 deri 60
Buxheti kohor për grupmax_execution_time − 10 s, përndryshe 45 s, i kufizuar mes 5 dhe 60 s
Kyçi i ekzekutimit15 minuta
Jetëgjatësia e radhës6 orë

Nëse buxheti shterohet, planifikohet një rifillim një minutë më vonë dhe shfletimi vazhdon aty ku ndaloi. Një nisje e dytë ndërsa një shfletim është në punë përgjigjet «një skanim është tashmë në vazhdim». Ndërprerje e shkurtër: nëse tri kërkesa dështojnë pa u lexuar asnjë faqe, shfletimi ndalon në vend që ta harxhojë afatin e vet mbi njëzet e dy URL të tjera — ky është rasti tipik i një faqeje të cilës i është bllokuar loopback-u HTTP.

Firmat inline të njohura

Njëzet e tri gjilpëra, të grupuara në njëzet e një etiketa: gtag('config', gtag('event', gtag('js', gtm.start, ga('create', ga('send', fbq('init', fbq('track', _paq.push, (h.hj=h.hj, clarity('init', clarity.ms/tag, mixpanel.init, amplitude.init, amplitude.getInstance, _linkedin_partner_id, snaptr('init', ttq.load, pintrk("load", pintrk('load', rdt('init', criteo_q.push, _etmc.push.

Çelësi i heqjes së dublikatave është firma, kurrë një hash i trupit: një fragment i vërtetë gtag ose Pixel përmban vlera të veçanta për faqen, çka do të jepte një rresht për çdo faqe.

Cikli i reagimit: gjetje → katalog → bllokim

Kjo është pika që e bën skanerin të dobishëm. Klasifikimi i një gjurmuesi shkruan një rregull në katalogun e bllokimit. Një klikim mbi kategorinë e një gjetjeje bën tri gjëra: shkruan kategorinë mbi rresht, e mban mend vendimin tuaj manual, dhe krijon rregullin përkatës. Në fund të çdo shfletimi të plotë, i njëjti veprim kryhet në masë për gjithçka që katalogu nuk di ta klasifikojë tashmë.

Rregullat e konvertimit:

  • një gjetje e tipit cookie bëhet rregull match_target = cookie mbi emrin e cookie-s;
  • një gjetje e tipit inline_script shkruan rregull vetëm nëse gjendet gjilpëra origjinale. Pa të nuk shkruhet asnjë rregull: një rregull i ndërtuar nisur nga etiketa «Google gtag (config)» do të ishte e vdekur përgjithmonë dhe do të përputhej me emrin e gjetjes, çka do ta bënte të dukej «e mbuluar» përgjithmonë;
  • përndryshe, një rregull host mbi domenin, i refuzuar nëse domeni është bosh.

Vendimet tuaja manuale ruhen veçmas (maksimum 500) dhe rizbatohen në çdo vëzhgim të ri, sepse flamuri «i konfirmuar» do të thotë edhe «një rregull katalogu u përputh» dhe prandaj nuk mund ta mbajë vetëm informacionin «administratori vendosi». Riklasifikimi si «i pakategorizuar» e fshin zërin: është kthim pas i vërtetë.

Katalogu krahasohet së pari me modelin më të gjatë, që një rregull e gjerë (google-analytics.com) të mos e mbishkruajë rregullin më të saktë që keni shkruar ju (www.google-analytics.com).

Planifikimi, alarmet, ruajtja

scanner_frequency pranon hourly, twicedaily, daily dhe weekly — por administrimi propozon vetëm përsëritjet që instalimi juaj i njeh vërtet. Parazgjedhja: weekly. Çaktivizimi i skanerit i heq nga plani të dyja ngjarjet.

Dy e-maile të veçanta, kurrë të dyja njëherësh:

  1. Gjurmues të pakategorizuar — dërgohet vetëm për identifikues vërtet të rinj, me një kujtesë me tavan 500 zëra.
  2. «Shfletimi nuk mundi ta lexojë këtë faqe» — i kufizuar në një mesazh në javë për çdo firmë gabimi. Ky është modaliteti më i rëndë i dështimit, sepse një shfletim që nuk lexon asgjë nuk prodhon asnjë gjetje, pra as ndonjë alarm të llojit të parë.

Marrësi: scanner_alert_email, përndryshe adresa e administrimit të faqes.

Ruajtja: 90 ditë. Gjetjet e parishikuara prej 90 ditësh fshihen, sapo të jetë lexuar të paktën një faqe — jo vetëm kur mbaron një shfletim.

Paneli i mbulimit

Kjo është pjesa më e rëndësishme e skedës Scanner, dhe ajo ushqen edhe kutinë e paralajmërimit të dokumenteve të gjeneruara. Ajo u përgjigjet gjithnjë këtyre pyetjeve:

  • a është nisur ndonjëherë një shfletim?
  • a mbaroi i fundit, apo u ndërpre nga buxheti i vet kohor?
  • sa faqe u morën vërtet (jo sa u hoqën nga radha)?
  • sa nuk u morën dot, dhe cili ishte gabimi i parë?
  • a ka raportuar ndonjëherë ndonjë shfletues diçka, apo nuk është vëzhguar kurrë asnjë JavaScript?
  • cila është dritarja përtej së cilës zhduket një gjurmues i parishikuar?

Një shfletim që nuk arriti asnjë faqe paraqitet si dështim, jo si rezultat i pastër. Është ky panel që duhet lexuar përpara se të publikoni një politikë cookie-sh të ndërtuar mbi këto gjetje.

Skeda Scanner

Tri karta (gjurmues të zbuluar, të pakategorizuar, shfletimi i fundit dhe ekzekutimi i radhës), paneli i mbulimit, një buton «nis një skanim tani», formulari i planifikimit, e pastaj lista e gjetjeve: filtra sipas kategorisë, kërkim me tekst, filtër sipas llojit të elementit (script, inline_script, iframe, stylesheet, pixel, cookie, link, preconnect), filtër sipas gjendjes, eksport CSV, faqosje nga 25. Klasifikim një nga një ose në masë — përzgjedhësi i masës ka një element të parë bosh të çaktivizuar, që një dërgim i pakujdesshëm të mos bëhet një çklasifikim i përgjithshëm.

Cilësimet e skanerit

CilësimiParazgjedhjaKufijtë
scanner_enabledfalseboolean
scanner_frequencyweeklyhourly, twicedaily, daily, weekly
scanner_max_urls251 deri 500
scanner_timeout81 deri 60
scanner_probe_modeadminsadmins, off
scanner_alert_email''adresë e-maili

Për dijeni: scanner_probe_mode nuk përdoret në këtë version. Kodi e sinjalizon shprehimisht — kushti i shtypjes së sondës nuk e lexon më këtë cilësim dhe mbështetet vetëm te scanner_enabled. Ruajtja e off e ruan vlerën pa e çaktivizuar sondën. Për ta ndalur vërtet sondën, çaktivizoni skanerin.

Kufijtë e skanerit

  1. Shfletimi nga serveri nuk ekzekuton asnjë JavaScript. Pa sondën, ajo që injekton një menaxher etiketash mungon në inventar.
  2. Sonda është e rezervuar për administratorët e kyçur dhe nuk ekziston asnjë modalitet që ta ekzekutojë për një vizitor të zakonshëm: kjo do të kërkonte informimin e vet paraprak.
  3. Një cookie e vendosur me header-in Set-Cookie zbulohet, por është e pabllokueshme.
  4. Shfletimi nuk del kurrë jashtë domenit dhe ka tavan 25 URL si parazgjedhje: një faqe e madhe nuk mbulohet kurrë e plotë.
  5. Në një host ku loopback-u HTTP është i bllokuar (autentikim HTTP i preprodhimit, mur zjarri), shfletimi nuk lexon asgjë.
  6. Një gjetje e parishikuar prej 90 ditësh zhduket, dhe pra zhduket edhe nga politika e cookie-ve.
  7. Skaneri varet nga WP-Cron: në një faqe me DISABLE_WP_CRON dhe pa cron sistemi, shfletimi i planifikuar nuk niset.

Gjeneruesi i dokumenteve ligjore

Katër dokumentet

LlojiPërmbajtjaGjuhët e disponueshme
cookie_policyPolitika e cookie-vefrëngjisht, anglisht, portugalisht
privacy_policyPolitika e privatësisëfrëngjisht, anglisht, portugalisht
legal_noticeNjoftimi ligjorvetëm frëngjisht
termsKushtet e përgjithshmevetëm frëngjisht

Çdo dokument i gjeneruar është një faqe WordPress, e versionuar me metatë dhëna: _owc_policy_type, _owc_policy_version (rritet me çdo gjenerim), _owc_policy_hash (hash SHA-256 i HTML-së), _owc_policy_generated_at, _owc_policy_profile, _owc_policy_lang, _owc_policy_manual_edit.

Pas gjenerimit, lidhja riinjektohet në cilësimet përkatëse (link_cookie_policy, link_privacy_policy, link_legal_notice, link_terms), dhe publikimi i një politike privatësie e përditëson faqen e politikës të deklaruar në WordPress.

Dy kyçe para publikimit

Kyçi 1 — fushat e detyrueshme. Gjenerimi refuzohet bashkë me listën e çelësave bosh, në vend që të publikohen klauzola me vrima.

DokumentiFushat e kërkuara
Të gjithalegal_company_name, legal_company_email
Përveç politikës së cookie-ve+ legal_company_address, legal_country
Njoftimi ligjor+ legal_company_phone, legal_publication_director, legal_host_name, legal_host_address, legal_host_phone
Njoftimi ligjor, shteti FR / BE / LU+ legal_company_legal_form, legal_company_reg_number

Kyçi 2 — gjuha. Gjeneruesi refuzon të publikojë një dokument të shkruar në një gjuhë që juridiksioni nuk e përdor. Në parapamje, dokumenti del me një shirit të kuq paralajmërimi; në publikim, është refuzim i prerë. Në skedën Policies, butoni i gjenerimit fshihet kur nuk ekziston asnjë shabllon për llojin dhe profilin aktiv, në vend që të shfaqet e të dështojë sistematikisht.

Zgjidhja e gjuhës

ProfiliGjuha e dokumentit
quebecfrëngjisht
lgpdportugalisht
gdpr me legal_country ∈ {FR, BE, LU}frëngjisht
Gjithë pjesa tjetëranglisht

Paralajmërimi i detyrueshëm

Për sa kohë policy_disclaimer është aktiv — dhe ai është aktiv si parazgjedhje — çdo dokument mbyllet me një bllok që thotë se ky është një model i gjeneruar automatikisht, se duhet rishikuar nga një profesionist i kualifikuar para publikimit, dhe që mbart datën e gjenerimit e versionin e shtojcës. Çaktivizojeni vetëm me vetëdije të plotë.

Tabela e gjurmuesve — rregullat e ndershmërisë

Tabela e publikuar në politikën e cookie-ve vjen nga tabela e skanerit tuaj, jo nga një bazë e palës së tretë. Pesë rregulla e qeverisin atë që shfaq.

  1. Dritarja e freskisë: publikohen vetëm gjetjet e rishikuara brenda 90 ditëve të fundit. Nëse kolona e vëzhgimit të fundit nuk ekziston ende sepse një migrim nuk ka kaluar, dritarja shpërfillet në vend që të publikohet «asnjë gjurmues» për një faqe që ka të tillë — nën-zbulimi është drejtimi i vetëm ku një dokument ligjor nuk duhet të dështojë kurrë.
  2. Kuti paralajmërimi në krye të tabelës, e nxjerrë nga paneli i mbulimit të skanerit: shfletim asnjëherë i nisur, asnjë faqe e lexuar, shfletim i ndërprerë, N URL të dështuara, asnjë vëzhgim me JavaScript aktiv, dritare prej N ditësh. Një shfletim i paplotë deklarohet, nuk publikohet si inventar i përfunduar.
  3. Gjurmuesit e paklasifikuar nuk fshihen: ata kanë seksionin e vet. Janë ata që askush nuk i ka shqyrtuar.
  4. Një cookie e vëzhguar në një header Set-Cookie shënohet me shenjë dalluese, bashkë me një shënim që shpjegon se ajo vendoset nga serveri dhe se asnjë bllokim nga ana e klientit nuk mund ta ndalë. Prandaj ajo nuk duhet paraqitur si e kushtëzuar nga pëlqimi, dhe klauzola që pohon se gjurmuesit e paklasifikuar vendosen vetëm pas pëlqimit mbart përjashtimin përkatës.
  5. Emri i kontrolluesit dhe lidhja drejt politikës së tij vijnë nga katalogu, vetëm për rregullat që synojnë një URL. Modelet me emër cookie-je përjashtohen: në një dokument ligjor nuk pohohet pa provë se kush i përpunon të dhënat.

Cookie-t e faqes dhe kohëzgjatjet e publikuara

Seksioni «cookie-t e vendosura nga kjo faqe» rendit cookie-t e vetë shtojcës: owc_consent (kohëzgjatja nxirret nga cilësimi i rinovimit), euconsent-v2 nëse TCF-ja është aktive, owc_geo nëse zbulimi rajonal është aktiv, owc_gpc (kohëzgjatje sesioni), owc_gpc_notice (5 minuta), plus cookie-t e kyçjes dhe të cilësimeve të WordPress-it.

Tabela e afateve të ruajtjes i merr shifrat nga cilësimet realeledger_retention_days, retention_form_data_days, retention_dsar_days dhe kohëzgjatja e rinovimit të pëlqimit. Nuk publikohet asnjë vlerë dekorative. Kohëzgjatja e cookie-s së pëlqimit nxirret nga i njëjti llogaritje si vetë cookie-ja, çka garanton se një cilësim prej 0 muajsh publikon vërtet «13 muaj» dhe jo «kurrë».

Zbulimi i llojit të veprimtarisë (kushtet e përgjithshme)

Kushtet e përgjithshme kanë 21 seksione, me kalim shitës/ofrues shërbimi, produkte/shërbime, ofertë/porosi, dhe klauzola specifike sipas llojit të veprimtarisë.

legal_business_type (auto, vitrine, rental, ecommerce, services, saas, content) është burimi i së vërtetës. Kur ka vlerën auto, një heuristikë e shqyrton faqen — prania e WooCommerce-it, regjistrimi i hapur, shtojcat e abonimeve, faqja e çmimeve, faqet e shërbimeve, e pastaj dendësia e fjalëve kyçe mbi pesëdhjetë përmbajtjet e fundit të publikuara — por verdikti i saj nuk shtypet kurrë në një dokument të publikuar: ai shërben vetëm për të zgjedhur klauzolat opsionale.

Citimet e neneve franceze futen vetëm nëse legal_country është FR. Belgjika ka citimet e veta (CDE neni VI.45 §1, neni VI.47, Shërbimi i ndërmjetësimit për konsumatorin); Luksemburgu dhe Kebeku marrin një formulim neutral. Të citoje një tekst të paverifikuar do të ishte defekti, jo zgjidhja.

Sjellje të tjera

  • Data e dokumentit formatohet sipas lokales së dokumentit. Nëse paketa përkatëse e përkthimit nuk është e instaluar, formati kalon në dd/mm/vvvv: një dokument frëngjisht nuk mund të hapet me «4 September 2026».
  • Redaktim manual i zbuluar: nëse përmbajtja e ruajtur nuk i përgjigjet më hash-it të vet, regjistrohet një revizion para mbishkrimit dhe ekrani shfaq shenjën «modifikimet manuale u zëvendësuan», me një lidhje drejt revizioneve.
  • Gjeneruesi nuk zbret kurrë në gradë: një faqe e publikuar mbetet e publikuar edhe nëse kutiza «publiko» çshënohet, dhe një titull apo permalink që keni riemërtuar i mbijeton një rigjenerimi.
  • Injektim në menynë e fundfaqes: auto_footer_menu_inject, i çaktivizuar si parazgjedhje. Shtojca nuk e ndryshon faqen tuaj publike pa kërkesë të shprehur. Vendet e njohura kur e aktivizoni: footer, footer-menu, footer_menu, footer-1, footer_1, secondary, legal.

Pikat e zgjerimit

// Trupi i papërpunuar i shabllonit, me {{variablat}} ende në vend.
add_filter( 'owc_policy_template', function ( $html, $type, $profile ) {
    return $html;
}, 10, 3 );

// Variablat e injektuara në shabllon.
add_filter( 'owc_policy_vars', function ( array $vars, $type, $profile ) {
    return $vars;
}, 10, 3 );

// HTML-ja përfundimtare, me variablat e zëvendësuara.
add_filter( 'owc_policy_html', function ( $html, array $vars ) {
    return $html;
}, 10, 2 );

Dhënia e trupit tuaj përmes owc_policy_template e çaktivizon kyçin e gjuhës: një faqe që jep tekstin e vet e merr përsipër gjuhën e tij. Kjo është rruga zyrtare për të publikuar një njoftim ligjor jofrëngjisht.

Katër blloqe të paragjeneruara janë të disponueshme si variabla të rezervuara: {{__trackers_table__}}, {{__categories_list__}}, {{__retention_table__}}, {{__jurisdictional_rights__}}. Të gjitha variablat janë tashmë të shpëtuara në kontekstin e përdorimit të tyre. Tri metoda publike janë të ripërdorshme nga një shabllon i palës së tretë: OWC_Policies::build_cookie_table(), build_data_retention_table() dhe render_first_party_cookies().

Rrugët REST

MetodaShteguParametratQasja
POST/owc/v1/policies/generatetype (i detyrueshëm), publish (boolean, parazgjedhja false)manage_options
GET/owc/v1/policies/previewtype (i detyrueshëm)manage_options

HTML-ja e parapamjes kalon nga wp_kses_post() para se të kthehet.

Kufijtë e gjeneruesit

  1. Këto janë modele, jo këshillë juridike. Jepini për rishikim.
  2. Njoftimi ligjor dhe kushtet e përgjithshme ekzistojnë vetëm në frëngjisht. Çdo juridiksion tjetër përplaset me kyçin e gjuhës, veç nëse jepni trupin tuaj.
  3. Vetëm tri gjuhë: frëngjisht, anglisht, portugalisht.
  4. Katër shtete të ZEE-së kanë autoritet të emërtuar; gjetkë, një formulim i përgjithshëm.
  5. Tabela e gjurmuesve vlen aq sa vlen shfletimi juaj — dhe dokumenti e thotë këtë.
  6. Klasa e gjeneruesit peshon rreth 440 KB shabllonesh juridike: ajo ngarkohet me përtaci, vetëm kur kërkohet vërtet njëra nga tri pikat e hyrjes.

Regjistri i pëlqimeve

Regjistri është përgjigjja ndaj nenit 7.1 të GDPR-së: mundësia për të demonstruar se personi ka dhënë pëlqimin. Ai është i aktivizuar si parazgjedhje.

Tabela

{prefix}owc_ledger, të gjitha datat në UTC:

KolonaTipiPërmbajtja
idbigintÇelësi primar
created_atdatetimeVula kohore UTC
visitor_tokenchar(32)Token pseudonim i shfletuesit, 32 karaktere heksadecimale
eventvarchar(20)accept_all, reject_all, save_preferences, withdraw, auto, gpc_opt_out
categoriesvarchar(255)Lista e kategorive të dhëna
profilevarchar(20)Profili i përputhshmërisë në fuqi në çastin e veprimit
sourcevarchar(60)banner, preferences, footer_link, api, auto
ip_pseudonymousvarchar(45)IP e cunguar
ua_hashchar(64)Hash i kripëzuar i user-agent-it
page_urlvarchar(500)Faqja ku ndodhi veprimi
prev_hashvarchar(128)Hash-i i rreshtit të mëparshëm
row_hashvarchar(128)Hash-i i këtij rreshti
policies_hashchar(64)Hash-i i dokumenteve në fuqi
banner_revisionvarchar(40)Hash-i i bannerit që u shfaq vërtet
plugin_versionvarchar(20)Versioni i shtojcës në çastin e shkrimit

Tri kolonat e fundit lejojnë të rindërtohet çfarë pa vizitori, jo vetëm çfarë shënoi.

Zinxhiri

Çdo rresht nënshkruhet me HMAC mbi një serializim kanonik me prefiks gjatësie të përmbajtjes së vet dhe të hash-it të rreshtit të mëparshëm. Gjeneza është një varg prej 64 zerosh. Shkrimi bëhet brenda një transaksioni, me një kyç rreshti mbi zërin e fundit: është ky kyç ai që i serializon vërtet shkrimet e njëkohshme dhe e pengon zinxhirin të degëzohet. Një kyç me emër i MySQL-së merret si mbrojtje e dytë, sa të mundet: nëse refuzohet, shtimi vazhdon dhe niset një veprim që ju të mund ta gjurmoni.

Vlerat cungohen para nënshkrimit, që vlera e nënshkruar të jetë saktësisht vlera e ruajtur.

Ndershmëria mbi pafalsifikueshmërinë

Shtojca e përcakton vetë prejardhjen e çelësit të vet të nënshkrimit:

PrejardhjaKushtiVerdikti
constantOWC_LEDGER_KEY është e përcaktuarE pafalsifikueshme
wp-configAUTH_KEY dhe AUTH_SALT janë të përcaktuara, jo bosh, të ndryshme nga njëra-tjetra dhe pa frazën e parazgjedhurE pafalsifikueshme
databasePërndrysheJo e pafalsifikueshme

Në rastin e tretë, WordPress-i i ruan salt-et në bazë: kushdo që ka qasje në bazë mund ta rinënshkruajë zinxhirin. Shtojca e raporton këtë në rezultatin e verifikimit dhe shfaq një njoftim administrimi që e thotë me fjalë të plota. Ruhet një hash i pakthyeshëm i çelësit, çka lejon të dallohet një rotacion salt-esh nga një rishkrim.

Kjo është arsyeja pse seksioni Instalimi rekomandon përcaktimin e OWC_LEDGER_KEY.

Verifikimi

Butoni «Verify the chain now» i skedës Audit ledger — ose rruga GET /owc/v1/ledger/verify — e përshkon gjithë zinxhirin në grupe nga 500 rreshta.

Njihen tri skema nënshkrimi: skema kanonike aktuale, një skemë historike e mëparshme, dhe një skemë pa çelës që vjen nga versionet e para të para. Kjo e fundit prodhon një hash që mund ta rillogarisë kushdo që ka bazën: ajo nuk konsiderohet kurrë e vlefshme, numërohet veçmas dhe sinjalizohet si këputje. Një hash pa çelës nuk është provë.

Këputjet e raportuara: hash_mismatch, chain_break, bad_genesis, unkeyed_rows, table_emptied, tail_truncated, head_mismatch, count_mismatch.

Rezultati mbart ndër të tjera: ok, total, checked, table_total, broken_at, breaks, break_count, partial, legacy_rows, unverifiable_rows, anchor, anchor_ok, key_source, tamper_evident, key_rotated.

Spiranca e kokës

Një spirancë ruhet jashtë tabelës: identifikues, hash, numër rreshtash, vulë kohore. Pa të, fshirja e rreshtave më të fundit ose zbrazja e tabelës nuk do të linte asnjë gjurmë. Një veprim niset në çdo zhvendosje të spirancës, dhe kodi ju fton shprehimisht ta replikoni atë jashtë bazës — skedar, syslog, endpoint i jashtëm — që një rishkrim global të jetë i zbulueshëm.

Shtojca refuzon të mbishkruajë një spirancë ekzistuese dhe sinjalizon ndershmërisht se një spirancë e nxjerrë nga vetë tabela i bën të zbulueshme vetëm cungimet e mëpasme.

Ruajtja

ledger_retention_days, parazgjedhja 1825 ditë (5 vjet), kufijtë 0 deri 3650. Vlera 0 do të thotë ruajtje e pakufizuar.

Pastrimi punon mbi cron-in e vet ditor dhe heq vetëm një prefiks të vijueshëm: kurrë një vrimë në mes të zinxhirit. Hash-i i rreshtit të fundit të fshirë mbahet mend që pjesa tjetër të mbetet e verifikueshme. Tavani për ekzekutim: 20 000 rreshta (40 grupe nga 500). Prandaj një vonesë shumë e madhe pastrimi zgjidhet gjatë disa ditësh.

Minimizimi i të dhënave

  • Adresa IP: IPv4 me oktetin e fundit të vënë në zero (ruhet /24-shi), IPv6 e cunguar në /48 me 80 bitët e mbetur në zero. Maskimi bëhet mbi formën binare; një adresë IPv6 që hartëzon një IPv4 trajtohet si IPv4.
  • User-agent: ruhet vetëm një hash i kripëzuar, kurrë vargu.
  • page_url: validohet kundrejt hosteve të faqes. Thirrësi ka fjalën e fundit — nëse ai e jep vlerën, qoftë edhe bosh, ajo është përgjigjja; Referer-i konsultohet vetëm nëse ai nuk ka thënë asgjë fare, dhe validohet në të njëjtën mënyrë.
  • Tokeni i vizitorit: 32 karaktere heksadecimale nga një gjenerues kriptografik, pa asnjë lidhje me një identitet.

Algoritmi

ledger_hash_algo pranon sha256 (parazgjedhje) dhe sha3-256, të prera me algoritmet që PHP-ja juaj mbështet vërtet. Cilësimi shfaqet por nuk modifikohet në administrim: ndryshimi i algoritmit do të bënte që të dështonte verifikimi i të gjithë rreshtave ekzistues. Kolonat janë dimensionuar më gjerë, por zgjedhja reale kufizohet te këto dy algoritme.

Skeda Audit ledger

Listë e faqosur nga 25: identifikues, datë lokale dhe vulë kohore UTC e papërpunuar, token vizitori, ngjarje, kategori, profil, IP e pseudonimizuar, dhe hallka e zinxhirit (hash-i i mëparshëm → hash-i aktual, të cunguar në shfaqje, vlera e plotë në këshillën ndihmëse).

Filtrat: token vizitori (32 heksadecimale), ngjarje, profil, interval datash — të shkruara në zonën kohore të faqes dhe të krahasuara me vulat kohore UTC që ruhen vërtet.

Eksporte CSV dhe JSON. JSON-i mbart një zarf (formati, algoritmi, prejardhja e çelësit) që një autoritet të mund ta riverifikojë fragmentin pa e pasur pjesën tjetër të zinxhirit. Të gjitha qelizat CSV neutralizohen kundër injektimit të formulave të fletëllogaritësve.

Konsultimi i regjistrit përmes API-së

GET /owc/v1/ledger pranon page, per_page (1 deri 200, parazgjedhja 50), visitor_token, from dhe to. Tre të fundit lejojnë t'i përgjigjeni një kërkese qasjeje (neni 15) pa përshkuar gjithë zinxhirin. Kufijtë lexohen në UTC, dhe një datë në formatin VVVV-MM-DD zgjerohet në gjithë ditën. Filtrat e zbatuar vërtet kthehen brenda përgjigjes: një filtër i refuzuar nga kontrollet nuk duhet lexuar si «ja gjithë regjistri».

Çfarë ndodh kur regjistri refuzon një shkrim

Kjo është sjellja më e rëndësishme e gjithë shtojcës. Nëse regjistri është aktiv dhe shkrimi i rreshtit dështon, cookie-ja e pëlqimit anulohet dhe përgjigjja është një 503. Nuk ruhet asgjë, nuk lirohet asnjë gjurmues.

Arsyetimi është i drejtpërdrejtë: një pëlqim që nuk mund të provohet nuk duhet pretenduar. Shihni Zgjidhja e problemeve për hapat që duhen ndjekur.

Pikat e zgjerimit

add_action( 'owc_consent_updated',           function ( $categories, $event, $source ) {}, 10, 3 );
add_action( 'owc_consent_cookie_not_sent',   function ( $cookie, $event ) {}, 10, 2 );
add_action( 'owc_ledger_lock_failed',        function ( $event, $token ) {}, 10, 2 );
add_action( 'owc_ledger_write_failed',       function ( $error, $event, $token ) {}, 10, 3 );
add_action( 'owc_ledger_anchor',             function ( array $anchor ) {} );
add_action( 'owc_ledger_pruned',             function ( $deleted, $days ) {}, 10, 2 );

owc_ledger_anchor është hook-u që duhet përdorur për ta replikuar spirancën jashtë bazës.

Kufijtë e regjistrit

  1. Pafalsifikueshmëria është e kushtëzuar, dhe shtojca e thotë vetë këtë.
  2. Rreshtat para 1.2.0-shit mbartin një hash pa çelës: ata nuk rinënshkruhen kurrë — rinënshkrimi do t'i lejonte një sulmuesi të bënte të rinënshkruhej një histori e falsifikuar — dhe e pengojnë verdiktin «zinxhir i paprekur» për sa kohë ekzistojnë.
  3. Ruajtja ka tavan 20 000 rreshta për ekzekutim ditor.
  4. Regjistri nuk fshihet nga fshirësi i të dhënave personale i WordPress-it: është një zinxhir hash-esh, heqja e tij do të shkatërronte provën për të cilën ai ekziston, dhe ai përmban vetëm një token pseudonim dhe një IP të cunguar. Një mesazh ia shpjegon këtë zgjedhje subjektit të të dhënave.

Portali i të drejtave (DSAR)

Portali i lejon një personi t'i ushtrojë të drejtat e veta nga një faqe e sajtit tuaj. Ai është i aktivizuar si parazgjedhje, por shfaqet vetëm aty ku e vendosni shortcode-in.

Formulari

[owc_dsar_form]

Atributet:

AtributiParazgjedhjaRoli
typesaccess,rectification,erasure,portability,restrict,object,optoutLlojet e propozuara, të ndara me presje
title«Ushtro të drejtat e mia mbi të dhënat e mia personale»Titulli i bllokut
submit_label«Dërgo kërkesën time»Etiketa e butonit

Nëse dsar_enabled është i çaktivizuar, shortcode-i shfaq «portali është i çaktivizuar» dhe rruga REST përgjigjet me 404: çaktivizimi është vërtet nga ana e serverit.

Lista që kërkoni pritet me listën që pranon serveri: një opsion i refuzuar nga endpoint-i nuk i propozohet kurrë vizitorit.

Tetë llojet e kërkesave

access, rectification, erasure, portability, restrict, object, optout, withdraw.

withdraw është hequr me qëllim nga ajo që propozon formulari. Tërheqja e pëlqimit për cookie-t është e menjëhershme brenda panelit të preferencave; kalimi i saj nëpër një procedurë të shkruar prej 30 ditësh do ta bënte tërheqjen më të vështirë se pëlqimin (neni 7.3 GDPR). Një lidhje nën formular e hap drejtpërdrejt panelin e preferencave për këtë rast.

Filtri owc_dsar_types është burimi i vetëm i së vërtetës: prej tij rrjedh lista e lejimeve e endpoint-it.

Cikli i plotë

1. Dërgimi. POST /owc/v1/dsar. Tri mbrojtje serveri, sipas kësaj radhe:

  • Kurth për robotë: një fushë e fshehur e mbushur sjell një refuzim 400 me mesazhin e përgjithshëm të një dërgimi të keqformuar — një robot nuk mëson asgjë për arsyen e refuzimit të vet. Nga ana e shfletuesit, formulari madje e shfaq mesazhin e suksesit pa dërguar asgjë.
  • Vetëdeklarim (neni 12.6): kutiza «konfirmoj se po ushtroj një të drejtë mbi TË DHËNAT E MIA personale» duhet të jetë e shënuar, dhe kjo kontrollohet nga ana e serverit, jo vetëm në shfletues. Ajo regjistrohet bashkë me kërkesën.
  • Afat minimal prej 3 sekondash mes shfaqjes së formularit dhe dërgimit, nga ana e klientit.

Kufijtë e shpeshtësisë: 3 në orë për çdo adresë IP, 3 në ditë për çdo adresë e-maili të synuar — adresën e zgjedh sulmuesi, prandaj është ajo që duhet kufizuar — dhe 30 në orë për gjithë faqen.

Rreshti futet me statusin pending, me një token prej 64 karakteresh nga i cili ruhet vetëm hash-i SHA-256, me një datë skadimi të tokenit dhe një afat përgjigjeje. Identifikuesi nuk kthehet: pa numërim, pa rrjedhje volumetrie. Përgjigjja është {ok, mail_sent, message}, dhe mail_sent pasqyron dështimin real të dërgimit.

DPO-ja nuk njoftohet në këtë fazë. Përndryshe një thirrës anonim do të bënte të niseshin dy e-maile për çdo dërgim nga domeni juaj.

2. E-maili i verifikimit. Lidhja tregon drejt ballinës suaj me tokenin të hapur si parametër. Vlefshmëria: dsar_token_ttl_days, parazgjedhja 7 ditë, kufijtë 1 deri 90. E-maili mbart një header Reply-To por kurrë një From të rishkruar — rishkrimi i zarfit është ajo që e thyen SPF-në. Adresa e përgjigjes është dsar_email, përndryshe legal_dpo_email; kurrë adresa e administrimit të faqes, e cila nuk duhet publikuar.

3. Konfirmimi i identitetit. Lidhja hap një faqe që nuk ekzekuton asgjë: konfirmimi bëhet me një POST të mbrojtur nga një nonce. Kjo është ajo që e pengon një skaner lidhjesh poste (Safe Links, URL Defense, parapamje inbox-i) të konfirmojë një identitet në vend të personit.

Faqja është një dokument HTML i pavarur, i shërbyer jashtë temës, me noindex, nofollow dhe me header të pacache-ueshëm. Përpjekjet kufizohen në 30 në orë për çdo IP. Përgjigjet janë të dalluara: 404 për një lidhje të panjohur, 200 për një lidhje tashmë të konfirmuar, 410 për një lidhje të skaduar, 403 për një nonce të vjetruar, 500 për një dështim shkrimi, 200 për një konfirmim.

4. Çfarë nis konfirmimi.

  • Statusi kalon në verified.
  • Afati rillogaritet duke nisur nga verifikimi. Neni 12.3: afati rrjedh që kur kërkesa është e plotë, jo që nga një dërgim që s'u konfirmua kurrë.
  • Tokeni digjet. Hash-i i tij ruhet me qëllim, që një person që e rihap lidhjen e vet të lexojë «tashmë i konfirmuar» në vend të një 404-e që i kërkon të nisë gjithçka nga fillimi. Përdorimi një herë e vetme garantohet nga kontrolli i statusit.
  • Regjistrohen: data e konfirmimit, IP-ja e cunguar, tokeni pseudonim i shfletuesit — ura e vetme e mundshme mes regjistrit të pëlqimeve dhe kërkesës — dhe identifikuesi i kërkesës WordPress të lidhur me të.
  • Hapet një kërkesë vendase e WordPress-it me identitetin tashmë të provuar, pra drejtpërdrejt brenda radhës suaj Mjetet → Eksporto / Fshi të dhënat personale. Kjo bën që ekzekutimi të mbulojë të gjitha shtojcat e faqes, jo vetëm OW Consent. Përputhja: access dhe portability → eksport; erasure → fshirje; llojet e tjera nuk hapin kërkesë vendase.
  • Kontrolluesi njoftohet te dsar_email dhe dsar_notify_email, me rezervë te adresa e administrimit nëse asnjëra nuk është e vlefshme.

5. Ekzekutimi. Një panel mbi skedën DSAR requests rendit 20 kërkesat e verifikuara, të renditura sipas afatit, me numrin e ditëve të mbetura ose të vonesës.

VeprimiSjellja
Shkarko të dhënat (JSON)Refuzim 409 nëse identiteti nuk është konfirmuar kurrë. Skedari emërtohet dsar-<id>-<VVVVMMDD>.json
Fshi të dhënatOfrohet vetëm për një kërkesë të tipit erasure, dhe vetëm pas konfirmimit të identitetit. Kërkesa mbyllet përpara fshirjes, përndryshe teksti i lirë i vetë kërkesës do t'i mbijetonte ekzekutimit të saj
+2 muajZgjatja e nenit 12.3, vetëm një herë, me një arsye deri në 500 karaktere. Afati shtyhet me 60 ditë, kujtesat riarmatosen, dhe subjekti i të dhënave merr një e-mail me afatin e ri dhe arsyet
MbyllStatusi resolved ose rejected, shënim i detyrueshëm. Nuk mund të rishkruhet një kërkesë tashmë e mbyllur, dhe nuk mund të shënohet «e përmbushur» mbi një identitet që s'u konfirmua kurrë
Ridërgo lidhjenLëshon një token të ri, çka e zhvlerëson të mëparshmin

Pesë statuse: pending, verified, resolved, rejected, expired.

Ekrani nuk e ngarkon kurrë tokenin as hash-in e tij, dhe nuk e shfaq emrin e kërkuesit.

6. Mbikëqyrja e afatit. Mbi cron-in ditor: deri në 200 kërkesa të verifikuara përshkohen sipas afatit, një kujtesë shtatë ditë përpara, një kujtesë në kalimin e afatit, vetëm një herë secila. Një shirit administrimi sinjalizon kërkesat jashtë afatit dhe ato me më pak se shtatë ditë.

7. Pastrimi. Dërgimet që nuk u verifikuan kurrë fshihen pas skadimit të tokenit të tyre, ndërsa kërkesat e mbyllura fshihen pas retention_dsar_days. Matja niset nga mbyllja, jo nga dërgimi.

Pakoja e transportueshmërisë

Eksporti prodhon një dokument në formatin ow-consent/dsar-export, me vulën kohore, faqen, subjektin, kërkesën dhe grupet e të dhënave. Ai i thërret të gjithë eksportuesit e regjistruar të faqes, faqos deri në 50 faqe për çdo eksportues dhe ndalon në 20 sekonda. Fshirja bën të njëjtën gjë nga ana e fshirësve, me të njëjtët kufij.

Filtri: owc_dsar_export_bundle( $bundle, $email, $id ).

Prandaj ajo që mbulojnë eksporti dhe fshirja varet nga shtojcat e instaluara në faqen tuaj: një shtojcë që nuk regjistron asnjërin prej këtyre hook-eve duhet trajtuar me dorë.

Integrimi me mjetet vendase të WordPress-it

  • Eksportues i regjistruar nën çelësin ow-consent, me dy grupe: kërkesat e të drejtave dhe regjistri i pëlqimeve.
  • Fshirës:
    1. dërgimet që s'u konfirmuan kurrë fshihen — asnjë vlerë provuese, vetëm të dhëna personale;
    2. kërkesave të mbyllura u fshihet teksti i lirë dhe emri, ndërsa rreshti minimal (data, lloji, statusi) ruhet si provë (neni 5.2) deri te retention_dsar_days;
    3. një kërkesë ende e hapur ruhet, me një mesazh që shpjegon se asaj duhet t'i përgjigjeni para se të fshihet;
    4. regjistri i pëlqimeve nuk fshihet, për arsyen e shpjeguar më lart.
  • Shtojca ushqen gjithashtu draftin e politikës së privatësisë të WordPress-it.

Njoftimi informues nën formular

Nën formular, një bllok i shpalosshëm mbart njoftimin e nenit 13: identiteti dhe adresa e kontrolluesit, kontakti për privatësinë, qëllimi dhe baza ligjore (neni 6.1.c), të dhënat e mbledhura, marrësit dhe afati i ruajtjes, afati i përgjigjes dhe mundësia e zgjatjes, autoriteti mbikëqyrës kompetent, lidhja drejt politikës. Filtri: owc_dsar_form_notice( $html, $context ).

Autoriteti i shfaqur vjen nga nxjerrja e përshkruar në Njëmbëdhjetë profilet e përputhshmërisë, dhe pranohet vetëm nëse nis me shkronjë të madhe: leximi i cilësimit të papërpunuar do të emërtonte autoritetin francez në një faqe sudafrikane, indiane, australiane ose kaliforniane.

Pa JavaScript, butoni i dërgimit fshihet dhe një mesazh propozon adresën e kontaktit — që shfletuesi të mos bëjë kurrë një dërgim vendas që do ta vinte adresën e kërkuesit brenda URL-së, e pra brenda regjistrave të të gjithë serverëve dhe proxy-ve nëpër të cilët kalon.

Cilësimet DSAR

CilësimiParazgjedhjaKufijtë
dsar_enabledtrueboolean
dsar_email''kontakt publik dhe marrës i njoftimeve
dsar_notify_email''marrës shtesë
dsar_response_days301 deri 30 — kurrë më shumë se një muaj
dsar_token_ttl_days71 deri 90
retention_dsar_days1095 (3 vjet)1 deri 3650

Pikat e zgjerimit

add_action( 'owc_dsar_submitted',   function ( $type, $email, $message ) {}, 10, 3 );
add_action( 'owc_dsar_verified',    function ( $id, array $row ) {}, 10, 2 );
add_action( 'owc_dsar_fulfilled',   function ( $id, $what, $trace ) {}, 10, 3 );
add_action( 'owc_dsar_mail_failed', function ( $id, $email, $kind ) {}, 10, 3 );

Kufijtë e portalit

  1. Identiteti mbështetet mbi një faktor të vetëm: shkëmbimin me e-mail. Çdo provë shtesë sipas nenit 12.6 shkruhet me dorë në shënimet e kërkesës.
  2. Një dërgim i dështuar e-maili e bllokon ciklin: përgjigjja e ekspozon mail_sent: false dhe formulari shfaq një mesazh që dërgon te adresa e kontaktit, por kërkesa mbetet pending dhe afati ligjor nuk niset.
  3. Kujtesat e afatit dhe pastrimi varen nga WP-Cron.
  4. Tabela e kërkesave fshihet gjithnjë në çinstalimin e shtojcës, pavarësisht cilësimit tuaj. Eksportoni para se të fshini.

Opt-out-i CCPA «Do Not Sell or Share»

Nën profilet amerikane, ligji kërkon një kontroll me emër, të dukshëm, dhe që e kryen vërtet opt-out-in.

Dy mënyra për ta vendosur

Shortcode, aty ku doni:

[owc_dnsmpi]
[owc_dnsmpi label="Mos i shitni dhe mos i ndani të dhënat e mia personale" class="lidhja-ime"]
AtributiParazgjedhja
label«Do Not Sell or Share My Personal Information»
classowc-dnsmpi

Injektim automatik në fundfaqe: cilësimi ccpa_inject_footer, i aktivizuar si parazgjedhje, i renderuar mbi wp_footer me prioritet 20.

Çfarë bën një klikim

Një klikim e kryen opt-out-in. Ai nuk hap ndonjë panel. Runtime-i merr një nonce të freskët e pastaj dërgon një reject_all me burimin footer_link dhe të gjitha kategoritë opsionale në false. Lidhja kalon në aria-busy="true" dhe një zonë role="status" shfaq gjendjen: «po regjistrohet», pastaj «opt-out-i juaj u regjistrua mbi këtë shfletues», ose mesazhin e gabimit.

Kodi e citon arsyen: sipas rregulloreve zbatuese të CCPA-së (§7026(a)(1)), një lidhje që mjaftohet me hapjen e një paneli nuk është mekanizëm në përputhshmëri.

Rezervë pa fetch e pa Promise (WebView i vjetër, shfletues i integruar): klikimi hap panelin e preferencave me kategoritë reklamuese tashmë të vendosura në off.

Kufizimi i cache-it

HTML-ja e shërbyer është e njëjtë për të gjithë. Prandaj lidhja renderohet e dukshme nëse profili i konfiguruar i faqes është ccpa ose us_generic; përndryshe renderohet e fshehur dhe zbulohet nga ana e klientit për vizitorët juridiksioni i të cilëve e kërkon, sipas cookie-s së zbulimit rajonal.

Nëse zbulimi rajonal është i çaktivizuar dhe profili juaj i konfiguruar nuk është amerikan, blloku nuk shtypet fare: pa kod të vdekur.

Asnjë e dhënë vizitori nuk udhëton brenda konfigurimit JavaScript të këtij moduli — vetëm listat e profileve, kurrë vlera boolean e zgjidhur.

Burimet e këtij moduli shtypen në <head>, jo në fundfaqe, që refuzimi i Consent Mode të arrijë te gtag para se të niset një menaxher etiketash. JavaScript-i është vetëm në ES5.

Kufijtë

  1. Kontrolli me një klikim kërkon fetch dhe Promise.
  2. Lidhja është e detyrueshme vetëm nën profilet ccpa dhe us_generic; nën çdo profil tjetër ajo as nuk shfaqet, as nuk zbulohet.
  3. Zbulimi nga ana e klientit varet nga cookie-ja e zbulimit rajonal, pra nga JavaScript-i.

Google Consent Mode v2

Moduli është i aktivizuar si parazgjedhje (gcm_enabled).

Të shtatë sinjalet

Lëshohen të shtatë sinjalet e Consent Mode v2: ad_storage, ad_user_data, ad_personalization, analytics_storage, functionality_storage, personalization_storage dhe security_storage. Gjashtë kategoritë e shtojcës u lidhen atyre nga një burim i vetëm i së vërtetës, çka garanton se banneri, bllokimi dhe bootstrap-i nuk mund të divergojnë. Tabela jepet te Kategoritë e cookie-ve.

Vlerat e parazgjedhura, para çdo pëlqimi

Thirrja default shtypet si kod statik, ndërsa update-i llogaritet brenda shfletuesit: kjo është ajo që e mban faqen të cache-ueshme.

SinjaliRegjim opt-inRegjim opt-out
ad_storagedeniedgranted
analytics_storagedeniedgranted
ad_user_datadeniedgranted
ad_personalizationdeniedgranted
personalization_storagedeniedgranted
functionality_storagedenied nëse faqja e shfaq kategorinë functional, përndryshe grantedgranted
security_storagegranted gjithnjëgranted

Të dy grupet shtypen brenda së njëjtës faqe. Runtime-i zgjedh cilin të zbatojë sipas cookie-s së zbulimit rajonal. Pa këtë, një faqe e ruajtur në cache do ta ngulte juridiksionin e një vizitori amerikan mbi një vizitor evropian.

Dy cilësimet shoqëruese

CilësimiParazgjedhjaEfekti
gcm_ads_data_redactiontrueI maskon identifikuesit reklamues për sa kohë ad_storage është i refuzuar
gcm_url_passthroughtrueI kalon gclid / dclid përmes URL-ve për sa kohë cookie-t janë të refuzuara

Për dijeni

security_storage nuk preket kurrë nga një përditësim: ai mbetet i dhënë, siç e parashikon specifikimi. Paneli i kontrollit shfaq një kartë që tregon nëse Consent Mode është aktiv.


IAB TCF v2.2

Moduli TCF është i çaktivizuar si parazgjedhje, dhe ai kërkon një identifikues që shtojca nuk mund ta japë. Lexoni seksionin e kufijve para se ta aktivizoni.

Aktivizimi

CilësimiParazgjedhjaKufijtë
tcf_enabledfalseboolean
tcf_cmp_id00 deri 4095
tcf_publisher_countryFRkod ISO me 2 shkronja
tcf_publisher_purposes_li[]listë qëllimesh
tcf_special_features[]listë veçorish speciale

Tavani 4095 nuk është arbitrar: fusha CmpId zë 12 bit brenda vargut TCF.

Tri rastet ku moduli refuzon të lëshojë çfarëdo qoftë

  1. Asnjë CMP ID (tcf_cmp_id < 1): pa __tcfapi, pa varg TC, pa cookie euconsent-v2, pa rrugë REST. Një njoftim administrimi e shpjegon. CMP ID-ja duhet t'ju caktohet nga IAB Europe; shtojca nuk jep asnjë. Të lëshoje një varg që mbart CmpId 0 do të ishte më keq se të mos lëshoje asgjë.
  2. CMP ID mbi 4095: i njëjti refuzim, me një njoftim të dedikuar. Një vlerë e cunguar në 12 bit do të tregonte një CMP tjetër — një uzurpim identiteti.
  3. Asnjë Global Vendor List në cache: stub-i shtypet, por API-ja përgjigjet me cmpStatus: 'error' dhe me varg bosh, në vend që të shpikë një numër versioni liste.

Një diagnostikim shkruhet në një opsion (disabled, missing_cmp_id, no_gvl, active), dhe vetëm në kontekst administrimi ose cron-i, kurrë mbi një faqe publike.

Global Vendor List

  • Burimi: https://vendor-list.consensu.org/v3/vendor-list.json.
  • Kurrë e shkarkuar gjatë renderimit të një faqeje. Këtë e bën një cron ditor, me një ekzekutim të parë pesë minuta pas aktivizimit; në administrim me cache të ftohtë, vihet në radhë një marrje e vetme.
  • Kërkesa: afat maksimal 5 sekonda, 2 ridrejtime, përgjigje me tavan 4 MB. Një trup që e arrin tavanin konsiderohet i cunguar dhe refuzohet.
  • Për çdo ofrues ruhen vetëm fushat e dobishme; stack-et zbrazen. Nëse serializimi mbetet shumë i madh, zbatohen dy shkallë cungimi: fillimisht etiketat dhe URL-të, pastaj reduktimi vetëm te qëllimet.
  • Ruajtja: një javë brenda një transient-i, me stale-if-error — në rast dështimi, ruhet kopja e fundit e vlefshme.
  • Rrugë publike: GET /owc/v1/tcf/gvl, e kufizuar në 10 kërkesa në orë. Ajo shërben kopjen në cache me një ETag dhe një Cache-Control: public, max-age=86400, dhe i trajton kërkesat me kusht. Nëse nuk ka asgjë në cache, ajo përgjigjet me 503 dhe një Retry-After: 300 — kurrë me një listë të sajuar. Kjo rrugë nuk nis kurrë ndonjë kërkesë dalëse.

Ku llogaritet vargu TC

Brenda shfletuesit, jo në PHP. Një stub krejtësisht statik shtypet në <head> me prioritet 0: iframe lokalizues, zbatim i window.__tcfapi, rele postMessage, dhe një kodues i segmentit Core në JavaScript. Konfigurimi i publikuar nuk përmban asnjë të dhënë vizitori — kjo është ajo që lejon të mbetet i pajtueshëm me një cache faqesh. Filtri: owc_tcf_stub_config.

Ekziston edhe një pasqyrë PHP e koduesit, por ajo nuk ka asnjë thirrës brenda shtojcës: i rezervohet integrimeve dhe testeve, me paralajmërimin që të mos shtypet kurrë brenda HTML-je të cache-ueshme.

Çfarë kodohet

Vetëm segmenti Core, në base64url pa mbushje. Seksioni i ofruesve kodohet ose si fushë bitesh, ose si intervale: maten të dyja madhësitë dhe fiton më e vogla. Indeksi i ofruesve që i përcillet shfletuesit përdor një format kompakt të vetë shtojcës, me një tavan të fortë përtej të cilit indeksi zbrazet (pëlqimet për ofruesit humbasin atëherë, ndërsa versioni i listës ruhet).

Përputhja kategori → qëllime TCF

KategoriaQëllimet
necessaryasnjë — jashtë perimetrit TCF, çka garanton që «Refuzoji të gjitha» nuk mund të prodhojë pëlqim për qëllimin 1
functional1
analytics1, 8, 9, 10
marketing1, 2, 3, 4, 7
preferences1, 5, 6, 11
social1

Filtri: owc_tcf_purpose_map.

Interesi legjitim i botuesit: pranohen vetëm qëllimet 2, 7, 8, 9, 10 dhe 11, sepse TCF v2.2 e ndalon interesin legjitim për qëllimet 1, 3, 4, 5 dhe 6. Çdo vlerë tjetër e tcf_publisher_purposes_li shpërfillet në heshtje.

Një ofrues konsiderohet i pëlqyer sapo të jetë dhënë të paktën një nga qëllimet që ai deklaron nën bazën «pëlqim».

Veçoritë speciale

Mbështeten vetëm dy zëra: 1 — përdorimi i të dhënave të sakta të gjeolokalizimit dhe 2 — skanimi aktiv i karakteristikave të pajisjes. Deklaroni ato që përdorni brenda tcf_special_features; lista sillet te ky katalog.

Ato shfaqen si kutiza të vërteta brenda panelit të preferencave. «Pranoji të gjitha» nuk i shënon: ato kërkojnë një opt-in të shprehur më vete. «Refuzoji të gjitha» dhe «Do Not Sell» i çshënojnë. Ato jetojnë brenda vetë vargut TC, dhe rihidratohen nga API-ja TCF kur rihapet paneli.

Shtresa TCF brenda panelit

Ajo renderohet vetëm nëse moduli është aktiv, domethënë tcf_enabled dhe një CMP ID i përdorshëm. Dy blloqe:

  • Qëllimet: vetëm ato që arrihen përmes një kategorie jo të detyruar dhe që emërtohen brenda katalogut të listës së ofruesve. Një çelës që do të kthehej vetë prapa do të ishte më keq se mungesa e çelësit. Ndryshimi i një qëllimi shkruan në të gjitha kategoritë që e deklarojnë, dhe pastaj shfaqja rillogaritet.
  • Veçoritë speciale të deklaruara.

Asgjë nuk kodohet brenda vargut pa qenë shfaqur më parë.

API-ja JavaScript

window.__tcfapi( command, version, callback, parameter );
// komandat: ping, getTCData, getInAppTCData,
//           addEventListener, removeEventListener, getVendorList

window.__owcTcfUpdateState( tcData );        // zëvendëson të dhënat dhe njofton dëgjuesit
window.__owcTcfRefresh();                    // rillogarit dhe lëshon 'useractioncomplete'
window.__owcTcfUiShown(); window.__owcTcfUiHidden();
window.__owcTcfSetSpecialFeatures( [ 1, 2 ] );

Versionet e pranuara: e munguar, null, 2, '2', 2.2, '2.2'. Çdo vlerë tjetër jep callback(null, false).

gdprApplies

Vendoset nga ana e klientit. Nëse zbulimi rajonal është i çaktivizuar, vlera është true. Përndryshe, shteti i vizitorit krahasohet me listën e 31 kodeve ku zbatohet GDPR-ja sipas kuptimit të TCF-së (27 shtete të BE-së, plus IS, LI, NO, GB dhe CH). Dështim i mbyllur: një shtet i panjohur jep true.

Cookie-ja euconsent-v2

Shkruhet vetëm nga ana e klientit, dhe vetëm kur moduli është gati dhe vizitori ka vepruar. Përndryshe cookie-ja fshihet. Kohëzgjatja e saj është ajo e pëlqimit, me tavan 13 muaj (rekomandim IAB / CNIL). SameSite=Lax, Secure në HTTPS.

Kufijtë e modulit TCF — lexojini patjetër

  1. Ky nuk është një CMP i regjistruar pranë IAB Europe. Ai kërkon CMP ID-në tuaj, dhe edhe me të, politika e TCF-së i imponon një CMP-je të regjistruar t'i paraqesë zgjedhjet në nivel qëllimi dhe në nivel ofruesi. Këtu, çelësat e qëllimeve ndjekin kategoritë dhe nuk ka asnjë zgjedhje në nivel ofruesi: ofruesit kanë të drejtë ta refuzojnë këtë sinjal. Ekrani i administrimit e thotë këtë dhe flet për «modalitet i pajtueshëm me CMP (jozyrtar)», i pranuar nga shumica e SSP-ve në zhvillim, por i refuzuar në prodhim real brenda ZEE-së. Nëse të ardhurat reklamuese nën TCF kanë peshë për ju, përdorni një CMP të certifikuar.
  2. Vetëm segmenti Core: pa segmentet disclosedVendors, allowedVendors apo publisherTC.
  3. Nuk lëshohet asnjë kufizim botuesi: numëruesi përkatës është gjithnjë 0 dhe objekti i kufizimeve është bosh.
  4. purposeOneTreatment dhe useNonStandardTexts janë gjithnjë false, isServiceSpecific është gjithnjë true — nuk ka shtrirje globale — dhe ekrani i pëlqimit është gjithnjë 0.
  5. getVendorList e shpërfill parametrin e versionit dhe kthen gjithnjë listën në cache.
  6. Pëlqimet e botuesit kopjojnë qëllimet e përgjithshme: pa qëllime të personalizuara.
  7. Vetëm dy veçori speciale.
  8. Moduli kërkon një cron funksional dhe HTTPS dalës. Pa listë në cache, API-ja përgjigjet me cmpStatus: 'error' dhe rruga publike kthen 503.

Global Privacy Control

GPC-ja është një sinjal që e dërgon shfletuesi — header-i Sec-GPC: 1 dhe vetia navigator.globalPrivacyControl. Shtojca e nderon si parazgjedhje (gpc_honor), por trajtimi i tij varet nga regjimi juridik, dhe kjo është pika e rëndësishme.

Nën profilet amerikane: detyrues

Sinjali trajtohet si opt-out universal detyrues nën profilet ccpa dhe us_generic. Australia përjashtohet shprehimisht: regjim opt-out, por që nuk e njeh GPC-në.

Shkrimi në server ndodh vetëm pas një zinxhiri të plotë verifikimesh, sipas kësaj radhe:

  1. gpc_honor është aktiv;
  2. sinjali është i pranishëm — header-i Sec-GPC, me rezervë te X-Sec-GPC sepse disa proxy dhe CDN e riemërtojnë header-in; vlen vetëm vlera e saktë 1;
  3. profili efektiv është ccpa ose us_genericpërndryshe nuk shkruhet asgjë;
  4. është një konsultim i thjeshtë faqeje: pa administrim, pa cron, pa AJAX, pa REST, pa XML-RPC, pa WP-CLI, dhe metoda është GET;
  5. header-at nuk janë dërguar ende — një cookie që nuk mund të vendoset është një vendim që do të riregjistrohej në çdo kërkesë;
  6. shënuesi i sesionit owc_gpc mungon: një herë për çdo sesion shfletimi;
  7. vizitori nuk i ngjan një roboti (user-agent bosh, ose që përmban bot, crawl, spider, slurp, monitor, uptime, pingdom, headless, preview, curl/, wget, python-, java/, go-http, okhttp, httpclient, libwww, facebookexternalhit);
  8. zgjedhja tashmë e ruajtur nuk e plotëson tashmë sinjalin — përndryshe shfletuesi vetëm shënohet;
  9. respektohet kufiri i përbashkët i shpeshtësisë: 30 në orë për çdo IP;
  10. shfletuesi shënohet para shkrimit, që një dështim të mos kthehet në cikël përsëritjesh.

Ngjarja regjistrohet si gpc_opt_out me burimin auto. URL-ja e faqes rindërtohet nga URL-ja e faqes dhe shtegu i kërkuar — kurrë nga header-i Host, kurrë nga Referer-i.

Perimetri: të gjitha kategoritë opsionale kalojnë në false; kategoritë e detyruara mbeten të dhëna. Ky është një lexim i gjerë i nocionit të shitjes ose ndarjes.

Transparenca: nëse GPC-ja mbishkruan një zgjedhje të regjistruar shprehimisht, një cookie prej pesë minutash nis nga ana e klientit një njoftim në fund të ekranit që e shpjegon këtë, me një buton «menaxho preferencat e mia» që hap panelin, dhe një buton mbylljeje.

Nën profilet GDPR dhe të ngjashme: thjesht një tregues

Jashtë regjimeve amerikane opt-out, sinjali trajtohet si tregues, kurrë si pëlqim:

  • atributi data-owc-gpc="1" vendoset mbi <html>;
  • Consent Mode i kalon ad_storage, analytics_storage, ad_user_data, ad_personalization dhe personalization_storagedenied;
  • të gjitha kategoritë opsionale vihen në false vetëm në memorie;
  • given mbetet false, banneri mbetet i shfaqur, dhe nuk regjistrohet asgjë.

Një flamur i brendshëm e pengon runtime-in t'i njoftojë vizitorit se ai është «tashmë opt-out» ndërkohë që as cookie-ja as regjistri nuk e thonë këtë. Arsyetimi është shkruar në kod: GPC-ja nuk është sinjal ligjërisht i njohur nën GDPR-në dhe ePrivacy, nën nFADP-në zvicerane, LGPD-në, POPIA-n, PIPL-in, DPDP-në apo Ligjin 25.

Dy cookie-t që vendos ky modul

CookieKohëzgjatjaRoli
owc_gpcsesionShënon se sinjali është trajtuar tashmë për këtë shfletues
owc_gpc_notice300 sNis njoftimin «GPC-ja e zëvendësoi zgjedhjen tuaj»

Të dyja janë mbi path=/, SameSite=Lax, Secure në HTTPS, dhe të lexueshme nga skriptet.

Pikë zgjerimi

add_action( 'owc_gpc_honored', function ( array $categories ) {} );

Zbulimi rajonal

Zbulimi rajonal i zbaton çdo vizitori profilin e juridiksionit të tij në vend të profilit të konfiguruar të faqes. Ai është i çaktivizuar si parazgjedhje.

CilësimiParazgjedhja
geo_enabledfalse
geo_default_profilegdpr
geo_mmdb_enabledfalse

Kaskada e zbulimit

Fiton suksesi i parë:

  1. Cloudflare (CF-IPCountry) — vetëm nëse faqja ka deklaruar se ndodhet pas Cloudflare-it;
  2. AWS CloudFront (CloudFront-Viewer-Country) — i njëjti kusht;
  3. GEOIP_COUNTRY_CODE, variabla që e shkruan vetë serveri (mod_geoip, ngx_http_geoip), pra e pafalsifikueshme nga klienti; pastaj, nëse është deklaruar një proxy, variantet në header HTTP;
  4. Baza lokale MaxMind, nëse geo_mmdb_enabled është aktiv;
  5. Asgjë.

Pa një deklarim të shprehur në wp-config.php, nuk besohet asnjë header HTTP shteti: ata janë të falsifikueshëm nga klienti. Shihni Instalimi për konstantet.

Kodi i shtetit validohet kundrejt listës së lejimeve ISO-3166-1 alpha-2 të caktuar zyrtarisht (rreth 249 kode të numëruar drejtpërdrejt në kod). Kodet e përdoruesit ose të rezervuara — XX, ZZ, T1-shi i daljeve Tor — refuzohen.

Dështimi i mbyllur

Pa shtet të zbuluar, shtojca lexon geo_default_profile por e zbret çdo profil opt-out në gdpr. Prandaj një geo_default_profile i vendosur në ccpa, us_generic ose au shpërfillet për vizitorët e pazbuluar — dhe ekrani i administrimit propozon vetëm profile opt-in brenda këtij përzgjedhësi, në vend që të ofrojë një zgjedhje që shpërfillet në heshtje.

Arsyeja është e drejtpërdrejtë: pa këtë mbrojtëse, një faqe e konfiguruar në anglishten amerikane do ta vendoste çdo vizitor të ZEE-së në regjim opt-out, me gjurmues të shënuar si «të dhënë» pa asnjë pëlqim.

Asnjë rezervë te lokalja e faqes: gjuha e një faqeje nuk thotë asgjë për vendndodhjen e vizitorit të saj.

Cookie-ja owc_geo

  • Kohëzgjatje 24 orë, path=/, SameSite=Lax, Secure në HTTPS, e lexueshme nga skriptet — bootstrap-i i pjesës publike ka nevojë për të.
  • Përmbajtja: shteti, profili, një vulë kohore dhe një kod autentikimi. Kurrë adresë IP.
  • Në lexim: madhësi e kufizuar, shtet i validuar kundrejt listës ISO, vulë kohore brenda dritares, kod i verifikuar në kohë konstante. Profili rillogaritet gjithnjë nga ana e serverit nisur nga shteti: një vizitor nuk mund ta zgjedhë regjimin e vet juridik.
  • Në cache ruhet vetëm një zbulim real. Rezerva «dështim i mbyllur» nuk mbahet mend kurrë.
  • Shkruhet vetëm mbi një kërkesë të pjesës publike, dhe vetëm nëse zbulimi është aktiv.

Përputhja shtet → profil

ShtetiProfili
30 shtetet e ZEE-sëgdpr
GB, JE, GG, IMuk_pecr
CHch_nfadp
BRlgpd
ZApopia
CN, HKpipl
INdpdp
AU, NZau
CAquebec
USccpa
Gjithë pjesa tjetërRezerva, e zbritur në opt-in

Hong Kongu në të vërtetë i nënshtrohet urdhëresës së vet vendore; trajtohet si PIPL për ashpërsi. Zelanda e Re trajtohet si Australia. Gjithë Kanadaja merr quebec — fiton regjimi më strikt. Shtetet e Bashkuara marrin ccpa, i cili shërben si profil edhe për shtetet e tjera.

Kufizimi i cache-it — çfarë nuk bën zbulimi

Profili i gjeolokalizuar nuk e ndryshon HTML-në e renderuar. Rishkrimi i profilit zbatohet vetëm te dy rrugët REST të vizitorit, /owc/v1/consent dhe /owc/v1/state. Renderimi i faqeve, rrugët e administrimit, wp-admin, cron-i dhe WP-CLI e ruajnë profilin e konfiguruar. Çdo përgjigje që ka konsumuar rishkrimin shënohet si e pacache-ueshme.

Është runtime-i i pjesës publike ai që e zgjedh regjimin, nga ana e klientit, nisur nga cookie-ja. Pasojë e pranuar: regjimi që i zbatohet një vizitori varet nga JavaScript-i, dhe një vizitor faqja e parë e të cilit vjen nga cache-i trajtohet nën profilin e konfiguruar sa kohë cookie-ja nuk ekziston.

Lexuesi MaxMind i integruar

Shtojca ka lexuesin e vet MMDB, të shkruar në PHP të pastër, pa varësi nga Composer-i — një shtojcë e publikuar në WordPress.org nuk mund ta përfshijë paketën zyrtare.

  • Vetëm lexim, vetëm shtet. Pa qytet, pa ASN.
  • Hyrje/dalje të kufizuara: lexim në blloqe të vogla, kurrë ngarkim në memorie i një skedari prej disa megabajtësh.
  • Nuk ngre kurrë përjashtim: skedar që mungon, i palexueshëm, i cunguar, i korruptuar ose armiqësor jep null, dhe zbulimi bie te profili i vet strikt.
  • Mbrojtëse të brendshme mbi thellësinë e përshkimit, buxhetin e dekodimit dhe madhësinë e ngarkesës. Metatë dhënat ruhen në një transient çelësi i të cilit përfshin madhësinë dhe datën e skedarit: zëvendësimi i shkarkimit tuaj mujor e zhvlerëson cache-in vetvetiu.
  • registered_country dhe represented_country shpërfillen me qëllim. Kjo është forma e dokumentuar e intervaleve të proxy-ve anonimë, VPN-ve dhe satelitëve, ku shteti i regjistrimit tregon vendin ku ofruesi e ka regjistruar bllokun, jo vizitorin. Përdorimi i tyre do ta vinte një vizitor të ZEE-së pas një VPN-je amerikane në regjim opt-out.
  • Nëse një shtojcë tjetër ngarkon tashmë një lexues GeoIP2, ai përdoret si rezervë pas lexuesit të vetë shtojcës.

Ku duhet vendosur skedari: wp-content/uploads/ow-geoip/GeoLite2-Country.mmdb. Shtegu filtrohet me owc_geo_mmdb_path, me validim kundrejt përshkimit të drejtorive.

Kufi i rëndësishëm: shtojca nuk e shkarkon bazën dhe nuk ofron asnjë ekran ngarkimi. Skedarin duhet ta merrni te MaxMind, ta vendosni vetë dhe ta përditësoni vetë. Në këmbim, asgjë nuk i dërgohet MaxMind-it: kërkimi është plotësisht lokal, adresa IP përdoret vetëm si pikë kërkimi dhe shkatërrohet shprehimisht më pas — kurrë e regjistruar, kurrë e ruajtur, kurrë e shkruar brenda cookie-s.

Kufijtë e zbulimit rajonal

  1. I çaktivizuar si parazgjedhje, dhe varianti MaxMind kërkon një skedar që e jepni ju.
  2. Header-at e shtetit shpërfillen sa kohë nuk e keni deklaruar proxy-n tuaj.
  3. Pa ndarje shtet për shtet në SHBA, e as provincë për provincë në Kanada.
  4. Regjimi i vizitorit varet nga JavaScript-i dhe nga cookie-ja 24-orëshe.
  5. Profili us_generic nuk caktohet kurrë automatikisht.

Integrimi me OW Forms

Perimetri i saktë: ky integrim synon shtojcën motër OW Forms, dhe asgjë tjetër. Nuk ka asnjë integrim me Contact Form 7, Gravity Forms apo WPForms.

Cilësimi: forms_integration_enabled, i aktivizuar si parazgjedhje, por integrimi nuk bën asgjë nëse OW Forms nuk është aktive.

Çfarë sjell

1. Lidhja pëlqim ↔ dërgim. Për çdo dërgim të ruajtur, shkruhet një rresht brenda një tabele të dedikuar të OW Consent — skema e OW Forms nuk preket kurrë — që përmban:

  • tokenin pseudonim të vizitorit (32 heksadecimale, kurrë adresën e e-mailit);
  • identifikuesin e zërit më të fundit të regjistrit për këtë token;
  • kategoritë e dhëna dhe profilin e përputhshmërisë në fuqi;
  • hash-in e plotë të dokumenteve të publikuara në atë çast;
  • vulën kohore të pëlqimit;
  • gjendjen e kutizës GDPR të formularit dhe etiketën e saktë që ajo mbante.

Kjo e fundit është më e dobishmja në praktikë: ju mund të demonstroni jo vetëm se kutiza ishte e shënuar, por edhe çfarë ishte shkruar pranë saj.

2. Kaskada e fshirjes. Një kërkesë fshirjeje e verifikuar ia delegon fshirjen rutinës së OW Forms — e cila fshin edhe skedarët e ngarkuar — dhe pastaj fshin rreshtat e lidhjes. Integrimi e zbulon nëse OW Forms ka lidhur tashmë dëgjuesin e vet mbi të njëjtin veprim, në këtë rast ai mjaftohet me pastrimin e lidhjeve të veta.

3. Mjetet e privatësisë të WordPress-it. Regjistrohen një eksportues dhe një fshirës, kështu që Mjetet → Eksporto / Fshi të dhënat personale i mbulon dërgimet e OW Forms — dhe edhe portali i të drejtave i OW Consent, meqë ai përshkon të njëjtat hook-e. Eksporti merr etiketat reale të fushave dhe u shton fushat e pëlqimit. Çdo vlerë e eksportuar neutralizohet kundër injektimit të formulave të fletëllogaritësve dhe cungohet.

4. Ruajtja. Mbi cron-in ditor, lidhjet më të vjetra se retention_form_data_days (parazgjedhja 1095 ditë, kufijtë 1 deri 3650) fshihen në grupe nga 500, me një kalim edhe mbi jetimet. Preken vetëm rreshtat e OW Consent: ruajtja e vetë dërgimeve i takon OW Forms.

Kufijtë

  1. Asnjë ngjarje dërgimi nuk shkruhet brenda regjistrit të zinxhirtë. Rreshti i lidhjes i referohet një zëri ekzistues, nuk krijon ndonjë të tillë — zinxhiri nuk duhet shkruar nga jashtë.
  2. Nuk mund të lidhet një dërgim nëse OW Forms është konfiguruar të mos i ruajë dërgimet: nuk ka asnjë rresht ku të kapesh.
  3. Asnjë rikuperim retroaktiv: lidhja nis nga dërgimi i parë pas përditësimit.
  4. Përputhja bëhet mbi hash-in e kripëzuar të adresës që llogarit OW Forms, me rezervë te adresa e hapur që OW Forms e ruan gjithashtu. Kjo nuk është një skemë me zbulim zero: adresa mbetet e hapur te OW Forms, sepse duhet të mund t'i përgjigjeni personit.
  5. Integrimi nuk e ndryshon kurrë shtojcën OW Forms, tabelat apo opsionet e saj.
  6. Nëse OW Forms është aktive por shumë e vjetër për ta ekspozuar rutinën e vet të fshirjes, fshirësi përgjigjet shprehimisht se dërgimet nuk janë prekur.

Butoni pluskues

Një buton i vogël i qëndrueshëm lejon rihapjen e panelit të preferencave në çdo çast. Kjo është kërkesa e nenit 7(3) — tërheqja duhet të mbetet po aq e thjeshtë sa pëlqimi — dhe e vendimit CNIL 2020-091, i cili kërkon një mekanizëm të arritshëm nga çdo faqe.

Kushtet e ekzistencës

Ai kërkon të dyja cilësimet: floating_button_enabled dhe banner_enabled. Paneli i preferencave dhe API-ja JavaScript jetojnë brenda runtime-it të bannerit; pa të, butoni do të ishte një kontroll që nuk bën asgjë.

Ai del gjithashtu në administrim, mbi një feed, mbi robots.txt, dhe nëse wp_head nuk është nisur.

Opsionet

CilësimiVleratParazgjedhja
floating_button_enabledbooleantrue
floating_button_positionbottom-left, bottom-right, top-left, top-rightbottom-left
floating_button_stylepill, iconpill
floating_button_labeltekst i lirëCookies

Butoni nuk ka cilësim teme të vetin: ai merr banner_style, që të dyja sipërfaqet të ndjekin të njëjtën paletë.

Sjellja dhe qasshmëria

Është një <button> i vërtetë, pra i qasshëm me tastierë. Ai mbart aria-haspopup="dialog" dhe një aria-label të përkthyeshëm por jo të konfigurueshëm («Manage my cookie choices»): rregullohet vetëm etiketa e dukshme. Në modalitetin icon, etiketa fshihet vizualisht por vazhdon të lexohet nga lexuesit e ekranit.

Ai renderohet me atributin hidden; është JavaScript-i që vendos ta shfaqë. Ai është i dukshëm në të gjitha gjendjet, veç kur banneri ose paneli ndodhet tashmë në ekran — përfshirë menjëherë pas një zgjedhjeje mbi faqen aktuale.

Një klikim hap panelin e preferencave. Nëse API-ja e bannerit nuk ekziston, butoni bie te fragmenti #owc-preferences, duke e rinisur ngjarjen me dorë nëse ky është tashmë fragmenti aktual.

z-index 99990, i fshehur në shtypje, mbështetje për modalitetin me kontraste të forcuara dhe për prefers-reduced-motion, zhvendosje nën shiritin e administrimit kur pozicioni është lart.


Shortcode-et

Shtojca deklaron dy shortcode, dhe vetëm dy. As banneri, as butoni pluskues nuk kanë të tillë: ata shfaqen kudo ose askund, të drejtuar nga cilësimet e tyre.

[owc_dsar_form] — portali i të drejtave

[owc_dsar_form]
[owc_dsar_form types="access,erasure,portability" title="Të drejtat e mia" submit_label="Dërgo"]
AtributiParazgjedhja
typesaccess,rectification,erasure,portability,restrict,object,optout
title«Ushtro të drejtat e mia mbi të dhënat e mia personale»
submit_label«Dërgo kërkesën time»

Llojet e kërkuara priten me ato që pranon serveri. Lloji withdraw nuk propozohet kurrë nga formulari; shihni Portali i të drejtave.

[owc_dnsmpi] — opt-out-i CCPA

[owc_dnsmpi]
[owc_dnsmpi label="Mos i shitni dhe mos i ndani të dhënat e mia personale" class="lidhje-fundfaqe"]
AtributiParazgjedhja
label«Do Not Sell or Share My Personal Information»
classowc-dnsmpi

Një klikim e kryen opt-out-in; shihni Opt-out-i CCPA. Nëse e lini ccpa_inject_footer aktiv, lidhja injektohet tashmë në fundfaqe dhe ky shortcode është i dobishëm vetëm për ta vendosur diku tjetër.

Rihapja e panelit nga një meny ose një lidhje

Për këtë nuk ka shortcode, sepse mjafton një atribut klase:

<a href="#owc-preferences" class="owc-open-preferences">Menaxho cookie-t e mia</a>
<button type="button" data-owc-open>Preferencat e mia</button>
<a href="#owc-dnsmpi" data-owc-dnsmpi="1">Mos i shitni të dhënat e mia</a>

Kjo është metoda e rekomanduar për të shtuar një zë «Cookies» në menynë tuaj të fundfaqes.


API REST

Të gjitha rrugët jetojnë nën namespace-in owc/v1, mbi rrënjën e zakonshme REST (https://shembull.com/wp-json/owc/v1/…). Trembëdhjetë rrugë në total: dymbëdhjetë të regjistruara nga moduli REST, plus rruga e listës së ofruesve e regjistruar nga moduli TCF.

Rrugët publike

Pa autentikim. Siguria e tyre mbështetet mbi kontrollin e origjinës, mbi një token të vetë shtojcës dhe mbi kufijtë e shpeshtësisë të përshkruar më poshtë.

MetodaShteguParametratRoli
GET/nonceaction (parazgjedhja wp_rest)Kthen një token të freskët. Përgjigjja: {nonce, action, header: "X-OWC-Nonce", ttl: 43200}, me no-store dhe Vary: Cookie
POST/consentevent (parazgjedhja save_preferences), source (parazgjedhja banner), categories (i detyrueshëm), page_url (parazgjedhja ''), cookie_unreadable (boolean, parazgjedhja false)Regjistron një zgjedhje, vendos cookie-n dhe shkruan rreshtin e regjistrit
GET/stateGjendja e vetëm thirrësit: {given, categories, profile, at}. Kurrë tokeni i vizitorit, kurrë IP-ja, kurrë URL-ja e faqes. no-store + Vary: Cookie
GET/tcf/gvlShërben Global Vendor List-in nga cache-i. ETag, Cache-Control: public, max-age=86400, 304 mbi kërkesë me kusht, 503 + Retry-After: 300 nëse nuk ka asgjë në cache
POST/dsartype (i detyrueshëm), email (i detyrueshëm, format e-maili), message (parazgjedhja '', maksimum 2000 karaktere)Depoziton një kërkesë për ushtrimin e të drejtave. Përgjigjja {ok, mail_sent, message}kurrë identifikuesi

Vlerat e pranuara:

  • event: accept_all, reject_all, save_preferences, withdraw, auto, gpc_opt_out
  • source: banner, preferences, footer_link, api, auto
  • type (DSAR): access, rectification, erasure, portability, restrict, object, optout, withdraw
  • categories: një objekt, maksimum 32 zëra, vetëm vlera skalare
  • action (nonce): vetëm wp_rest

Rrugët e administrimit

Të gjitha kërkojnë lejen manage_options.

MetodaShteguParametratRoli
GET/ledgerpage (≥1, parazgjedhja 1), per_page (1–200, parazgjedhja 50), visitor_token (32 hex), from, toLexon regjistrin. Filtrat e zbatuar vërtet kthehen brenda përgjigjes
GET/ledger/verifyVerifikon zinxhirin nga fillimi në fund
GET/settingsCilësimet efektive
POST/settingstrup JSON i lirëShkruan cilësimet. Përgjigjja {ok, updated, rejected, settings}
POST/scanner/runNis një shfletim
POST/scanner/ingesttrup JSON {page, findings[]}Pranimi i vëzhgimeve të sondës
GET/scanner/findingspage, per_page (1–200, parazgjedhja 50), filter (slug kategorie ose unknown)Rendit gjetjet
POST/policies/generatetype (i detyrueshëm), publish (boolean, parazgjedhja false)Gjeneron një dokument
GET/policies/previewtype (i detyrueshëm)Bën parapamjen e një dokumenti

/scanner/ingest kërkon veç kësaj një nonce wp_rest të vlefshëm, brenda header-it X-WP-Nonce ose si parametër _wpnonce — sepse sendBeacon nuk mund të vendosë header.

/settings në shkrim pranon vetëm çelësat e deklaruar si cilësime reale: një filtër mund të injektojë çelësa sintetikë që nuk janë të tillë. Çdo vlerë pastrohet veç e veç. Asnjë çelës i njohur jep një 400.

/ledger e riteston lejen brenda vetë trajtuesit, si mbrojtje në thellësi kundër një permission_callback të filtruar diku tjetër.

Modeli i sigurisë së shkrimeve publike

Konstatimi nistor është i thjeshtë: një nonce nuk mund të jetojë brenda HTML-je të cache-ueshme. Prandaj /consent dhe /dsar kanë një kontroll qasjeje lejues, të mbrojtur nga katër shtresa në një radhë që ka rëndësi.

  1. Kontroll origjine mbi të njëjtin host. Falas, deterministik, nuk konsumon asnjë buxhet.
  2. Token i vetë shtojcës brenda header-it X-OWC-Nonce — kjo është provë, kurrë veto. Zgjedhja për të mos përdorur X-WP-Nonce është e qëllimshme: bërthama e WordPress-it e kap këtë header para çdo kontrolli qasjeje rruge dhe e refuzon gjithë kërkesën nëse nuk e validon. Prandaj një token i vjetruar i shërbyer nga një cache do të vriste një shkrim që endpoint-i do ta kishte pranuar edhe fare pa token.
  3. Dështim i mbyllur: as origjinë, as token i verifikuar japin një 403 owc_missing_origin.
  4. Kufiri i shpeshtësisë i fundit. Po të kalonte i pari, një konfigurim i gabuar do të konsumonte dy tokena për çdo klikim dhe do të përfundonte në 429, çka do ta fshihte gabimin e konfigurimit pas një kufiri shpeshtësie.

Hostet e pranuar: ata që deklaron WordPress-i (URL-ja e faqes, URL-ja e WordPress-it, rrënja REST) bashkë me binjakun e tyre www./apex, plus hosti i header-it Host të kërkesës aktuale dhe binjaku i tij. «E njëjta origjinë» do të thotë «origjina i përgjigjet hostit me të cilin u lidh shfletuesi», jo «i përgjigjet asaj që WordPress-i ka në bazë» — përndryshe çdo faqe e arritur me një domen parapamjeje, një alias, një emër preprodhimi, një domen të hartëzuar në multisite ose pas një proxy-je që rishkruan Host do të refuzohej në heshtje, pa asnjë mundësi vetëriparimi. Filtri: owc_allowed_request_hosts.

CORS-i i lihet bërthamës së WordPress-it, me qëllim.

/nonce e refuzon shprehimisht formën JSONP: pa këtë refuzim, një faqe e palës së tretë do të mund ta korrte tokenin e gjallë të një administratori kalimtar me një <script src> të thjeshtë, i cili nuk i nënshtrohet kontrollit të origjinës.

Kufijtë e shpeshtësisë

KovaBuxhetiDritarjaÇelësi
nonce1205 minutaadresa IP
consent305 minutaadresa IP
dsar31 orëadresa IP
dsar_email324 orëadresa e-mail e synuar
dsar_global301 orëgjithë faqja
gpc301 orëadresa IP
tcf_gvl101 orëadresa IP
  • Dritare fikse, jo rrëshqitëse: një kovë që merr trafik përfundon gjithnjë duke skaduar.
  • Çelësi i ruajtur është një hash i kripëzuar: asnjë adresë IP apo adresë e-maili e hapur nuk ndodhet brenda opsioneve apo cache-it të objekteve.
  • Normalizimi i IP-së: IPv4 ruhet, IPv6 cungohet në /64 — klienti e kontrollon çdo bit të identifikuesit të ndërfaqes, prandaj një çelës i plotë do të lejonte krijimin e një buxheti të ri për çdo kërkesë.
  • Identitet i përbashkët: pas një CDN-je ose një proxy-je të padeklaruar me OWC_TRUSTED_PROXY, të gjithë vizitorët mbërrijnë me të njëjtën adresë. Atëherë buxheti ndahet për çdo vizitor, me një numërues më të gjerë mbi adresën e përbashkët. Ky është një kufi më i trashë: deklarojeni proxy-n tuaj.
  • Filtri owc_throttle_max( $max, $bucket, $window ) — kthimi i 0 e çaktivizon kufirin.
  • Kufizuesi dështon i hapur nëse cache-i i objekteve nuk është i disponueshëm: më mirë të mos kufizohet sesa të pengohet dikush t'i ushtrojë të drejtat e veta.

Rruga /consent në hollësi

  • headers_sent() lexohet e para nga të gjitha. Nëse dalja ka nisur tashmë, cookie-ja e serverit nuk mund të vendoset: rreshti shkruhet prapëseprapë dhe përgjigjja mbetet 200, me cookie_set: false dhe një përshkrues cookie (name, value, ttl, path, samesite, secure) që klienti e vendos vetë.
  • Kategoritë që faqja nuk i ofron kthehen brenda dropped_categories, jo shpërfillen në heshtje.
  • page_url validohet kundrejt hosteve të faqes, me rezervë te një Referer i validuar në të njëjtën mënyrë, përndryshe vargu bosh. Çelësi është gjithnjë i pranishëm, që regjistri të mos shkojë të kërkojë Referer-in e papërpunuar.
  • Nëse regjistri është aktiv dhe shkrimi refuzohet, cookie-ja anulohet dhe përgjigjja është një 503 owc_ledger_write_refused. Nuk ruhet asgjë, nuk lirohet asnjë gjurmues.
  • cookie_unreadable është telemetri e pastër: mbi të nuk zbatohet asnjë kontroll validimi, pikërisht që një fushë diagnostike të mos mund ta refuzojë kurrë një shkrim pëlqimi. Efekti i vetëm i saj është një shënim brenda regjistrit të refuzimeve.

Përgjigje tipike: {ok, state, dropped_categories, logged, cookie_set[, cookie]}. Fusha logged është null kur regjistri është i çaktivizuar.

Kodet e gabimit

KodiHTTPKuptimi
owc_bad_param400Parametër i pavlefshëm
owc_bad_categories400Objekt categories i keqformuar, shumë i madh ose joskalar
owc_bad_email400Adresë e-maili e pavlefshme
owc_bad_dsar400Dërgim DSAR i keqformuar (përfshirë kurthin për robotë)
owc_dsar_not_attested400Mungon vetëdeklarimi i nenit 12.6
owc_no_settings400Asnjë çelës cilësimi i njohur brenda trupit
owc_missing_origin403As origjinë, as token: dështim i mbyllur
owc_bad_origin403Origjina e deklaruar nuk është host i kësaj faqeje — përgjigjja rendit deri në dhjetë hoste të pranuar
owc_bad_nonce403Nonce i pavlefshëm mbi /scanner/ingest
owc_jsonp_forbidden403Formë JSONP e refuzuar mbi /nonce
owc_forbidden401/403Leje e pamjaftueshme
owc_dsar_disabled404Portali i të drejtave është i çaktivizuar nga ana e serverit
owc_no_template404Asnjë shabllon për këtë lloj dhe këtë profil
owc_rate_limited429U arrit kufiri i shpeshtësisë
owc_consent_failed500Dështim në zbatimin e pëlqimit
owc_dsar_store_failed500Dështim në shkrimin e kërkesës
owc_gen_failedi ndryshueshëmGjenerimi i dokumentit u refuzua (fusha që mungojnë, barrierë gjuhe)
owc_ledger_write_refused503Regjistri refuzoi të shkruajë — nuk regjistrohet asgjë, nuk zhbllokohet asgjë

Regjistri i refuzimeve

Njëzet refuzimet e fundit të shkrimit ruhen dhe shfaqen mbi panelin e kontrollit — vetëm nëse regjistri nuk është bosh. Aty dallohen dy natyra:

  • një zë me status HTTP është refuzim i vërtetë: nuk u ruajt asgjë dhe vizitori pa një gabim;
  • një zë me status 0 është paralajmërim: zgjedhja u regjistrua vërtet.

Paneli shfaq krah për krah hostin e deklaruar nga origjina dhe header-in Host të kërkesës. Është pikërisht kjo ajo që ndryshon kur vizitorët tuaj lëvizin mbi një host ndërsa WordPress-i është konfiguruar me një tjetër — shkaku më i shpeshtë i një pëlqimi që «nuk regjistrohet».

Kufijtë e API-së

  1. /consent dhe /dsar pranojnë shkrime anonime nga vetë ndërtimi; mbrojtja është origjina plus kufiri i shpeshtësisë, jo një nonce.
  2. Kufizuesi i shpeshtësisë dështon i hapur pa cache objektesh.
  3. Cookie-ja e pëlqimit është host-only: një cookie e vendosur për apex-in është e palexueshme nga një faqe www., dhe asnjë header CORS nuk mund ta ndreqë këtë. Zgjidhja është një URL shkrimi me të njëjtën origjinë.
  4. /scanner/ingest pranon vetëm manage_options: sonda nuk mund të vijë nga një vizitor.
  5. /settings nuk ka nonce të vetin: është manage_options plus kontrolli i nonce-it me cookie i bërthamës.

Referenca e cilësimeve

Të gjitha cilësimet rrinë brenda një opsioni të vetëm, owc_settings, të ngarkuar automatikisht meqë lexohet në çdo faqe publike.

Leximi dhe shkrimi në PHP

$cilesimet = OWC_Core::settings();               // cilësimet efektive (parazgjedhjet + të ruajturat + filtrat)
$profili   = OWC_Core::setting( 'compliance_profile' );
$i_papertypunuar = OWC_Core::stored_setting( 'compliance_profile' ); // shpërfill rishkrimin sipas vizitorit

OWC_Core::update_settings( array(
    'consent_renewal_months' => 6,
    'compliance_strict'      => true,
) );

update_settings() bashkon vetëm çelësat e dërguar mbi ata ekzistues, kurrë tërësinë e parazgjedhjeve. Kjo është ajo që i lejon rreshtit të opsionit të mbetet bosh sa kohë nuk keni personalizuar asgjë, dhe pra teksteve t'i ndjekin gjuhën e faqes.

Rezultati i settings() memoizohet, me një çelës të bazuar mbi tërësinë e callback-eve të filtrit owc_settings: një modul që e regjistron filtrin e vet pas leximit të parë e zhvlerëson memon në vend që të shpërfillet. Memoja zbrazet me çdo shkrim të opsionit.

Vlerat e parazgjedhura

[
    // Banneri
    'banner_enabled'            => true,
    'banner_position'           => 'bottom-bar',   // bottom-bar | bottom-card | center-modal | top-bar
    'banner_style'              => 'auto',         // auto | light | dark
    'banner_accept_all'         => true,
    'banner_reject_all'         => true,
    'banner_preferences'        => true,
    'banner_close_x'            => false,          // kryqi = refuzim i nënkuptuar
    'banner_show_logo'          => true,
    'text_title'                => 'We use cookies',
    'text_message'              => 'We use cookies to personalise content, measure audience, '
                                 . 'and provide social media features. You can accept or reject, '
                                 . 'and change your choice at any time.',
    'text_accept_all'           => 'Accept all',
    'text_reject_all'           => 'Reject all',
    'text_preferences'          => 'Customize',
    'text_save'                 => 'Save my choices',

    // Butoni pluskues
    'floating_button_enabled'   => true,
    'floating_button_position'  => 'bottom-left',
    'floating_button_style'     => 'pill',
    'floating_button_label'     => 'Cookies',

    // Pëlqimi
    'consent_renewal_months'    => 12,             // 0 kthehet në 13, jo në «kurrë»
    'consent_policy_hash_check' => true,

    // Përputhshmëria
    'compliance_profile'        => 'gdpr',
    'compliance_strict'         => true,
    'geo_enabled'               => false,
    'geo_default_profile'       => 'gdpr',
    'geo_mmdb_enabled'          => false,

    // IAB TCF v2.2
    'tcf_enabled'               => false,
    'tcf_cmp_id'                => 0,
    'tcf_publisher_country'     => 'FR',
    'tcf_publisher_purposes_li' => [],
    'tcf_special_features'      => [],

    // CCPA / GPC
    'ccpa_inject_footer'        => true,
    'gpc_honor'                 => true,

    // Google Consent Mode v2
    'gcm_enabled'               => true,
    'gcm_ads_data_redaction'    => true,
    'gcm_url_passthrough'       => true,

    // Kategoritë
    'cat_necessary_available'   => true,
    'cat_functional_available'  => true,
    'cat_analytics_available'   => true,
    'cat_marketing_available'   => true,
    'cat_preferences_available' => true,
    'cat_social_available'      => true,
    'cat_necessary_label'       => 'Necessary',
    'cat_necessary_desc'        => 'Strictly required for the site to function …',
    'cat_functional_label'      => 'Functional',
    'cat_functional_desc'       => 'Enhance the experience (chat, embedded videos, maps) …',
    'cat_analytics_label'       => 'Statistics',
    'cat_analytics_desc'        => 'Help us understand how you use the site (anonymously) …',
    'cat_marketing_label'       => 'Marketing',
    'cat_marketing_desc'        => 'Enable us to show you ads and content tailored …',
    'cat_preferences_label'     => 'Preferences',
    'cat_preferences_desc'      => 'Remember your interface choices (layout, saved filters).',
    'cat_social_label'          => 'Social & embeds',
    'cat_social_desc'           => 'Allow embedded social content (YouTube, Instagram, X) to load.',

    // Regjistri
    'ledger_enabled'            => true,
    'ledger_retention_days'     => 1825,           // 5 vjet; 0 = e pakufizuar
    'ledger_hash_algo'          => 'sha256',

    // Skaneri
    'scanner_enabled'           => false,
    'scanner_frequency'         => 'weekly',
    'scanner_alert_email'       => '',
    'scanner_max_urls'          => 25,
    'scanner_timeout'           => 8,
    'scanner_probe_mode'        => 'admins',

    // Portali i të drejtave
    'dsar_enabled'              => true,
    'dsar_email'                => '',
    'dsar_response_days'        => 30,
    'dsar_notify_email'         => '',
    'dsar_token_ttl_days'       => 7,

    // Bllokimi
    'blocker_unknown_script_policy' => 'allow',
    'blocker_unknown_iframe_policy' => 'block',
    'blocker_allowlist'             => '',         // një host për rresht
    'blocker_block_resource_hints'  => true,

    // Integrimi dhe cikli i jetës
    'forms_integration_enabled' => true,
    'auto_footer_menu_inject'   => false,
    'delete_data_on_uninstall'  => false,

    // Identiteti ligjor
    'legal_company_name'         => '',
    'legal_company_legal_form'   => '',
    'legal_company_capital'      => '',
    'legal_company_address'      => '',
    'legal_company_email'        => '',
    'legal_company_phone'        => '',
    'legal_country'              => 'FR',
    'legal_company_reg_number'   => '',
    'legal_company_reg_place'    => '',
    'legal_company_vat'          => '',
    'legal_publication_director' => '',
    'legal_eu_representative'    => '',
    'legal_host_name'            => '',
    'legal_host_address'         => '',
    'legal_host_phone'           => '',
    'legal_host_url'             => '',
    'legal_profession_body'      => '',
    'legal_profession_title'     => '',
    'legal_profession_state'     => '',
    'legal_profession_rules'     => '',
    'legal_mediator_name'        => '',
    'legal_mediator_address'     => '',
    'legal_mediator_url'         => '',
    'legal_dpo_name'             => '',
    'legal_dpo_email'            => '',
    'legal_dpa_authority'        => '',            // bosh me qëllim: nxirret nga shteti + profili
    'legal_transfer_countries'   => '',
    'legal_third_parties_note'   => '',
    'legal_automated_decisions'  => false,
    'legal_automated_decisions_desc' => '',
    'legal_minor_age'            => 15,
    'legal_data_provision_note'  => '',
    'legal_currency'             => 'EUR',
    'legal_tax_label'            => 'TTC',
    'legal_business_type'        => 'auto',
    'retention_form_data_days'   => 1095,
    'retention_dsar_days'        => 1095,
    'policy_disclaimer'          => true,

    // Lidhjet
    'link_privacy_policy'        => '',
    'link_cookie_policy'         => '',
    'link_terms'                 => '',
    'link_legal_notice'          => '',
]

Listat e mbyllura

Një vlerë jashtë listës sillet te parazgjedhja.

CilësimiVlerat e pranuara
banner_positionbottom-bar, bottom-card, center-modal, top-bar
banner_styleauto, light, dark
floating_button_positionbottom-left, bottom-right, top-left, top-right
floating_button_styleicon, pill
compliance_profile, geo_default_profilegdpr, ccpa, lgpd, popia, pipl, dpdp, quebec, uk_pecr, ch_nfadp, au, us_generic
ledger_hash_algosha256, sha3-256 (të prera me atë që mbështet PHP-ja)
scanner_frequencyhourly, twicedaily, daily, weekly
scanner_probe_modeadmins, off
legal_business_typeauto, vitrine, rental, ecommerce, services, saas, content
blocker_unknown_script_policy, blocker_unknown_iframe_policyallow, block

Kufijtë e numrave të plotë

CilësimiKufijtë
consent_renewal_months0 deri 13 (0 trajtohet si 13)
dsar_response_days1 deri 30
dsar_token_ttl_days1 deri 90
ledger_retention_days0 deri 3650 (0 = e pakufizuar)
scanner_max_urls1 deri 500
scanner_timeout1 deri 60
legal_minor_age13 deri 18
retention_form_data_days1 deri 3650
retention_dsar_days1 deri 3650
tcf_cmp_id0 deri 4095

Pastrimi i vlerave

  • text_message është e vetmja fushë me HTML të pasur; ajo pranon HTML-në e lejuar brenda një artikulli WordPress, dhe banneri renderon në fund vetëm <a href target rel>.
  • Fusha me shumë rreshta: legal_company_address, legal_eu_representative, legal_host_address, legal_mediator_address, legal_third_parties_note, legal_automated_decisions_desc, legal_data_provision_note, blocker_allowlist, dhe çdo çelës që mbaron me _desc.
  • URL: çdo çelës me prefiksin link_ ose me prapashtesën _url, plus legal_profession_rules.
  • Adresa e-maili: çdo çelës që përmban email.
  • Gjithçka tjetër: tekst i thjeshtë.
  • Një vlerë joskalare e dërguar mbi një cilësim skalar shpërfillet, çelësi nuk shkruhet.

Ku rregullohet çfarë

SkedaCilësimet
Bannerbanner_*, text_*, floating_button_*, consent_renewal_months, consent_policy_hash_check
Compliancecompliance_profile, compliance_strict, gcm_*, blocker_*, ccpa_inject_footer, gpc_honor, tcf_*, geo_*, auto_footer_menu_inject, forms_integration_enabled, delete_data_on_uninstall, link_*
Legal identitylegal_*, retention_form_data_days, retention_dsar_days, policy_disclaimer
Categoriescat_*_available, cat_*_label, cat_*_desc
Audit ledgerledger_enabled, ledger_retention_days (algoritmi shfaqet, nuk modifikohet)
Scannerscanner_*
DSAR requestsdsar_*

Tabelat

TabelaPërmbajtja
{prefix}owc_ledgerRegjistri i pëlqimeve, i lidhur në zinxhir
{prefix}owc_dsarKërkesat për ushtrimin e të drejtave
{prefix}owc_scannerGjetjet e skanerit
{prefix}owc_scriptsKatalogu i firmave të bllokimit
{prefix}owc_form_linksLidhjet pëlqim ↔ dërgim OW Forms

Një ndihmës PHP owc_table( 'ledger' | 'dsar' | 'scanner' | 'scripts' ) e rillogarit emrin nga prefiksi aktual: përdoreni brenda një switch_to_blog(), meqë konstantet janë të ngurtësuara për gjithë kohëzgjatjen e kërkesës.

Opsione dhe transient-e të tjera

Opsionet: owc_settings, owc_version, owc_pending_upgrade, owc_upgrade_lock, owc_ledger_head, owc_ledger_trim, owc_ledger_key_source, owc_scanner_secret, owc_scanner_lock, owc_scanner_queue, owc_scanner_status, owc_scanner_alerted, owc_scanner_probe_status, owc_scanner_manual, owc_refusal_log, owc_tcf_status, owc_tcf_gvl_version, owc_forms_db_version, plus flamujt e migrimit (owc_catalog_sanitized_v2, owc_match_target_migrated_v1, owc_ledger_hmac_migrated_v1, owc_inline_sig_labels_cleaned_v1, owc_scanner_secret_rotated_v1).

Transient-et: owc_catalog_<version>, owc_invalid_patterns, owc_gvl_cache, owc_gvl_stub, owc_gvl_etag, owc_gvl_retry, owc_mmdb_<hash>, owc_policies_hash, owc_site_analysis, owc_scanner_last_run, owc_scanner_run_result, owc_scanner_pruned, owc_scanner_fail_alerted, owc_ledger_verify_result, owc_ledger_write_error, owc_policy_gen_result, owc_dsar_sla_alert, owc_dsar_admin_result, dhe numëruesit e kufizimit të shpeshtësisë.

Konstantet e njohura në wp-config.php

KonstantjaEfekti
OWC_LEDGER_KEYÇelësi HMAC i regjistrit, si dhe çelësi i nxjerrë për cookie-n e zbulimit rajonal
OWC_TRUSTED_PROXY / OWC_TRUSTED_PROXIESIntervalet CIDR të proxy-ve të besuar; pa to, header-at e IP-së së klientit shpërfillen
OWC_GEO_TRUSTED_HEADERScloudflare, cloudfront, proxy ose all
OWC_BEHIND_CLOUDFLAREShkurtore për header-in e shtetit të Cloudflare-it
OWC_BEHIND_CLOUDFRONTShkurtore për header-in e shtetit të CloudFront-it

Hook-et për zhvilluesit

Filtrat

FiltriRoli
owc_settingsCilësimet efektive. Përgjigjja duhet të varet nga diçka e qëndrueshme për gjithë kërkesën
owc_banner_textsTekstet e bannerit
owc_bootstrap_configKonfigurimi statik i shtypur në <head>kurrë të dhëna sipas vizitorit
owc_scripts_catalogRreshtat e katalogut para validimit
owc_blocker_allowlistHoste që nuk bllokohen kurrë
owc_scanner_urlsURL që duhen shfletuar (rikufizohen pastaj te hosti i faqes)
owc_throttle_maxBuxheti i një kufiri shpeshtësie; 0 e çaktivizon
owc_allowed_request_hostsHostet e pranuar për një shkrim publik
owc_allow_headerless_writeNgre dështimin e mbyllur mbi shkrimet pa origjinë (parazgjedhja false)
owc_geo_mmdb_pathShtegu i bazës MaxMind
owc_tcf_purpose_mapPërputhja kategori → qëllime TCF
owc_tcf_stub_configKonfigurimi statik i stub-it TCF
owc_policy_templateTrupi i papërpunuar i një shablloni — e çaktivizon kyçin e gjuhës
owc_policy_varsVariablat e një dokumenti
owc_policy_htmlHTML-ja përfundimtare e një dokumenti
owc_dsar_typesLlojet e kërkesave të propozuara dhe të pranuara
owc_dsar_form_noticeNjoftimi informues nën formular
owc_dsar_export_bundlePërmbajtja e pakos së transportueshmërisë
owc_dsar_show_fulfilment_panelShfaqja e panelit të ekzekutimit

Veprimet

VeprimiNënshkrimi
owc_consent_updated( array $categories, string $event, string $source )
owc_consent_cookie_not_sent( array $cookie, string $event )
owc_ledger_lock_failed( string $event, string $token )
owc_ledger_write_failed( $error, string $event, string $token )
owc_ledger_anchor( array $anchor )
owc_ledger_pruned( int $deleted, int $days )
owc_catalog_updated
owc_gpc_honored( array $categories )
owc_tcf_inactive( string $reason )
owc_dsar_submitted( string $type, string $email, string $message )
owc_dsar_verified( int $id, array $row )
owc_dsar_fulfilled( int $id, string $what, $trace )
owc_dsar_mail_failed( int $id, string $email, string $kind )

Cron-et: owc_daily_maintenance, owc_ledger_retention, owc_scanner_run, owc_scanner_run_batch, owc_tcf_refresh_gvl, owc_run_upgrade.

Ndërkombëtarizimi

Domeni i përkthimit është ow-consent, shtegu /languages. Gjuha burimore është anglishtja. Paketa përfshin shabllonin ow-consent.pot dhe një përkthim të plotë frëngjisht.

Kujtesë e mekanizmit të përshkruar më lart: për sa kohë një etiketë ose një tekst banneri nuk personalizohet brenda cilësimeve, ai ndjek gjuhën e faqes. Sapo të shkruani vlerën tuaj, ajo shërbehet ashtu siç është, pavarësisht gjuhës së vizitorit.

Trupat e dokumenteve ligjore nuk kalojnë nga ky mekanizëm: gjuha e tyre ndjek juridiksionin, kurrë lokalen e administratorit.


Zgjidhja e problemeve

Banneri nuk shfaqet

Kalojeni listën me radhë:

  1. A është banner_enabled i aktivizuar? Distinktivi në krye të ekranit të administrimit e thotë.
  2. A i thërret tema juaj wp_head() dhe wp_footer()? Pa to, banneri refuzon të shtypet, në vend që të prodhojë kod inert.
  3. A ka bërë tashmë ndonjë zgjedhje vizitori? Banneri shfaqet vetëm mbi <html data-owc="none">. Provojeni në shfletim privat ose me window.OWCBanner.reset().
  4. A e ka vizitori JavaScript-in? Pa të, banneri mbetet i fshehur — me qëllim — dhe blloku <noscript> e merr rolin.
  5. A po shërben një cache faqesh një version para aktivizimit? Zbrazeni.

Banneri kthehet në çdo faqe ndonëse zgjedhja u regjistrua

Tri shkaqe, sipas radhës së shpeshtësisë.

  1. Hosti ku ndodhet vizitori ndryshon nga hosti i konfiguruar në WordPress (www. kundrejt apex-it, alias, domen preprodhimi). Atëherë shfletuesi refuzon ta ruajë cookie-n ndërsa WordPress-i përgjigjet me 200. Hapni panelin e kontrollit: regjistri i refuzimeve shfaq krah për krah origjinën dhe header-in Host. Zgjidhja është ta shërbeni faqen mbi një host të vetëm kanonik.
  2. consent_policy_hash_check është aktiv dhe dokumentet tuaja kanë ndryshuar — kjo është sjellja e dëshiruar, vizitori ripyetet pas një ndryshimi politike.
  3. Jeni në një version para 1.4.3-shit. Atëherë cookie-ja kodohej dy herë dhe shfletuesi nuk arrinte ta rilexonte, ndërsa serveri e lexonte fare mirë. Përditësoni: cookie-t e shkruara para korrigjimit mbeten të lexueshme.

«Zgjedhja juaj nuk u regjistrua dot» — gabimi refused ose 403

Shikoni data-owc-code mbi elementin e mesazhit, ose regjistrin e refuzimeve të panelit të kontrollit.

  • owc_bad_origin: origjina e deklaruar nuk është host i njohur. Përgjigjja i rendit hostet e pranuar. Nëse faqja juaj arrihet legjitimisht me disa emra, shtojini me filtrin owc_allowed_request_hosts.
  • owc_missing_origin: as origjinë, as token. Zakonisht është një shtesë privatësie që i heq header-at, ose një proxy që i rishkruan.
  • owc_bad_nonce: ka të bëjë vetëm me sondën e skanerit, jo me shkrimin e pëlqimit — nonce-i nuk është kurrë veto mbi /consent.

Gabimi ratelimit — 429

Kufijtë janë qëllimisht të ulët mbi shkrimet publike. Dy shkaqe:

  1. Një CDN ose një proxy i padeklaruar: të gjithë vizitorët tuaj mbërrijnë me të njëjtën adresë dhe ndajnë të njëjtin buxhet. Deklarojeni me OWC_TRUSTED_PROXYwp-config.php.
  2. Një test i automatizuar që dërgon më shumë se 30 shkrime në 5 minuta nga e njëjta adresë.

Një 503 owc_ledger_write_refused

Regjistri refuzoi të shkruajë, prandaj nuk u regjistrua asgjë dhe nuk u lirua asnjë gjurmues. Kjo është sjellja e dëshiruar: një pëlqim që nuk mund të provohet nuk duhet pretenduar.

  1. Kontrolloni që tabela {prefix}owc_ledger ekziston. Skeda Audit ledger shfaq një mesazh të lexueshëm «ende i painstaluar» në vend të një ekrani të bardhë.
  2. Kontrolloni të drejtat e shkrimit të përdoruesit MySQL.
  3. Si zgjidhje e fundit, çaktivizoni përkohësisht ledger_enabled për ta rikthyer shërbimin — duke ditur se gjatë kësaj kohe e humbni provën.

Ka ende gjurmues që ngarkohen para pëlqimit

  1. A është compliance_strict i aktivizuar? Pa të, trajtohen vetëm skriptet e vendosura në radhë nga WordPress-i.
  2. A ndodhet gjurmuesi në katalog? Një skript i panjohur i palës së tretë lejohet si parazgjedhje. Nisni një shfletim, klasifikoni gjetjen: kjo e shkruan rregullin e bllokimit.
  3. A injektohet nga JavaScript first-party? Mbrojtja dinamike mbulon vetëm njëzet hoste. Shtoni një rregull katalogu mbi domenin e gjurmuesit.
  4. A është një cookie e vendosur me header-in Set-Cookie? Asnjë bllokim nga ana e klientit nuk mund ta ndalë. Duhet trajtuar në burim, nga ana e serverit.
  5. Kalojeni blocker_unknown_script_policyblock — e pastaj testojeni faqen me kujdes, sepse ky cilësim bllokon çdo palë të tretë të panjohur.

Një integrim legjitim është i bllokuar

Shtoni hostin e tij në blocker_allowlist, një për rresht, ose me filtrin owc_blocker_allowlist. Kontrolloni edhe blocker_unknown_iframe_policy: iframe-t e panjohura bllokohen si parazgjedhje, është rasti më i shpeshtë.

Nëse integrimi duhet të mbetet i kushtëzuar nga pëlqimi, klasifikojeni më mirë në kategorinë e duhur: zëvendësuesi vizual mbart një buton «Prano …» që e zhbllokon me një klikim.

Skaneri nuk gjen asgjë

  1. A është i aktivizuar? Ai është i çaktivizuar si parazgjedhje.
  2. A punon WP-Cron? Me DISABLE_WP_CRON dhe pa cron sistemi, shfletimi i planifikuar nuk niset kurrë. Nisni një me dorë për të kontrolluar.
  3. A është i mundur loopback-u HTTP? Një autentikim HTTP preprodhimi ose një mur zjarri e bllokon shfletimin. Paneli i mbulimit shfaq gabimin e parë.
  4. Shfletimi nga serveri nuk ekzekuton asnjë JavaScript. Vizitoni një faqe të sajtit si administrator i kyçur që sonda të raportojë atë që injekton një menaxher etiketash.

Në çdo rast, lexoni panelin «çfarë mbulon vërtet ky shfletim» para se të nxirrni përfundime: ai e dallon «nuk u gjet asgjë» nga «nuk u lexua asgjë».

Gjenerimi i një dokumenti refuzohet

Dy shkaqe të mundshme, dhe mesazhi e thotë:

  • Ka fusha të detyrueshme bosh — shfaqet lista e çelësave që mungojnë. Plotësoni skedën Legal identity.
  • Barrierë gjuhe — po kërkoni një njoftim ligjor ose kushte të përgjithshme për një juridiksion jofrëngjishtfolës. Në këtë rast butoni fshihet. Rruga e vetme është të jepni trupin tuaj përmes filtrit owc_policy_template.

E-maili i verifikimit DSAR nuk mbërrin

Është pothuajse gjithnjë çështje dërgueshmërie, jo e shtojcës.

  1. Përgjigjja e API-së mbart mail_sent: false kur dërgimi ka dështuar, dhe formulari shfaq atëherë një mesazh të dedikuar që dërgon te adresa e kontaktit.
  2. Instaloni një shtojcë SMTP. Funksioni mail() i PHP-së refuzohet nga shumica e serverëve marrës.
  3. Kontrolloni SPF-në, DKIM-in dhe DMARC-un e domenit tuaj. Shtojca nuk e rishkruan kurrë adresën e dërguesit — kjo është ajo që do ta thyente SPF-në — ajo vendos vetëm një Reply-To.
  4. Kontrolloni që dsar_email të jetë adresë e vlefshme.

Për sa kohë e-maili nuk merret e nuk konfirmohet, kërkesa mbetet pending dhe afati ligjor nuk niset.

Moduli TCF nuk aktivizohet

Hapni skedën Compliance: një njoftim administrimi e emërton shkakun.

  • missing_cmp_id: tcf_cmp_id është 0. Duhet të merrni një CMP ID pranë IAB Europe; shtojca nuk jep asnjë dhe refuzon të lëshojë një varg me identifikuesin 0.
  • CMP ID mbi 4095: vlera nuk hyn brenda fushës 12-bitëshe të vargut dhe do të tregonte një CMP tjetër.
  • no_gvl: Global Vendor List-i nuk është shkarkuar ende. Ai vjen me një cron ditor; kontrolloni që WP-Cron-i të punojë dhe që serveri juaj të mund të arrijë vendor-list.consensu.org me HTTPS dalës.

Të gjithë vizitorët marrin profilin e konfiguruar, pavarësisht zbulimit rajonal

  1. A është geo_enabled i aktivizuar? Ai është i çaktivizuar si parazgjedhje.
  2. A e keni deklaruar proxy-n tuaj? Pa OWC_BEHIND_CLOUDFLARE, OWC_BEHIND_CLOUDFRONT ose OWC_GEO_TRUSTED_HEADERSwp-config.php, header-at e shtetit shpërfillen, sepse janë të falsifikueshëm.
  3. A ndodhet skedari MaxMind në vend? Shtojca nuk e shkarkon dhe nuk ofron ekran ngarkimi.
  4. Ndoshta është normale: shfaqja e parë e një vizitori të shërbyer nga cache-i përdor profilin e konfiguruar sa kohë cookie-ja 24-orëshe nuk ekziston. Paneli i kontrollit shfaq një bllok diagnostikimi me shtetin e zbuluar, profilin e zbatuar dhe burimin.

Administrimi sinjalizon se çelësi i regjistrit jeton në bazë

Ky është njoftimi notice_ledger_key. Ai do të thotë se AUTH_KEY dhe AUTH_SALT nuk janë në wp-config.php — atëherë WordPress-i i ruan në bazë — dhe se as OWC_LEDGER_KEY nuk është e përcaktuar. Zinxhiri vazhdon të ndërtohet, por kushdo që ka qasje në bazë mund ta rinënshkruajë: pretendimi i pafalsifikueshmërisë nuk qëndron më.

Zgjidhja është të shtoni OWC_LEDGER_KEY (dhe, meqë jeni aty, AUTH_KEY e AUTH_SALT) në wp-config.php. Verifikimi pastaj e dallon një rotacion çelësi nga një rishkrim, prandaj ky ndryshim nuk ua zhvlerëson historikun.

Shtojca nuk bën asgjë fare, me një njoftim të kuq

WordPress-i juaj është më i vjetër se 6.2. Shtojca refuzon të niset, dhe njoftimi thotë shprehimisht se asgjë nuk bllokohet dhe se asnjë pëlqim nuk regjistrohet. Përditësoni WordPress-in, ose çaktivizoni shtojcën dhe hiqni bannerin nga faqet tuaja ndërkohë.

Ka rregulla katalogu që «nuk mund të aktivizohen»

Një njoftim administrimi i sinjalizon, dhe skeda Tracker catalogue ka një filtër të dedikuar. Katër arsye të mundshme: model bosh ose i përbërë vetëm nga karaktere të padukshme, shprehje e rregullt që nuk kompilohet ose që bën backtracking katastrofik, model shumë i shkurtër dhe pa pikë për të synuar një URL, ose kategori që nuk ekziston më në faqe. Korrigjojini ose fshijini këta rreshta: ata japin një përshtypje të rreme mbulimi.


FAQ

A punon shtojca pas një cache faqesh? Po, dhe gjithë arkitektura e saj është ndërtuar rreth këtij kushti. HTML-ja e prodhuar është e njëjtë për të gjithë vizitorët; pëlqimi lexohet brenda shfletuesit dhe zbatohet para renderimit të parë. Asnjë nonce nuk shtypet brenda HTML-je të cache-ueshme. Vetëm përgjigjet vërtet personale shënohen si të pacache-ueshme.

A zëvendëson një CMP me pagesë? Në shumicën e faqeve, ai mbulon të njëjtin terren: banner, bllokim, ditar auditimi, kërkesa të drejtash, drejtim gjeografik dhe dokumente të gjeneruara. Dy gjëra që nuk i bën: nuk është një CMP i regjistruar pranë IAB Europe, dhe nuk jep as këshillë juridike, as dokumente të rishikuara — gjeneruesi prodhon drafte që duhet t'i çoni për miratim.

A është regjistri i pafalsifikueshëm? Ai e nxjerr në pah çdo ndërhyrje, me një kusht. Çdo rresht nënshkruhet me HMAC mbi hash-in e të mëparshmit: një rresht i modifikuar ose i fshirë e këput zinxhirin dhe verifikimi thotë se ku. Garancia mbështetet mbi faktin që çelësi i nënshkrimit jeton jashtë bazës. Kështu ndodh nëse AUTH_KEY dhe AUTH_SALT janë në wp-config.php, ose nëse përcaktoni OWC_LEDGER_KEY. Përndryshe, WordPress-i i ruan salt-et në bazë dhe një sulmues që hyn atje do të mund ta rinënshkruante zinxhirin — shtojca e zbulon këtë situatë dhe ju paralajmëron.

A e ngadalëson skaneri faqen? Jo. Ai është i çaktivizuar si parazgjedhje, dhe pasi aktivizohet punon mbi WP-Cron me shpeshtësinë që zgjidhni ju, duke marrë një mostër të faqeve tuaja nga ana e serverit. Ai nuk ekzekutohet kurrë gjatë vizitës së një vizitori.

A i gjen skaneri cookie-t? Pjesërisht, dhe kjo është e rëndësishme të kuptohet. Shfletimi nga serveri lexon header-at Set-Cookie të faqeve tuaja: pra i gjen cookie-t e vendosura nga serveri, përfshirë ato HttpOnly. Ai nuk ekzekuton asnjë JavaScript, prandaj cookie-t e shkruara nga skriptet brenda shfletuesit nuk i janë të dukshme; ato mblidhen nga një sondë që punon vetëm për një administrator të kyçur. Trajtojeni rezultatin si inventar të asaj që u pa, jo si listë shteruese — të dy ekranet e thonë këtë, në vend që t'ju lënë të supozoni të kundërtën.

Si ekzekutohet një kërkesë të drejtash? Personi e dërgon formularin dhe merr një e-mail verifikimi. Konfirmimi i kërkesës mbi faqen e lidhur e nis afatin e nenit 12.3 dhe hap një kërkesë vendase të WordPress-it. Nga ekrani DSAR ju shkarkoni një eksport JSON të prodhuar nga të gjithë eksportuesit e regjistruar në faqe, nisni të gjithë fshirësit, dhe e mbyllni me një përgjigje me shkrim që mbetet e bashkangjitur me kërkesën. Prandaj ajo që mbulon eksporti varet nga shtojcat e instaluara; ato që nuk regjistrojnë asnjërin prej këtyre hook-eve duhen trajtuar me dorë.

A mund ta përdor modulin TCF për AdSense ose Ad Manager? Vetëm me CMP ID-në tuaj të lëshuar nga IAB Europe, dhe edhe atëherë me një rezervë. Pa CMP ID, moduli nuk ngarkohet fare. Me një CMP ID, ai lëshon një varg TC të koduar si duhet dhe paneli shfaq çdo qëllim e çdo veçori speciale që ky varg mund të pretendojë — por politika e TCF-së i kërkon një CMP-je të regjistruar zgjedhje në nivel qëllimi dhe në nivel ofruesi. Këtu çelësat e qëllimeve ndjekin kategoritë dhe nuk ka asnjë zgjedhje ofruesi: ky nuk është një CMP i regjistruar, dhe ofruesit kanë të drejtë ta refuzojnë sinjalin e tij. Nëse të ardhurat reklamuese nën TCF kanë peshë për faqen tuaj, përdorni një CMP të certifikuar.

Në cilën gjuhë gjenerohen dokumentet? Politika e privatësisë dhe politika e cookie-ve ekzistojnë për të njëmbëdhjetë profilet, në gjuhën e juridiksionit: anglisht, frëngjisht për Francën, Belgjikën, Luksemburgun dhe Kebekun, portugalisht për Brazilin. Njoftimi ligjor dhe kushtet e përgjithshme ekzistojnë vetëm në frëngjisht; për çdo juridiksion tjetër, gjeneruesi refuzon t'i prodhojë në vend që të publikojë një dokument të papërshtatshëm.

Çfarë mund të ndryshoj te banneri? Katër pozicione, një temë e çelët, e errët ose automatike, një logo opsionale, etiketat, dhe një buton pluskues rihapjeje. Çdo element që mbart klasën owc-open-preferences e rihap panelin. «Refuzoji të gjitha» renderohet me të njëjtën spikatje si «Pranoji të gjitha». Kryqi i mbylljes është i çaktivizuar si parazgjedhje; i aktivizuar, ai regjistron një refuzim të plotë, kurrë një mbyllje në heshtje. Paneli përdoret me tastierë, çelësat e tij mbartin një gjendje të dukshme, dhe modalja e kap e pastaj e kthen fokusin. Tekstet janë të përkthyeshme dhe të zëvendësueshme me filtrin owc_banner_texts.

Çfarë bllokon saktësisht bllokimi automatik? Skriptet e palëve të treta, fragmentet inline të gjurmimit, iframe-t, pikselat matës, fletët e stileve analytics dhe marketing, si dhe burimet e mediave të palëve të treta rishkruhen para pëlqimit dhe lirohen më pas, sipas radhës së dokumentit. Sugjerimet e burimeve drejt një pale të tretë të katalogueshme fshihen në vend që të shtyhen, meqë një sugjerim hap një lidhje dhe nuk ka asgjë për t'u rikthyer. Fletët dhe fontet e shërbyera nga një host i klasifikuar funksional lihen të paprekura. Atributet e ngarkimit me përtaci të shtojcave të cache-it neutralizohen që një ngarkues të mos rikthejë një URL të bllokuar. Shtojca sjell 175 firma, të redaktueshme nga ekrani Tracker catalogue dhe të zgjerueshme me filtër.

Çfarë regjistrohet në regjistër? Çdo veprim pëlqimi — pranim, refuzim, ruajtje e pjesshme, opt-out GPC, rinovim, tërheqje — i shtohet tabelës së zinxhirtë. Një rresht përmban një IP të pseudonimizuar, një hash të user-agent-it, URL-në e faqes, profilin e përputhshmërisë, një hash të dokumenteve në fuqi, një hash të bannerit që u shfaq vërtet dhe versionin e shtojcës — elementet që lejojnë të rindërtohet çfarë pa vizitori.

Çfarë mbrojtjesh ka formulari i të drejtave? Një kurth për robotë, një afat minimal plotësimi, një vetëdeklarim i detyrueshëm i kontrolluar nga ana e serverit, tre kufij të veçantë shpeshtësie, një token për një përdorim të vetëm i ruajtur vetëm si hash, dhe një konfirmim që kërkon një veprim të shprehur mbi faqen — në mënyrë që një skaner lidhjesh poste të mos konfirmojë dot një identitet në vend të personit. Një kërkesë autori i së cilës nuk e ka konfirmuar kurrë identitetin nuk mund as të eksportohet, as të fshihet, as të shënohet si e përmbushur, dhe ky kontroll zbatohet nga ana e serverit, jo thjesht duke fshehur butona.

Cilat sinjale të Google Consent Mode v2 lëshohen? Të shtatë: ad_storage, ad_user_data, ad_personalization, analytics_storage, functionality_storage, personalization_storage dhe security_storage. Gjashtë kategoritë u lidhen atyre nga një burim i vetëm i së vërtetës, kështu që banneri, bllokimi dhe bootstrap-i nuk mund të divergojnë.

Si trajtohen opt-out-i CCPA dhe GPC-ja? Një kontroll «Do Not Sell or Share» injektohet në fundfaqe ose vendoset me shortcode. Klikimi i parë e regjistron opt-out-in, siç e kërkojnë rregulloret kaliforniane, në vend që të hapë një panel. Sinjali Global Privacy Control trajtohet si opt-out detyrues nën profilet amerikane, një herë për çdo sesion shfletimi, dhe vizitori njoftohet nëse ai ka zëvendësuar një zgjedhje që ai e kishte regjistruar. Nën profilet e familjes GDPR, GPC-ja trajtohet si tregues: kategoritë opsionale para-refuzohen brenda ndërfaqes, banneri mbetet i shfaqur, dhe nuk regjistrohet asgjë — sepse aty pëlqimi duhet të jetë veprim pozitiv.

Cilat cookie vendos vetë shtojca? Të gjitha janë cookie të brendshme, asnjëra nuk shërben për gjurmim, dhe të gjitha deklarohen brenda politikës së gjeneruar të cookie-ve: owc_consent (zgjedhjet, tokeni pseudonim i shfletuesit dhe profili; kohëzgjatja sipas cilësimit të rinovimit, 12 muaj si parazgjedhje, me tavan 13), owc_geo (shteti dhe profili i zbuluar, 24 orë, pa asnjë adresë IP), owc_gpc (shënues sesioni), owc_gpc_notice (5 minuta), dhe euconsent-v2 (vargu TCF, vetëm nëse moduli është aktiv dhe pas një veprimi të vizitorit).

A punon në multisite? Po. Çdo faqe e rrjetit ka tabelat e veta dhe cilësimet e veta. Një aktivizim rrjeti i shfleton të gjitha faqet vetëm nëse rrjeti ka jo më shumë se 200; përtej kësaj, çdo faqe furnizohet në kërkesën e saj të parë.

Po nëse e fshij shtojcën? Regjistri, gjetjet e skanerit, katalogu, lidhjet me OW Forms, opsionet dhe cilësimet mbijetojnë si parazgjedhje. Dy gjëra ikin gjithnjë, pavarësisht cilësimit tuaj: gjashtë detyrat e planifikuara, dhe tabela e kërkesave të të drejtave — është e vetmja që përmban të dhëna personale drejtpërdrejt identifikuese për palë të treta, dhe sapo shtojca të ketë ikur, asgjë nuk ia kufizon më ruajtjen dhe asnjë ekran nuk lejon t'u përgjigjeni. Eksportoni kërkesat tuaja para se ta fshini shtojcën. Për një pastrim të plotë të pjesës tjetër, aktivizoni «Delete all data on uninstall» para fshirjes.

Ku gjendet mbështetja?