Canlı · durum OK
Dokümantasyon · OW Consent v1.4.3

OW Consent
Dokümantasyon

İzleyicileri tıklamadan sonra değil, tıklamadan önce engelleyen WordPress rıza yönetimi.

v1.4.3GPL-2.0-or-laterDokümantasyon

OW Consent — Dokümantasyon

WordPress'te eksiksiz rıza yönetimi: çok yargı bölgeli banner, izleyici engelleme, tarama aracı, yasal belgeler, kanıt defteri ve haklar portalı. Yazar: OptionWeb — Julien Daniel Eklenti sayfası: https://optionweb.dev/tr/addons/ow-consent/ Lisans: GPL-2.0-or-later Bu belgenin kapsadığı sürüm: 1.4.3


İçindekiler

  1. Genel bakış
  2. Kurulum
  3. Hızlı başlangıç
  4. On bir uyumluluk profili
  5. Çerez kategorileri
  6. Banner
  7. Otomatik engelleme
  8. İzleyici tarama aracı
  9. Yasal belge üreteci
  10. Rıza kayıt defteri
  11. Haklar portalı (DSAR)
  12. CCPA opt-out'u: “Do Not Sell or Share”
  13. Google Consent Mode v2
  14. IAB TCF v2.2
  15. Global Privacy Control
  16. Bölgesel tespit
  17. OW Forms entegrasyonu
  18. Yüzen düğme
  19. Kısa kodlar
  20. REST API
  21. Ayar referansı
  22. Sorun giderme
  23. SSS

Genel bakış

OW Consent, WordPress için bir rıza yönetimi paketidir. Zincirin tamamını kapsar: bir seçim sunmak, bu seçimi izleyicilere gerçekten uygulamak, kanıtını saklamak, seçimi açıklayan belgeleri yayımlamak ve veri sahiplerinin taleplerini almak.

On bir uyumluluk profili hazır gelir — GDPR'den CCPA'ya, Québec'in 25 sayılı Kanunu, Brezilya'nın LGPD'si ya da Hindistan'ın DPDP'si dahil. Etkin profil; rıza modelini (opt-in veya opt-out), Google Consent Mode varsayılan değerlerini, üretilen belgelerin metnini, yayımlanan hakları ve anılan denetim otoritesini belirler.

Her şey sitenizin içinde kalır. Eklenti tek bir dış servisle iletişim kurar — IAB Europe'un Global Vendor List'i — o da yalnızca varsayılan olarak kapalı gelen TCF modülünü etkinleştirirseniz. Telemetri yok, hesap yok, abonelik yok.

Tasarım gereği tam sayfa önbelleğiyle uyumlu

Geri kalan her şeyi yöneten mimari karar budur. Sunucunun ürettiği hiçbir şey rıza çerezine bağlı değildir. HTML tüm ziyaretçiler için aynıdır: izleyiciler herkes için etkisiz etiketlere dönüştürülür ve bunları tarayıcıda, kategori kategori, ilk render'dan önce çerezi okuyarak serbest bırakan bir JavaScript çalışma zamanıdır.

Pratik sonucu: LiteSpeed Cache, WP Rocket, Varnish ya da bir CDN, bir ziyaretçinin seçimlerini bir başkasına sunamaz. Yalnızca gerçekten kişiye özel yanıtlar — bir hak talebinin kimlik doğrulama sayfası, ziyaretçi verisi içeren REST yanıtları — açıkça önbelleklenemez olarak işaretlenir. Önbelleklenebilir HTML'e hiçbir nonce da basılmaz: banner, her yazma işleminden hemen önce no-store bir uç noktadan taze bir nonce alır.

Pakette gelenler

  • Rıza banner'ı: dört konum, açık / koyu / otomatik tema, “Tümünü reddet” en az “Tümünü kabul et” kadar görünür, klavyeyle erişilebilir tercih paneli, tamamen çevrilebilir.
  • Otomatik izleyici engelleme: betikler, satır içi kod parçacıkları, iframe'ler, pikseller, kaynak ipuçları (preconnect, dns-prefetch, preload), analitik/pazarlama stil dosyaları ve üçüncü taraf medyalar; 175 hazır ve düzenlenebilir imza temelinde.
  • İzleyici tarama aracı: kendi sayfalarınızın WP-Cron ile taranması, Set-Cookie başlıklarının okunması, yalnızca yöneticilere gösterilen tarayıcı sondası ve taramanın gerçekte neyi kapsadığını her zaman söyleyen bir panel.
  • Yasal belge üreteci: on bir profil için gizlilik politikası ve çerez politikası, yargı bölgesinin dilinde; yasal bilgiler ile kullanım ve satış koşulları Fransızca.
  • Rıza kayıt defteri: her eylem, HMAC ile zincirlenmiş bir tabloya eklenir; yürürlükteki profil, yayımlanmış belgelerin özeti ve gerçekte gösterilen banner'ın özeti ile birlikte.
  • Haklar portalı (DSAR): kısa kodla gelen form, e-posta ile doğrulama, kimlik doğrulandığında başlayan 12.3 maddesi süresi, WordPress'in yerel dışa aktarıcı ve silicisine bağlanma.
  • Google Consent Mode v2, IAB TCF v2.2, Global Privacy Control, bölgesel tespit, OW Forms entegrasyonu: her biri bağımsız olarak açılabilir.
  • owc/v1 ad alanı altında eksiksiz bir REST API.

Yapmadıkları — karar vermeden önce okuyun

Hukuki bir konuda abartılı bir vaat, sizi de yayıncıyı da aynı ölçüde riske atar. Sınırlar, kodda yazdıkları haliyle şunlardır.

  • Üretilen belgeler şablondur, hukuki danışmanlık değildir. Her belge bunu söyleyen bir uyarıyla biter ve bu uyarı varsayılan olarak açıktır. Belgelerinizi yayımlamadan önce bir uzmana okutun.
  • TCF modülü, IAB Europe nezdinde kayıtlı bir CMP değildir. Kendinizin edinmesi gereken bir CMP ID ister, sağlayıcı düzeyinde hiçbir seçim sunmaz ve sağlayıcıların onun sinyalini reddetmesi meşrudur. TCF kapsamındaki reklam geliri sizin için önemliyse sertifikalı bir CMP kullanın.
  • Kayıt defterinin kurcalamaya karşı kanıtlı olması koşulludur. Zincir, ancak imza anahtarı veritabanının dışında yaşıyorsa kanıt sayılır. Eklenti aksi durumu tespit eder, kendisi raporlar ve tersini iddia etmek yerine yönetim ekranında size söyler.
  • Tarama aracı hiç JavaScript çalıştırmaz. HTML'inizin içerdiğini ve Set-Cookie başlıklarınızın bıraktığını görür; bir etiket yöneticisinin çalışma zamanında enjekte ettiğini yalnızca oturum açmış yöneticilere ayrılmış bir sonda görür.
  • Varsayılan engelleme “üçüncü taraf olan her şey” değildir. Bilinmeyen bir üçüncü taraf betiğine varsayılan olarak izin verilir; varsayılan olarak engellenenler bilinmeyen iframe'lerdir. Engelleme, zenginleştirebileceğiniz imza kataloğuna dayanır.
  • JavaScript olmadan hiçbir seçim kaydedilemez. Ziyaretçi bir <noscript> bloğu görür ve zorunlu olmayan hiçbir şey yüklenmez, ama hiçbir şey de kaydedilmez.
  • Bölgesel tespitte ABD'de eyalet eyalet, Kanada'da vilayet vilayet ayrım yoktur: tüm ABD toprakları ccpa profilini, tüm Kanada quebec profilini alır.
  • Yasal bilgiler ile kullanım ve satış koşulları yalnızca Fransızca vardır. Hedef dili Fransızca olmayan her yargı bölgesi için üreteç, uygun olmayan bir metin yayımlamak yerine bu iki belgeyi üretmeyi reddeder.
  • Özel rol yoktur: yönetimin tamamı manage_options yetkisini ister.

Bu liste, gizlenmiş bir yol haritası değil, bilinçli bir tercihtir. Uyumluluk konusunda, boşluklarını söyleyen bir araç, onları gizleyen bir araçtan iyidir.


Kurulum

.zip dosyasından

  1. https://optionweb.dev/tr/addons/ow-consent/ adresinden ow-consent-1.4.3.zip dosyasını indirin
  2. Eklentiler → Yeni Ekle → Eklenti Yükle
  3. Dosyayı seçin, Kur'a, ardından Etkinleştir'e tıklayın

FTP ile

Arşivi açın ve ow-consent klasörünü /wp-content/plugins/ içine bırakın, ardından eklentiyi Eklentiler ekranından etkinleştirin.

Gereksinimler

  • WordPress 6.2 veya üstü — bu bir öneri değil, başlatmayı reddetme koşuludur (aşağıya bakın)
  • PHP 7.4 veya üstü
  • MySQL 5.7+ / MariaDB 10.2+
  • Tarama aracını, kayıt defteri saklama süresini, DSAR vade hatırlatmalarını veya TCF modülünü kullanıyorsanız çalışan bir WP-Cron

WordPress 6.2 güvencesi. 1.3.0'dan bu yana her tablo tanımlayıcısı, wpdb::prepare() fonksiyonunun %i işaretçisiyle bağlanır; WordPress bunu ancak 6.2'den itibaren anlar. Daha eski bir çekirdekte prepare() boş bir dize döndürür, izleyici kataloğu sessizce boş bir kümeye çözülür ve banner ziyaretçiye gerçekleşmeyecek bir engelleme sözü vermeye devam ederdi. Bu yüzden eklenti başlatmayı reddeder ve hiçbir şeyin engellenmediğini, hiçbir rızanın kaydedilmediğini açıkça söyleyen bir hata mesajı gösterir. Requires at least başlığı 6.2'nin altında etkinleştirmeyi zaten engeller, ama ne çalışan bir kurulumun çekirdek sürümünün düşürülmesini ne de FTP ile bırakılmış bir kopyayı kapsar.

Kurulanlar

Etkinleştirmede OW Consent dört tablo oluşturur:

Tabloİçerik
{prefix}owc_ledgerHash ile zincirlenmiş rıza kayıt defteri
{prefix}owc_dsarHak talepleri
{prefix}owc_scannerİzleyici tarama aracının bulguları
{prefix}owc_scriptsEngellemenin kullandığı imza kataloğu

Beşinci bir tablo, {prefix}owc_form_links, kardeş eklenti etkinse OW Forms entegrasyonu tarafından ayrıca oluşturulur (bkz. OW Forms entegrasyonu).

Etkinleştirme ayrıca şunları ekler:

  • boş olarak tohumlanan owc_settings seçeneği — bilerek: siz hiçbir şey kaydetmediğiniz sürece tüm metinler, İngilizce varsayılanlardan gelir ve anında sitenin diline çevrilir; böylece eklentiyi etkinleştiren kişinin yerel ayarı veritabanına sabitlenmez;
  • owc_version seçeneği;
  • pakette gelen izleyici kataloğu (data/tracker-catalog.json), 100'lük gruplar halinde INSERT IGNORE ile eklenir ve sürüme özel bir tohumlama bayrağı taşır (owc_catalog_seeded_1.4.3);
  • etkinleştirmeden bir saat sonrasına planlanan günlük owc_daily_maintenance görevi.

Beş cron olayı daha, onları kullanan modüller tarafından kurulur. Eklentinin altı cron kancası şunlardır: owc_scanner_run, owc_scanner_run_batch, owc_ledger_retention, owc_tcf_refresh_gvl, owc_run_upgrade ve owc_daily_maintenance.

Çoklu sitede tablolar site başına oluşturulur, asla paylaşılmaz (wp_2_owc_ledger vb.). Ağ genelinde etkinleştirme, ağda en fazla 200 site varsa tüm siteleri dolaşır; üzerindeyse her site ilk isteğinde tembel olarak hazırlanır. Ağ etkinleştirmesinden sonra oluşturulan bir alt site, wp_initialize_site kancasıyla hazırlanır.

wp-config.php içinde tanımlanacaklar

Bu sabitlerin hiçbiri zorunlu değildir, ama ikisi eklentinin ürettiği şeyin ispat gücünü değiştirir.

// Önerilir: kayıt defterinin imza anahtarını veritabanının dışına çıkarır.
define( 'OWC_LEDGER_KEY', 'bu siteye özgü, uzun ve rastgele bir dize' );

// Önerilir: standart WordPress salt'ları. Onlar olmadan WordPress salt'ları veritabanında
// saklar ve kayıt defteri, kendisini kurcalamaya karşı kanıtsız olarak bildirir.
define( 'AUTH_KEY',  '…' );
define( 'AUTH_SALT', '…' );

// Site bir CDN, yük dengeleyici veya ters proxy arkasındaysa.
// Bu sabit olmadan CF-Connecting-IP, X-Forwarded-For ve X-Real-IP YOK SAYILIR
// ve yalnızca REMOTE_ADDR kullanılır — bu da hız sınırlaması açısından tüm
// ziyaretçilerinize aynı kimliği verir.
define( 'OWC_TRUSTED_PROXY', '198.51.100.0/24, 2001:db8::/32' );
// `OWC_TRUSTED_PROXIES` takma ad olarak kabul edilir; bir dize de bir dizi de olur.

// Yalnızca bölgesel tespit için: hangi ülke başlıklarının güvenilir olduğunu bildirir.
define( 'OWC_GEO_TRUSTED_HEADERS', 'cloudflare' ); // 'cloudflare'|'cloudfront'|'proxy'|'all'
define( 'OWC_BEHIND_CLOUDFLARE', true );
define( 'OWC_BEHIND_CLOUDFRONT', true );

OWC_LEDGER_KEY aynı zamanda bölgesel tespit çerezinin anahtarını türetmeye yarar. Tanımlı değilse kayıt defteri anahtarı wp_salt('auth') değerine düşer.

Kimlerin erişimi var

Eklentinin tüm yönetim ekranları ve tüm yönetim REST rotaları manage_options yetkisini ister. Ne özel bir rol ne de daha ince bir yetki vardır: eklenti ekranını birine açmak, ona sitenin ayarlarını vermek demektir.

Güncelleme yolu

Eklenti şemasını asla anonim bir sayfa üzerinde canlı olarak taşımaz. Sürüm değiştiğinde owc_version ve bir owc_pending_upgrade bayrağı hemen yazılır, ardından:

  • istek AJAX dışı bir yönetim isteği, bir cron çalışması ya da bir WP-CLI komutuysa geçiş satır içi çalışır;
  • değilse beş saniye sonrasına bir owc_run_upgrade olayı planlanır.

admin-ajax.php anonim bir istek gibi ele alınır: burası herkese açık bir giriş noktasıdır. Geçiş bir kilit altında çalışır (owc_upgrade_lock, 300 saniye sonra devralınır) ve admin_init üzerindeki bir güvenlik ağı, WP-Cron'un kapalı olduğu siteleri yakalar. Sürüm aynıysa toplam maliyet tek bir get_option() çağrısıdır.

Devre dışı bırakma ve silme

Devre dışı bırakmak tüm verileri korur ve yalnızca altı cron olayını temizler. Ağ genelinde devre dışı bırakmada tüm siteler 200'lük gruplar halinde dolaşılır — etkinleştirmenin aksine — çünkü kurulu bırakılmış bir cron asla kendiliğinden kaybolmaz.

Eklentiyi silmek uninstall.php dosyasını tetikler; bu da iki aşamada ilerler:

  1. Ayarınız ne olursa olsun her zaman: altı cron temizlenir ve {prefix}owc_dsar tablosu, hız sınırlaması transient'leriyle birlikte silinir. Üçüncü kişilere ait doğrudan kimlik belirtici kişisel veri içeren (e-posta adresi, ad, serbest metin) tek tablo budur; eklenti gittikten sonra saklama süresini hiçbir şey sınırlamaz ve hiçbir ekran bu taleplere yanıt vermeye, onları dışa aktarmaya ya da silmeye izin vermez. Saklamanız gereken talepleri eklentiyi silmeden önce dışa aktarın.
  2. Yalnızca delete_data_on_uninstall açıkça etkinleştirilmişse: owc_ledger, owc_dsar, owc_scanner, owc_scripts ve owc_form_links tabloları, adlandırılmış seçenekler, owc_ önekli tüm seçenekler (transient'ler dahil) ve owc_ önekli usermeta kayıtları silinir. Çoklu sitede ağ seçenekleri ana sitenin kararını izler.

Bu ayar varsayılan olarak kapalıdır: GDPR'nin 7.1 maddesinin istediği rıza kanıtı, eklentinin silinmesinden sağ çıkar.


Hızlı başlangıç

Etkinleştirmenin ardından yönetim kenar çubuğundaki OW Consent girişini açın. Eklentinin tamamı bu tek ekranda, on sekmede toplanmıştır: Dashboard, Banner, Compliance, Legal identity, Categories, Policies, Scanner, Tracker catalogue, Audit ledger, DSAR requests.

Bir kaydetme yalnızca açık olan sekmeyi ilgilendirir. Bu bilinçli bir tercihtir: her boole değerinin bir ikiz gizli alanı vardır ve formda bulunmayan bir anahtar “bu alan başka bir sekmede” demektir, asla “işaretsiz” değil. Bu olmasaydı bir sekmeyi kaydetmek diğer tüm sekmelerin ayarlarını ezerdi.

1. Uyumluluk profilinizi seçin

Compliance sekmesi. Profil; rıza modelini, Consent Mode varsayılanlarını, üretilen belgeleri ve yayımlanan hakları belirler. Varsayılan: gdpr.

compliance_strict varsayılan olarak açıktır: engellemeyi yalnızca WordPress'e kayıtlı betiklerin ötesine taşıyan da odur. Temanıza gömülü iframe'lerin, piksellerin ve betiklerin de işlenmesini istiyorsanız açık bırakın.

2. Yasal kimliği doldurun

Legal identity sekmesi. Bu alanlar üretilen belgelerin hammaddesidir ve zorunlu bir alan boş olduğu sürece üretim reddedilir — sessiz bir başarısızlıkla değil, eksik anahtarların listesiyle birlikte.

Tüm belgeler için asgari: legal_company_name ve legal_company_email. Çerez politikası dışındaki her belge için adres ve ülkeyi ekleyin. Yasal bilgiler için ayrıca telefonu, yayın yönetmenini ve barındırıcının tüm iletişim bilgilerini ekleyin; Fransa, Belçika ve Lüksemburg'da şirket türü ve sicil numarası da zorunlu hale gelir.

legal_dpa_authority alanını boş bırakın: denetim otoritesi, ülkenizden ve profilinizden türetilir. Çok yargı bölgeli bir sitede bunu elle doldurmak, yanlış düzenleyiciyi anmak demektir.

3. Kategorilerinizi gözden geçirin

Categories sekmesi. Altı kategori de varsayılan olarak kullanılabilirdir. Sitenizin kullanmadıklarını kapatın: arayüzde olmayan bir kategori uyumluluk kazancı değildir, onu serbest bırakacak hiçbir anahtar olmadan sonsuza dek engellenmiş bir kaynaktır — engelleme o kaynağı marketing kategorisine devreder.

Etiketler size uyduğu sürece boş bırakın: o zaman sitenin dilini izlerler. Bir metni özelleştirdiğiniz anda o metin dili izlemeyi bırakır.

4. Banner'ı ayarlayın

Banner sekmesi. Konum, tema, düğmeler, etiketler, yenileme süresi.

Kaçırılmaması gereken iki nokta: banner_reject_all ayarını açık bırakın (“Reddet”, “Kabul et” kadar basit ve görünür olmalıdır) ve kapatma çarpısını kapalı bırakın — seçim yapmadan kapatmak zımni bir ret anlamına geldiği için varsayılanda yoktur. Açarsanız çarpıya tıklamak sessiz bir kapatma değil, eksiksiz “Tümünü reddet” yolunu çalıştırır.

5. Belgelerinizi üretin

Policies sekmesi. Dört belge: çerez politikası, gizlilik politikası, yasal bilgiler, kullanım ve satış koşulları. Her biri sürümlenmiş bir WordPress sayfası olur ve bağlantısı ayarlara geri yazılır.

Önce önizleme olarak üretin, okuyun, sonra yayımlayın. Ve bir profesyonele okutun: her belgenin altındaki uyarı şeridi süs değildir.

6. Haklar portalını açın

Bir sayfa oluşturup içine [owc_dsar_form] yapıştırın. DSAR requests sekmesinde dsar_email alanını doldurun: formun altında yayımlanan iletişim adresi ve bildirimlerin alıcısı budur. Boş bırakılırsa eklenti legal_dpo_email, ardından admin_email değerine düşer — ama admin_email herkese açık bir sayfada asla yayımlanmaz.

7. Halka açmadan önce doğrulayın

Kontrol paneli, on beş uyumluluk denetimi çalıştırır ve hataları uyarılardan ayırır: banner kapalı, “Tümünü reddet” yok, kapatma çarpısı açık, yasal kimlik eksik, haklar portalı kapalı, kayıt defteri kapalı, hiçbir politika bağlı değil, denetim otoritesi etkin profille çelişiyor (onu sıfırlayan bir “Fix this” düğmesiyle birlikte), site HTTPS'te değil, kategorilendirilmemiş izleyiciler var, süresi geçmiş DSAR talepleri var, tetiklenemeyen katalog kuralları var.

Sitenizin uyumlu olduğunu duyurmadan önce bu on beş satırı yeşile çevirin.


On bir uyumluluk profili

Uyumluluk profili kozmetik değildir. Hukuki modeli, arayüzü, teknik sinyalleri ve yayımlanan belgelerin içeriğini yönetir.

Liste

ProfilHedeflenen rejimModel
gdprGDPR + ePrivacy (AB/AEA)Opt-in
uk_pecrUK GDPR + PECR (Birleşik Krallık)Opt-in
ch_nfadpİsviçre nLPD'siOpt-in
quebec25 sayılı Kanun (Québec)Opt-in
lgpdLGPD (Brezilya)Opt-in
popiaPOPIA (Güney Afrika)Opt-in
piplPIPL (Çin)Opt-in
dpdpDPDP Act 2023 (Hindistan)Opt-in
ccpaCCPA / CPRA (Kaliforniya)Opt-out
us_genericGenel ABD eyalet kanunlarıOpt-out
auPrivacy Act (Avustralya)Opt-out

Ayar: compliance_profile, varsayılan gdpr.

Opt-in, herhangi bir seçim yapılmadan önce yalnızca zorunlu kategorilerin verilmiş sayıldığı anlamına gelir. Opt-out, ret gelene kadar her şeyin verilmiş sayıldığı anlamına gelir. Üç opt-out profili ccpa, us_generic ve au'dur. JavaScript çalışma zamanı, PHP ile tam olarak aynı kuralı uygular; böylece sunucu ile tarayıcı iki farklı durum bildiremez.

Profilin gerçekte değiştirdikleri

DeğişenAyrıntı
Rıza modeliOpt-in; ccpa, us_generic, au hariç
Consent Mode varsayılanlarıOpt-out profilinde yedi sinyal de granted olur
Zorunlu “Do Not Sell or Share” bağlantısıYalnızca ccpa ve us_generic
Hukuken bağlayıcı GPCYalnızca ccpa ve us_generic — Avustralya açıkça dışarıda: opt-out rejimi, ama GPC'yi tanımıyor
TCF için “GDPR uygulanır” kapsamı27 AB ülkesi + IS, LI, NO + GB + CH, yani 31 kod
Üretilen belgenin diliquebec → Fransızca; lgpd → Portekizce; ülkesi FR, BE veya LU olan gdpr → Fransızca; geri kalan her şey → İngilizce
Anılan denetim otoritesiProfil bazlı tablo, GDPR için ülkeye göre inceltilir
Yayımlanan haklar listesiProfil başına yazılmış bir liste, madde atıflarıyla
İngilizce belgenin “çerez rejimi” gövdesiMetin, aktarım kapsamı ve güvenceler profil bazında farklıdır

Profile göre üretilen belgeler

Gizlilik politikası ve çerez politikası on bir profilin tamamı için vardır. Şablonlar şu sırayla çözülür, ilk bulunan kazanır: <tür>_<profil>_<dil>, sonra <tür>_<profil>, sonra <tür>_<dil>, sonra <tür>.

Çerez politikasının İngilizce gövdeleri profil bilinçlidir: uygulanacak kural, aktarım kapsamı, güvenceler ve panel metni gdpr, uk_pecr, ch_nfadp, au, pipl, dpdp, ccpa ve us_generic için farklıdır; ilgili atıflarla birlikte (2002/58 sayılı direktifin md. 5(3), PECR reg. 6, LTC md. 45c(b) ve nLPD md. 19/6(7)(b), APP 8, PIPL md. 24, DPDP Act 2023'ün 5/6/7/9(3)/16 bölümleri, §1798.121 ve Cal. Code Regs. tit. 11 §7025, VCDPA/CPA/CTDPA/UCPA/TDPSA).

Anılan denetim otoritesi

ProfilAnılan otorite
gdpr, ülke FRCNIL
gdpr, ülke BEAPD-GBA
gdpr, ülke LUCNPD
gdpr, ülke DEBfDI
gdpr, diğer AEA ülkeleriGenel ifade (“yetkili denetim otoritesi”)
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_genericEyaletinizin Attorney General'ı

legal_dpa_authority alanını değiştirdiyseniz sizin girdiğiniz değer bu türetmeye üstün gelir.

Yargı bölgesi kapsamının sınırları

  • AEA'da yalnızca dört ülkenin adı geçen bir otoritesi var (FR, BE, LU, DE). İspanya, İtalya veya Hollanda'daki bir GDPR sitesi genel bir ifade yayımlar.
  • ABD'de eyalet eyalet ayrım yok. us_generic profili vardır ve kendi VCDPA/CPA/CTDPA/UCPA/TDPSA metinlerini taşır, ama hiçbir otomatik tespit onu atamaz: elle seçilir.
  • Kanada'da vilayet düzeyinde ayrım yok.
  • Yalnızca üç belge dili: Fransızca, İngilizce, Portekizce. Gövdeler WordPress'in çeviri mekanizmasından geçmez — bu bilinçlidir: bir hukuki belge tek dilli olmalı ve dili, yöneticinin yerel ayarını değil, yargı bölgesini izlemelidir.
  • Yasal bilgiler ile kullanım ve satış koşulları: yalnızca Fransızca şablonlar. Üreteç, owc_policy_template filtresiyle kendi gövdenizi sağlamadığınız sürece diğer tüm hedef diller için net biçimde reddeder.

Çerez kategorileri

Kanonik liste

Altı kategori, bu görüntülenme sırasıyla; necessary her zaman başta:

SlugHazır etiketHazır açıklama
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.

Yukarıdaki değerler, saklanabilir İngilizce varsayılanlardır. Türkçe bir sitede ziyaretçi çevirisini görür — çeviri mekanizması için aşağıya bakın.

Kullanılabilirlik

cat_<slug>_available ayarı, kategori başına bir tane. Altısı da varsayılan olarak kullanılabilirdir. Eski cat_<slug>_enabled anahtarı hâlâ yedek olarak okunur, geçiş yapılmaz.

preferences ve social kategorileri kullanılabilir gelir; çünkü tohum kataloğu YouTube, Spotify, SoundCloud, Instagram, X ve Facebook'u social olarak sınıflandırır: kategori arayüzde olmasaydı bu gömüler, opt-in imkânı olmadan kalıcı olarak engelli kalırdı.

necessary zorunludur: kapatılamaz (ePrivacy md. 5.3). Bu yüzden yönetimde kullanılabilirlik anahtarı yoktur, yalnızca bir etiketi ve bir açıklaması vardır.

Çeviri mekanizması

cat_<slug>_label ve cat_<slug>_desc ayarları. Saklanan değer yalnızca boş değilse ve İngilizce varsayılandan farklıysa olduğu gibi döndürülür; aksi halde çeviri çıkar.

Bilinmesi gereken sonuç: siz hiçbir şeyi özelleştirmediğiniz sürece sitenin dilini değiştirmek kategorilerin dilini de değiştirir. Kendi metninizi girdiğiniz andan itibaren o metin, yazdığınız dilde sabitlenir. Aynı kural banner metinleri için de geçerlidir.

necessary kategorisinin çevrilmiş açıklaması iki dizeden kurulur: ikincisi eklentinin kendi çerezlerini adlandırır — owc_consent (13 aya kadar) ve owc_geo (24 saat, yalnızca bölgesel tespit açıkken yazılır).

Google Consent Mode v2 eşlemesi — bağlayıcı

Bu, eklentinin tek doğruluk kaynağıdır: banner, engelleme ve bootstrap bu tabloyu okur, dolayısıyla birbirlerinden ayrışamazlar.

KategoriConsent Mode v2 sinyalleri
necessarysecurity_storage, functionality_storage
functionalfunctionality_storage, personalization_storage
analyticsanalytics_storage
marketingad_storage, ad_user_data, ad_personalization
preferencespersonalization_storage
socialad_storage, ad_user_data

Önemli ayrıntı: siteniz functional kategorisini sunuyorsa functionality_storage, necessary listesinden çıkarılır. Aksi halde, isteğe bağlı bir kategoriye ait olmasına rağmen her türlü rızadan önce verilmiş olurdu.

TCF eşlemesi — yalnızca açıklayıcı

functionalfunctional, analyticsmeasurement, marketingadvertising, preferencespersonalization, socialsocial_media.

Bunlar görüntüleme etiketleridir. TCF tarafındaki bağlayıcı eşleme, IAB amaçlarının sayısal kimliklerinden oluşan tablodur; IAB TCF v2.2 bölümünde anlatılır. Hiçbir TCF davranışını bu beş etikete bağlamayın.

Bir kategori ortadan kalkarsa ne olur

Bir katalog kuralı, sitenizin artık sunmadığı bir kategoriyi gösteriyorsa — örneğin social kategorisini kapattıysanız — engelleme, kaynağı marketing kategorisine, o da yoksa kullanılabilir ilk isteğe bağlı kategoriye devreder. Bu normalleştirme olmasaydı kaynak, onu serbest bırakacak hiçbir anahtar olmadan sonsuza dek engelli kalırdı.


Banner

Ne zaman görünür

Banner wp_footer üzerinde öncelik 5 ile render edilir, kaynakları da wp_enqueue_scripts üzerinde kuyruğa alınır. Şu koşullardan biri doğruysa hemen çıkar: yönetim bağlamı, RSS beslemesi, robots.txt veya banner_enabled kapalı. wp_head hiç tetiklenmemişse de çıkar — wp_head() çağırmayan bir tema aksi halde etkisiz ve stilsiz bir işaretleme alırdı.

HTML tüm ziyaretçiler için aynıdır. Paneldeki tüm kutular sunucu tarafında KAPALI olarak render edilir, sonra istemci tarafında çerezden doldurulur. <html data-owc="given|none"> işaretini ilk render'dan önce senkron olarak koyan JavaScript'tir; CSS de banner'ı yalnızca data-owc="none" durumunda gösterir.

Bilinmesi gereken sonuç: JavaScript'i olmayan bir ziyaretçi banner'ı hiç görmez, dolayısıyla kapatamayacağı bir modalın ardında asla kilitli kalmaz. Onun yerine, tercihlerinin kaydedilemeyeceğini ve bir seçim yapılmadığı sürece zorunlu olmayan hiçbir çerezin yüklenmediğini açıklayan bir <noscript> bloğu görür.

Konumlar ve tema

AyarDeğerlerVarsayılan
banner_positionbottom-bar, bottom-card, center-modal, top-barbottom-bar
banner_styleauto, light, darkauto

Yalnızca center-modal konumu role="dialog", aria-modal="true", karartılmış bir arka plan, bir odak tuzağı ve Esc tuşu desteği alır. Diğer üç konum bir role="region"'dır: Esc yakalanmaz (tema kendi davranışını korur) ve ilk render'da odak çalınmaz — çalınsaydı klavye kullanıcısı tüm atlama bağlantılarının ötesine itilirdi.

Koyu palet, light değerini açıkça bildiren bir temayı ezmemek için korumalarla birlikte prefers-color-scheme: dark altında uygulanır. Sitenin teması paleti CSS değişkenleriyle yönetebilir: --owc-paper-tint, --owc-ink, --owc-smoke, --owc-fog, --owc-ui, --owc-accent, --owc-accent-strong, --owc-accent-darker.

Uygulama ayrıntıları: banner için z-index 99998, arka plan için 99997; iOS çentikleri için env(safe-area-inset-*) desteği; üst konumda WordPress yönetim çubuğunun altına otomatik kaydırma.

Düğmeler

AyarVarsayılanEtkisi
banner_accept_alltrue“Tümünü kabul et” gösterilir
banner_reject_alltrue“Tümünü reddet” gösterilir
banner_preferencestrue“Özelleştir” gösterilir
banner_close_xfalseKapatma çarpısı gösterilir
banner_show_logotrueSite logosu gösterilir

“Tümünü kabul et” ile “Tümünü reddet” aynı biçimlendirme sınıfını paylaşır: aynı arka plan, aynı kenarlık, aynı yazı kalınlığı, aynı iç boşluk. Bu, CNIL / EDPB gerekliliğine (03/2022 sayılı kılavuz) verilen yanıttır: reddetmek, kabul etmek kadar basit ve görünür olmalıdır.

Kapatma çarpısı

Varsayılan olarak kapalıdır, çünkü bir kapatma çarpısı zımni bir ret anlamına gelir. Bilinmesi gereken üç davranış:

  1. banner_close_x kapalıyken çarpı işaretlemede vardır ama hidden niteliği taşır ve CSS onu tamamen kaldırır: ne görünür, ne odaklanabilir, ne de ekran okuyuculara duyurulur.
  2. Açıkken çarpıya tıklamak eksiksiz “Tümünü reddet” yolunu çalıştırır, asla sessiz bir kapatma değil.
  3. Yalnızca tek bir durumda çalışma zamanı tarafından açığa çıkarılır ve yeniden etiketlenir: bir ret hiçbir şekilde kaydedilemediğinde. O zaman artık bir şeyi reddetmez, bildirimi kaldırır — ve bu kapatma bir seçim olarak sayılmaz. Kararı sunucu tarafından reddedilen bir ziyaretçi, kapatamayacağı bir banner'la baş başa bırakılmaz.

İlk katman

  • Başlık (text_title) ve mesaj (text_message). Mesaj, eklentinin zengin HTML kabul eden tek alanıdır; <a href target rel> ile sınırlı bir wp_kses ile render edilir.
  • Gizlilik politikası bağlantısı: link_privacy_policy, ayar boşsa WordPress'te bildirilen politika sayfasına düşer.
  • Çerez politikası bağlantısı: link_cookie_policy, yedeksiz.
  • Veri sorumlusunun adı: legal_company_name, yoksa sitenin adı; “Veri sorumlusu: …” biçiminde gösterilir (md. 13(1)(a)).
  • Logo: temanın medium boyuttaki özel logosu, yoksa site simgesi.

Tercih paneli

Kullanılabilir her kategori için, adlandırılmış bir role="group" içinde bir satır.

  • Zorunlu bir kategori, anahtar olmadan “Always active” metin rozetini gösterir.
  • İsteğe bağlı bir kategori, aria-checked, aria-labelledby ve aria-describedby taşıyan bir <button role="switch"> gösterir. Durum; aria-checked, imlecin konumu ve görünür bir On/Off kelimesiyle taşınır — asla yalnızca renkle değil.
  • Küçük ekranda dokunma hedefi 44 piksele büyütülür (WCAG 2.2 AA, ölçüt 2.5.8).
  • Panelin eylem çubuğu altta sticky durur; böylece liste kayarken “Seçimlerimi kaydet” erişilebilir kalır.

TCF modülü etkinse iki blok daha görünür: erişilebilir TCF amaçları ve bildirilmiş özel özellikler. Bkz. IAB TCF v2.2.

Rızanın yenilenmesi

AyarVarsayılanSınırlar
consent_renewal_months120 ile 13 arası
consent_policy_hash_checktrue

0, “bir daha asla sorma” demek değildir. 0 değeri 13 aya dönüştürülür ve 13 ay katı tavandır (CNIL 2020-091 sayılı karar). Bu yüzden fiili süre her zaman 1 ile 13 ay arasındadır; çerezin süresini, sunucu tarafındaki geçerlilik denetimini ve üretilen belgelerde yayımlanan süreyi yöneten de aynı değerdir. Kaynak kodda görünen OWC_COOKIE_TTL sabiti yalnızca bir yedektir.

consent_policy_hash_check, belgeleriniz değiştiğinde rızayı yeniden sorar: çerez, bağlı politika sayfalarının bir özetini taşır ve bir farklılık banner'ı yeniden açar. Hiçbir sayfa bağlı değilken özet boş dizeye eşittir — “bilinmiyor” ile “değişti” ayrımını yapmayı ve boş bir karşılaştırma yüzünden tüm siteyi yeniden rahatsız etmemeyi sağlayan da budur.

Metinler

Yedi yuva; hepsi varsayılanda boştur ve dolayısıyla otomatik olarak çevrilir: text_title, text_message, text_accept_all, text_reject_all, text_preferences, text_save ve yüzen düğme için floating_button_label.

Yönetimde her alan, çevrilmiş varsayılanını yer tutucu olarak gösterir: boş bırakmak, ziyaretçinin dilini izleyen varsayılanı korur.

owc_banner_texts filtresi bu metinleri kodla değiştirmeye izin verir. Ek yuvalar kabul edilir; beceriksiz bir geri çağırma banner'ı boşaltamasın diye skaler olmayan veya boş değerler ayıklanır.

Seçim gerçekte nasıl kaydedilir

JavaScript çalışma zamanı katı ES5'tir — ok işlevi yok, şablon dizesi yok — ki uygulama içi gömülü tarayıcılarda ve eski WebView'lerde çalışsın. Yazma sırası bilinmeye değer, çünkü hata mesajlarının çoğunu açıklayan odur.

  1. Kaynağın yeniden çapalanması. REST URL'leri WordPress yapılandırmasından gelir. Ziyaretçileriniz başka bir ana bilgisayarda geziniyorsa (www'ye karşı apex, takma ad, önizleme alan adı, Host başlığını yeniden yazan bir proxy), bu URL çapraz kaynak olur ve WordPress 200 yanıtı verirken tarayıcı Set-Cookie başlığını saklamayı reddeder. Bu yüzden çalışma zamanı, PHP'nin verdiği yolu gerçekte gezilen kaynağa yeniden çapalar.
  2. Nonce. Yazmadan hemen önce GET /owc/v1/nonce üzerinden taze alınır, asla önbelleklenebilir HTML'e gömülmez, X-OWC-Nonce başlığıyla gönderilir. Alma işlemi 4 saniyeyle sınırlıdır ve eksik, boş ya da ulaşılamaz bir nonce yazmayı asla engellemez ve ziyaretçiye bildirilmez.
  3. İstek gövdesinde açıkça verilen page_url; böylece kayıt defteri satırı, bir eklentinin, bir meta-referrer'ın ya da bir proxy'nin silebileceği Referer başlığına bağlı kalmaz.
  4. AbortController ile 15 saniyelik takılma koruması: geç kalan bir POST ikinci bir satır yazmasın diye istek yalnızca yok sayılmaz, iptal edilir.
  5. Başarının tanımı. POST ancak ve ancak şu koşullarda başarılıdır: yanıt ok, gövde ayrıştırılabilir JSON, json.ok === true ve çerez tarayıcıda geri okunabiliyor. 200 ile sunulan bir önbellek sayfası, bir kenar doğrulaması ya da bir WAF sayılmaz.
  6. Sunucu cookie_set: false yanıtı verirse çalışma zamanı, dönen parametrelerle çerezi kendisi yazar ve sonra geri okur. Başarısızlık yine başarısızlıktır: hiçbir şey yayımlanmaz, hiçbir şey serbest bırakılmaz.
  7. Tek bir yeniden gönderim, yalnızca kodu owc_bad_nonce, rest_cookie_invalid_nonce ya da rest_nonce_invalid olan bir 403 durumunda ve yalnızca alınan nonce gerçekten farklıysa.
  8. Çalışma zamanının yayımladığı şey, sunucunun sakladığı şeydir: sunucunun reddettiği kategoriler yerel durumdan çıkarılır.

POST başarılı olmadığı sürece hiçbir şeyin maskesi kaldırılmaz, hiçbir şey serbest bırakılmaz ve “granted” değerinde hiçbir Consent Mode sinyali yayımlanmaz.

Hata sınıflandırması

Çalışma zamanı dokuz nedeni ayırır ve her birinin kendi görünür mesajı vardır: network, refused, ratelimit, unexpected, timeout, browser, config, cookie, owc_cookie_not_persisted. HTTP durumu ve sunucu kodu öğeye yazılır (data-owc-status, data-owc-code) ve bir kez console.warn ile günlüklenir — asla görünür metne dönüştürülmez. Böylece bir destek ekran görüntüsü, ağ izine gerek kalmadan nedeni adlandırır.

Banner'ın JavaScript API'si

window.OWCBanner.show();              // banner modunda açar
window.OWCBanner.hide();              // kapatır
window.OWCBanner.openPreferences();   // tercih panelini açar
window.OWCBanner.openDnsmpi();        // paneli marketing, social ve preferences
                                      // önceden KAPALI olacak şekilde açar (CCPA girişi)
window.OWCBanner.reset();             // çerezi istemci tarafında siler, bir geri çekme
                                      // gönderir, ardından sayfayı yeniden yükler
window.OWCBanner.acceptCategory( 'social' );  // yalnızca sunucu gerçekten sakladıysa
                                              // true ile çözülen bir promise döndürür

<head> içinde öncelik 1 ile daha hafif bir bootstrap basılır ve window.OWConsent nesnesini açar: .config, .categories, .geo, .profile, .optOut, .state, .has(cat), .refresh(), .paint(), .gcmSignals(state). Yapılandırması owc_bootstrap_config ile filtrelenebilir — ama oradaki her şey herkese açıktır ve önbellek tarafından paylaşılır: oraya asla ziyaretçiye özel veri koymayın.

Paneli kendi sayfalarınızdan açmak

Üç yol, hepsi eşdeğer:

  • #owc-preferences (veya #owc-dnsmpi) URL parçası; yüklemede ve hashchange olayında dikkate alınır;
  • owc-open-preferences sınıfını ya da data-owc-open niteliğini taşıyan herhangi bir öğe;
  • “Do Not Sell” davranışını zorlamak için data-owc-dnsmpi="1" niteliği.

Her değişiklikte, gönderilen yük ayrıntı olarak eklenmiş bir owc:consent-changed olayı yayınlanır. Bu olayı bootstrap, yüzen düğme, CCPA çalışma zamanı ve TCF modülü dinler; siz de dinleyebilirsiniz.

Banner'ın sınırları

  • Her şey wp_head() ve wp_footer() çağrılarına bağlıdır: bunları çağırmayan bir tema hiçbir şey almaz.
  • window.fetch ve window.Promise olmadan hiçbir yazma mümkün değildir ve browser hatası gösterilir.
  • Bir rıza sunucu tarafında kaydedilip tarayıcı tarafında saklanmayabilir (site adresinin gezilen ana bilgisayardan farklı olması, depolamanın engellenmesi, dolu çerez kavanozu). Çalışma zamanı bu durumu tespit eder, başarı saymayı reddeder, özel bir mesaj gösterir ve durumu bir sonraki yazmada sunucuya bildirir.
  • Banner'ın kısa kodu yoktur: ya her yerde görünür ya da hiçbir yerde.

Otomatik engelleme

Bir seçimi gerçek bir etkiye dönüştüren modül budur. İzleyici taşıyan etiketleri, herhangi bir rızadan önce ve herkes için yeniden yazar; serbest bırakmayı da tarayıcıdaki çalışma zamanına bırakır.

İki mod, tek ayar

compliance_strict, varsayılan olarak açık.

  • Kapalı (esnek mod): yalnızca script_loader_tag filtresi bağlanır. Başka bir deyişle yalnızca wp_enqueue_script() ile kaydedilmiş betikler yeniden yazılır. Temaya gömülü bir <script>, bir gömü, bir iframe, bir <img> pikseli: hiçbirine dokunulmaz.
  • Açık (katı mod): filtreye ek olarak bir çıktı tamponu belgenin tamamını yakalar ve REST API üzerinden render edilen işaretleme de işlenir. Yönetimde, istek bir admin-ajax.php isteğiyse, ön yüze de hizmet eden yanıtları (“daha fazla yükle”, filtrelenmiş arşivler) ayrı bir tampon kapsar — ama yalnızca işleyicinin kendisi Content-Type: text/html bildirmişse.

Asla tamponlanmayanlar

Katı tampon şunlar için hemen çıkar: yönetim, AJAX istekleri, beslemeler, robots.txt, trackback'ler, cron, favicon'lar, REST istekleri, JSON istekleri, özelleştirici önizlemesi, site haritaları ve wp-login.php, wp-register.php, wp-signup.php, xmlrpc.php, wp-cron.php, wp-trackback.php giriş noktaları — bunlar URL'nin alt dizesi olarak değil, betiğin tam adı üzerinden test edilir. Ham HTML'e ihtiyaç duyan tarama aracı istekleri için de çıkar.

Beş geçiş

Yeniden yazma, bir DOM ayrıştırıcısıyla değil, kalibre edilmiş düzenli ifadelerle yapılır. Tümünü üç güvence çevreler: 8 MB'ı aşan bir belge olduğu gibi döndürülür, PCRE motorunun başarısızlığı belgeyi olduğu gibi döndürür ve sonuç özgün boyutun yarısından küçükse özgün belge döndürülür. Başka bir deyişle engellemenin arıza modu “engellemesiz sunulan sayfa”dır, asla “bozuk sayfa” değil.

Geçiş 0 — maskeleme. HTML yorumları, <style> ve <textarea> blokları, sonraki hiçbir desen içeride eşleşmesin diye kontrol karakterine dayalı işaretçilerle değiştirilir.

Geçiş 1 — <script>. Karar sırası:

  1. zaten işlenmiş → dokunulmaz;
  2. eklentinin kendi betiği → dokunulmaz;
  3. type="text/plain" ya da JS olmayan tür (ld+json, importmap, x-template) → dokunulmaz;
  4. URL şu niteliklerde aranır: src, data-src, data-rocket-src, data-lazy-src, data-litespeed-src, data-cfsrc — yani performans eklentilerinin nitelikleri de kapsanır;
  5. ana bilgisayar izin listesindeyse → dokunulmaz; izleyiciye benzemeyen birinci taraf kaynak → dokunulmaz;
  6. ana bilgisayar + yol biçimi üzerinden kataloğa göre eşleştirme; bir data: ya da javascript: URL'si çözülür ve satır içi gövde gibi değerlendirilir;
  7. necessary sınıfına giren bir kural asla engellenmez (Stripe.js, reCAPTCHA, Turnstile, cdnjs…): onu engellemek hiçbir uyumluluk kazandırmaz ve çağıran kod parçasını bozar;
  8. hiçbir eşleşme yok → blocker_unknown_script_policy, varsayılan allow;
  9. aksi halde type="text/plain" olarak yeniden yazılır; data-owc-cat, data-owc-vendor, data-owc-src ve — özgün tür özelse (örneğin module) — geri getirilen betik bozulmasın diye data-owc-type eklenir.

Satır içi gövdeler önce inline_signature türündeki katalog kurallarıyla, sonra sabit kodlu on dört çapalı imzayla karşılaştırılır: fbq(, _fbq.push, gtag(, dataLayer.push(, ga('…, _gaq.push, _paq.push, hjid, clarity(, ttq.load|track|page, snaptr(, twq(, lintrk(, pintrk(. Açık istisna: tek başına bir gtag('consent', …), yani başka işaretçi taşımayan bir varsayılan Consent Mode bildirimi, çalıştırılmaya devam eder.

Geçiş 2 — <iframe>. Aynı URL nitelikleri, artı data-original ve data-srcset. Birinci taraf ya da izin listesi → dokunulmaz. necessary → dokunulmaz, aksi halde captcha içeren bir form gönderilemez hale gelirdi. Eşleşme yoksa → blocker_unknown_iframe_policy, varsayılan block. Engellenen iframe src="about:blank" olur ve ilgili kategoriyi serbest bırakan bir “Kabul et: <sağlayıcı>” düğmesi içeren görsel bir yer tutucuyla sarılır.

Geçiş 3 — <img>, yalnızca izleme pikselleri. Önemli kural: tek başına bir katalog satırı bir görseli etkisizleştirmeye asla yetmez. Görsel kataloğa uyuyor ama kategorisi ne analytics ne de marketing ise — bir görsel CDN'i, bir gravatar servisi, bir yazı tipi barındırıcısı — olduğu gibi bırakılır; aksi halde bir izleyici yerine sitenin medyaları silinirdi. Yalnızca etiket buluşsalı engelleyebilir: bilinen on bir toplama noktası (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) ya da 1×1 piksellik üçüncü taraf bir görsel. O zaman src saydam bir GIF ile değiştirilir ve tembel bir yükleyici özgün URL'yi geri getirmesin diye URL taşıyan tüm nitelikler silinir.

Geçiş 4 — <link>. blocker_block_resource_hints ayarına bağlıdır, varsayılan true. Yalnızca kataloğa girmiş ana bilgisayarları işler, hiçbir bilinmeyeni değil.

  • Kataloğa girmiş bir üçüncü tarafa yönelik kaynak ipuçları (preconnect, dns-prefetch, prefetch, prerender, preload, modulepreload) ertelenmez, silinir: bir ipucu TCP+TLS bağlantısı açar ve ziyaretçinin IP'sini ve TLS parmak izini ifşa eder; sonradan geri getirilecek bir şey de yoktur.
  • analytics veya marketing sınıfındaki bir stil dosyası etkisizleştirilir.
  • Google Fonts ve functional sınıfındaki diğer yazı tipi barındırıcılarına asla dokunulmaz: onları etkisizleştirmek, hiçbir uyumluluk kazancı olmadan tüm sitede yedek yazı tipiyle bir metin verir.

Geçiş 5 — <object>, <embed>, <source>, <video>, <audio>. Varsayılan engelleme asla yoktur: yalnızca kataloğa girmiş bir üçüncü taraf işlenir. autoplay ve preload nitelikleri kaldırılır.

“Birinci taraf” sayılanlar

Site URL'si, WordPress URL'si, içerik URL'si, includes URL'si, çoklu sitede bunların ağ karşılıkları ve yükleme klasörünün kökü. Karşılaştırmada www. kaldırılır. /wp-content/ veya /wp-includes/ ile başlayan her yol, ana bilgisayarı ne olursa olsun birinci taraftır; bu, CDN yeniden yazımlarını kapsamak içindir. HTTP olmayan şemalar (data:, blob:, javascript:) asla birinci taraf değildir.

Karşı istisna: gtag, gtm.js, analytics, pixel, fbevents, hotjar, matomo, piwik veya clarity içeren bir URL sitenin kendi ana bilgisayarında bile işlenir. Kendi sunucusunda barındırılan bir GTM ya da Matomo'yu ve birinci taraf proxy'leri yakalayan budur.

Serbest bırakma çalışma zamanı

<head> içinde öncelik 2 ile basılır. JSON yapılandırması yalnızca çerez adını ve izlenen ana bilgisayar listesini içerir — ziyaretçiye bağlı hiçbir şey içermez.

  • Durum okuma: owc_consent çerezi, en fazla üç geçişle, kararlı hale gelene kadar çözülür; çünkü 1.4.3'ten önce yazılan çerezler iki kez kodlanıyordu.
  • Dinamik enjekte edilen betiklerin koruması: HTMLScriptElement.prototype.src setter'ı ve setAttribute sarmalanır. s.src = 'https://www.googletagmanager.com/gtm.js?id=…' ataması yapan birinci taraf bir yükleyici yakalanır ve öğe çalışmadan önce işaretlenir. İzlenen liste yirmi ana bilgisayardan oluşur: 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. Listede olmayan her şey rahatsız edilmeden geçer. İzin listenizdeki ana bilgisayarlar, liste basılmadan önce bu listeden çıkarılır.
  • Belge sırasına göre yeniden enjeksiyon. Geri getirilen harici bir betik, onload ya da onerror olayına kadar kuyruğu bloke eder; ulaşılamayan bir sağlayıcı geri kalanı kilitlemesin diye en fazla 5 saniye beklenir. async niteliği yalnızca başlangıçta varsa uygulanır — aksi halde createElement ile oluşturulan bir betik zorla eşzamansıza çevrilirdi ve yapılandırma kodu kendi kütüphanesinden önce çalışırdı. Geri getirilen satır içi bir betik için, belgeyi silmesin diye document.write geçici olarak yönlendirilir.
  • Rızanın geri çekilmesi: uygulanmış bir kategori açıkça false değerine geçerse çalışma zamanı sayfayı yeniden yükler. Çalışmış bir betik bellekten kaldırılamaz (GDPR md. 7.3). Yükte yalnızca bulunmayan bir kategori geri çekme sayılmaz.
  • Bir MutationObserver, yüklemeden sonra enjekte edilen işaretlemeyi (AJAX, tembel bölümler) yeniden tarar.
  • Engellenmiş bir gömünün düğmesine tıklamak OWCBanner.acceptCategory() çağrısını yapar; banner API'si yoksa gömü yerel olarak ve hiçbir şey kalıcılaştırılmadan serbest bırakılır.

İmza kataloğu

{prefix}owc_scripts tablosu. Pakette gelen data/tracker-catalog.json dosyası, 71 farklı sağlayıcıyı kapsayan 175 satır içerir:

DağılımAyrıntı
Hedefe göre110 URL deseni, 65 çerez adı
Türe göre172 metin parçası, 3 düzenli ifade
Kategoriye görenecessary 55, marketing 37, functional 37, analytics 36, social 10

Sütunlar: pattern, pattern_type (host, regex, inline_signature), match_target (url veya cookie), name, vendor, category, privacy_policy_url, gcm_signal, tcf_vendor_id, retention_days.

Bilinmesi gereken iki davranış:

  • match_target = 'cookie' satırları engelleme tarafından asla kullanılmaz. Yalnızca üretilen belgelerdeki çerez tablosuna hizmet ederler. Onları URL'nin alt dizesi olarak karşılaştırmak, sitelerin JavaScript'ini bozan şeyin ta kendisiydi.
  • Bir URL'yi hedefleyen, altı karakterden kısa ve nokta içermeyen host türü bir desen reddedilir: “fr” ya da “IDE” desenleri “frame.js” ve “provider.js” ile eşleşirdi.

Katalog, nesne önbelleğinde (1 saat) ve bir transient'te (12 saat) önbelleklenir. Boş bir sonuç asla önbelleklenmez. Her yazma, bu önbellekleri boşaltan owc_catalog_updated eylemini tetikler.

Tracker catalogue sekmesi kural eklemeye, değiştirmeye, silmeye ve aramaya izin verir; ayrıca “yalnızca tetiklenemeyen kurallar” filtresi vardır: boş ya da görünmez desen, derlenmeyen veya felaket düzeyinde geri izleme yapan düzenli ifade, bir URL için fazla kısa ve noktasız desen, artık var olmayan kategori. Bu tanı PHP'de yapılır, çünkü bir ifadenin derlenip derlenmediğini yalnızca PCRE motoru söyleyebilir.

Engelleme ayarları

AyarVarsayılanDeğerler
compliance_stricttrueboole
blocker_unknown_script_policyallowallow, block
blocker_unknown_iframe_policyblockallow, block
blocker_block_resource_hintstrueboole
blocker_allowlist''satır başına bir ana bilgisayar

Genişletme noktaları

// blocker_allowlist'e ek olarak asla engellenmeyecek ana bilgisayarlar.
add_filter( 'owc_blocker_allowlist', function ( array $hosts ) {
    $hosts[] = 'cdn.is-ortagim.example';
    return $hosts;
} );

// Doğrulamadan önceki katalog satırları.
add_filter( 'owc_scripts_catalog', function ( array $rows ) {
    $rows[] = array(
        'pattern'      => 'tracker.example.com',
        'pattern_type' => 'host',
        'match_target' => 'url',
        'name'         => 'Örnek',
        'vendor'       => 'Örnek A.Ş.',
        'category'     => 'analytics',
    );
    return $rows;
} );

OWC_Blocker::block_html_fragment( $html ) genel metodu, çıktı tamponundan geçmemiş bir parçaya engellemeyi uygular.

Engellemenin sınırları

  1. compliance_strict olmadan yalnızca WordPress'in kuyruğa aldığı betikler işlenir.
  2. Bilinmeyen bir üçüncü taraf betiğine varsayılan olarak izin verilir. Gerçek engelleme kataloğa ve satır içi imzalara dayanır — onları zenginleştirin.
  3. JavaScript ile enjekte edilen betiklerin koruması yalnızca yirmi ana bilgisayarı kapsar; birinci taraf kodla enjekte edilen, listede olmayan bir izleyici geçer.
  4. functional sınıfındaki stil dosyaları (web yazı tipleri) bilerek geçirilir.
  5. <img> içinde kataloğa girmiş ama analytics ya da marketing dışında sınıflandırılmış bir izleyici etkisizleştirilmez.
  6. Medyalar (object, embed, source, video, audio) varsayılan olarak asla engellenmez: yalnızca kataloğa girmiş bir üçüncü taraf işlenir.
  7. 8 MB'ı aşan bir belge, bir PCRE başarısızlığı ya da içeriğin %50'sinden fazlasının kaybı, hiçbir engelleme yapılmadan sunulan bir sayfa verir; sessizce.
  8. Rızanın geri çekilmesi sayfanın tamamen yeniden yüklenmesine yol açar.

İzleyici tarama aracı

Tarama aracı, sayfalarınızın gerçekte neyi yüklediğinin envanterini çıkarır. Varsayılan olarak kapalıdır: Scanner sekmesinden açın.

Üç tespit kaynağı

Her bulgu kendi kaynağını ve “engelleme buna müdahale edebilir mi” bilgisini saklar.

1. Sunulan HTML. Tarama aracı kendi sitenizin URL'lerinden bir örneklem alır ve işaretlemeyi okur: <script src> ve <script data-owc-src> — yani zaten engellenmiş betikler de görülür —, satır içi imzalar, <iframe>, harici stil dosyaları ve URL'sinde 1x1, pixel, track, beacon veya impression geçen görseller. Hiç JavaScript çalıştırılmaz: bir etiket yöneticisinin çalışma zamanında enjekte ettiği, bu geçiş için görünmezdir.

2. Set-Cookie başlıkları. Sunucu taramasının ispatlayabildiği tek çerezler bunlardır; bir tarayıcı sondasının asla göremeyeceği HttpOnly çerezler dahil. Bunlar engellenemez olarak işaretlenir: istemci tarafındaki engellemede hiçbir şey, sunucunun gönderdiği bir çerezi tutamaz. Eklentinin kendi çerezleri yok sayılır.

3. Tarayıcı sondası. Yalnızca manage_options yetkisine sahip, oturum açmış bir kullanıcı için ve yalnızca tarama aracı açıksa alt bilgide basılır. Yüklemede document.cookie içeriğinin fotoğrafını çeker, DOM mutasyonlarını izler — bir etiket yöneticisinin enjekte ettiğini yakalayan budur —, istemci tarafında yazılan çerezler için document.cookie değerini her 5 saniyede bir sorgular ve gözlemlerini her 2 saniyede bir ve beforeunload olayında gönderir. Sondayı taşıyan yanıt önbelleklenemez olarak işaretlenir.

Kodda kabul edilen sınır: bir yönetici genellikle her şeyi çoktan kabul etmiştir. Dolayısıyla sonda, rıza öncesi durumu değil, rıza sonrası durumu tarif eder.

Tarama

URL kuyruğu sayfaları değil şablonları kapsayacak şekilde kurulur: önce çekirdek URL'ler (ana sayfa, statik ana sayfa, yazılar sayfası ve bağlı dört politika sayfası), ardından aileye göre sırayla (round-robin) geçiş — en fazla 30 sayfa, 15 yazı, herkese açık her özel içerik türünden 5, 3 kategori ve 3 etiket. Bu sıralı geçiş olmasaydı birbirine neredeyse özdeş otuz sayfa bütçenin tamamını yer ve WooCommerce şablonlarına hiç ulaşılamazdı.

owc_scanner_urls filtresi URL eklemeye izin verir, ama sonuç yeniden sitenin ana bilgisayarıyla sınırlandırılır: tarama aracı alan adınızın dışına asla çıkmaz.

Her istek şu koşullarla yapılır: yönlendirmeler elle izlenir (en fazla iki sıçrama, her sıçrama sitenin ana bilgisayarına karşı yeniden test edilir), yanıt 2 MB ile sınırlanır, bir önbellek sayfası okunmasın diye Cache-Control: no-cache, no-store başlığı ve benzersiz bir URL parametresi eklenir, kullanıcı aracısı OW-Consent-Scanner/<sürüm> olur. HTML olmayan bir yanıt başarısızlık değil, atlanmış sayılır.

Engellemenin çekilip ham HTML'i göstermesi için X-OWC-Scanner başlığında bir atlatma sırrı gönderilir. Sabit zamanda karşılaştırılır ve sıradan bir ziyaretçi seçeneğin okunmasını bile tetiklemesin diye başlık en başta test edilir.

Bütçe, kilit, kaldığı yerden devam

KısıtDeğer
Çalıştırma başına URLscanner_max_urls, varsayılan 25, sınırlar 1–500
İstek başına zaman aşımıscanner_timeout, varsayılan 8 sn, sınırlar 1–60
Grup başına süre bütçesimax_execution_time − 10 sn, yoksa 45 sn, 5 ile 60 sn arasında sınırlı
Çalıştırma kilidi15 dakika
Kuyruğun ömrü6 saat

Bütçe tükenirse bir dakika sonrasına devam planlanır ve tarama kaldığı yerden sürer. Bir tarama sürerken ikinci bir başlatma “zaten bir tarama sürüyor” yanıtını verir. Kısa devre: hiçbir sayfa okunmadan üç istek başarısız olursa tarama, yirmi iki URL daha için süresini yakmak yerine durur — bu, tipik olarak HTTP loopback'i engellenmiş bir sitenin durumudur.

Tanınan satır içi imzalar

Yirmi bir etikette gruplanmış yirmi üç arama dizesi: 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.

Yinelenenleri ayıklama anahtarı, gövdenin özeti değil, imzanın kendisidir: gerçek bir gtag ya da Pixel kodu sayfaya özgü değerler içerir, bu da sayfa başına bir satır anlamına gelirdi.

Geri besleme döngüsü: bulgu → katalog → engelleme

Tarama aracını yararlı kılan nokta budur. Bir izleyiciyi sınıflandırmak, engelleme kataloğuna bir kural yazar. Bir bulgunun kategorisine tıklamak üç şey yapar: kategoriyi satıra yazar, elle verdiğiniz kararı hatırlar ve karşılık gelen kuralı oluşturur. Her tam taramanın sonunda, kataloğun sınıflandıramadıkları için aynı işlem toplu olarak yapılır.

Dönüştürme kuralları:

  • cookie türünde bir bulgu, çerez adı üzerinde match_target = cookie kuralına dönüşür;
  • inline_script türünde bir bulgu, yalnızca özgün arama dizesi bulunabilirse bir kural yazar. Bulunamazsa hiçbir kural yazılmaz: “Google gtag (config)” etiketinden kurulmuş bir kural sonsuza dek ölü olurdu ve bulgunun adıyla eşleşerek onu sonsuza dek “kapsanmış” gösterirdi;
  • aksi halde, alan adı boşsa reddedilen bir host kuralı yazılır.

Elle verdiğiniz kararlar ayrı saklanır (en fazla 500) ve her yeni gözlemde yeniden uygulanır; çünkü “onaylandı” bayrağı aynı zamanda “bir katalog kuralı eşleşti” anlamına gelir ve dolayısıyla “yönetici karar verdi” bilgisini tek başına taşıyamaz. “Sınıflandırılmamış” olarak yeniden işaretlemek girdiyi siler: bu gerçek bir geri alma.

Katalog, en uzun desen önce karşılaştırılır; böylece geniş bir kural (google-analytics.com) sizin yazdığınız daha kesin kuralı (www.google-analytics.com) ezmez.

Planlama, uyarılar, saklama

scanner_frequency ayarı hourly, twicedaily, daily ve weekly değerlerini kabul eder — ama yönetim ekranı yalnızca kurulumunuzun gerçekten tanıdığı tekrarları önerir. Varsayılan: weekly. Tarama aracını kapatmak iki olayı da planlamadan çıkarır.

İki ayrı e-posta, asla ikisi birden değil:

  1. Sınıflandırılmamış izleyiciler — yalnızca gerçekten yeni tanımlayıcılar için gönderilir, 500 girdiyle sınırlı bir hafızayla.
  2. “Tarama bu siteyi okuyamadı” — hata imzası başına haftada bir mesajla sınırlıdır. En ağır arıza modu budur, çünkü hiçbir şey okumayan bir tarama hiçbir bulgu üretmez, dolayısıyla birinci türden hiçbir uyarı da çıkmaz.

Alıcı: scanner_alert_email, yoksa sitenin yönetim adresi.

Saklama: 90 gün. 90 gündür yeniden görülmeyen bulgular, yalnızca bir tarama bittiğinde değil, en az bir sayfa okunur okunmaz silinir.

Kapsam paneli

Scanner sekmesinin en önemli bölümü burasıdır ve üretilen belgelerdeki uyarı kutusunu da besler. Her zaman şu sorulara yanıt verir:

  • daha önce hiç tarama başlatıldı mı?
  • sonuncusu bitti mi, yoksa süre bütçesi yüzünden mi kesildi?
  • kaç sayfa gerçekten alındı (kuyruktan çıkarılan değil)?
  • kaç sayfa alınamadı ve ilk hata neydi?
  • bir tarayıcı daha önce hiç bir şey bildirdi mi, yoksa hiç JavaScript gözlemlenmedi mi?
  • yeniden görülmeyen bir izleyicinin kaybolduğu pencere nedir?

Hiçbir sayfaya ulaşamayan bir tarama, temiz bir sonuç olarak değil, bir başarısızlık olarak sunulur. Bu bulgular üzerine kurulu bir çerez politikası yayımlamadan önce okumanız gereken panel budur.

Scanner sekmesi

Üç kart (tespit edilen izleyiciler, sınıflandırılmamışlar, son tarama ve bir sonraki çalıştırma), kapsam paneli, bir “şimdi tarama başlat” düğmesi, planlama formu, ardından bulgu listesi: kategoriye göre filtreler, metin araması, öğe türüne göre filtre (script, inline_script, iframe, stylesheet, pixel, cookie, link, preconnect), duruma göre filtre, CSV dışa aktarımı, 25'lik sayfalama. Tek tek veya toplu sınıflandırma — toplu seçicinin ilk öğesi boş ve devre dışıdır; böylece yanlışlıkla gönderilen bir form genel bir sınıf değişikliğine dönüşmez.

Tarama aracı ayarları

AyarVarsayılanSınırlar
scanner_enabledfalseboole
scanner_frequencyweeklyhourly, twicedaily, daily, weekly
scanner_max_urls251–500
scanner_timeout81–60
scanner_probe_modeadminsadmins, off
scanner_alert_email''e-posta adresi

Bilinmesi gereken: scanner_probe_mode bu sürümde kullanılmıyor. Kod bunu açıkça belirtir — sondanın basılma koşulu artık bu ayarı okumaz ve yalnızca scanner_enabled değerine bakar. off değerini kaydetmek, değeri sondayı kapatmadan saklar. Sondayı gerçekten durdurmak için tarama aracını kapatın.

Tarama aracının sınırları

  1. Sunucu taraması hiç JavaScript çalıştırmaz. Sonda olmadan, bir etiket yöneticisinin enjekte ettikleri envanterde yer almaz.
  2. Sonda yalnızca oturum açmış yöneticilere ayrılmıştır ve onu sıradan bir ziyaretçi için çalıştıracak hiçbir mod yoktur: bu, kendi ön bilgilendirmesini gerektirirdi.
  3. Set-Cookie başlığıyla bırakılan bir çerez tespit edilir ama engellenemez.
  4. Tarama alan adının dışına asla çıkmaz ve varsayılanda 25 URL ile sınırlıdır: büyük bir site asla bütünüyle kapsanmaz.
  5. HTTP loopback'in engellendiği bir sunucuda (ön üretim HTTP kimlik doğrulaması, güvenlik duvarı) tarama hiçbir şey okumaz.
  6. 90 gündür yeniden görülmeyen bir bulgu kaybolur ve dolayısıyla çerez politikasından da çıkar.
  7. Tarama aracı WP-Cron'a bağlıdır: DISABLE_WP_CRON tanımlı ve sistem cron'u olmayan bir sitede planlı tarama tetiklenmez.

Yasal belge üreteci

Dört belge

TürİçerikMevcut diller
cookie_policyÇerez politikasıFransızca, İngilizce, Portekizce
privacy_policyGizlilik politikasıFransızca, İngilizce, Portekizce
legal_noticeYasal bilgileryalnızca Fransızca
termsKullanım ve satış koşullarıyalnızca Fransızca

Üretilen her belge, meta verilerle sürümlenmiş bir WordPress sayfasıdır: _owc_policy_type, _owc_policy_version (her üretimde artar), _owc_policy_hash (HTML'in SHA-256 özeti), _owc_policy_generated_at, _owc_policy_profile, _owc_policy_lang, _owc_policy_manual_edit.

Üretimden sonra bağlantı, karşılık gelen ayarlara geri yazılır (link_cookie_policy, link_privacy_policy, link_legal_notice, link_terms) ve bir gizlilik politikasının yayımlanması WordPress'te bildirilen politika sayfasını günceller.

Yayından önce iki kilit

Kilit 1 — zorunlu alanlar. Üretim, boşluklu maddeler yayımlamak yerine boş anahtarların listesiyle reddedilir.

Belgeİstenen alanlar
Tümülegal_company_name, legal_company_email
Çerez politikası hariç+ legal_company_address, legal_country
Yasal bilgiler+ legal_company_phone, legal_publication_director, legal_host_name, legal_host_address, legal_host_phone
Yasal bilgiler, ülke FR / BE / LU+ legal_company_legal_form, legal_company_reg_number

Kilit 2 — dil. Üreteç, yargı bölgesinin kullanmadığı bir dilde yazılmış bir belgeyi yayımlamayı reddeder. Önizlemede belge kırmızı bir uyarı şeridiyle çıkar; yayında ise net bir ret vardır. Policies sekmesinde, etkin tür ve profil için hiçbir şablon yoksa üretim düğmesi görünüp sürekli başarısız olmak yerine gizlenir.

Dil çözümü

ProfilBelgenin dili
quebecFransızca
lgpdPortekizce
legal_country ∈ {FR, BE, LU} olan gdprFransızca
Geri kalan her şeyİngilizce

Zorunlu uyarı

policy_disclaimer açık olduğu sürece — ve varsayılan olarak açıktır — her belge, metnin otomatik üretilmiş bir şablon olduğunu ve yayımlanmadan önce nitelikli bir profesyonele okutulması gerektiğini söyleyen, üretim tarihini ve eklenti sürümünü taşıyan bir blokla biter. Bunu ancak sonuçlarını bilerek kapatın.

İzleyici tablosu — dürüstlük kuralları

Çerez politikasında yayımlanan tablo, üçüncü taraf bir veritabanından değil, sizin tarama tablonuzdan gelir. Gösterdiğini beş kural yönetir.

  1. Tazelik penceresi: yalnızca son 90 günde yeniden görülen bulgular yayımlanır. Bir geçiş uygulanmadığı için son gözlem sütunu henüz yoksa, izleyicisi olan bir sitede “izleyici yok” yayımlamak yerine pencere yok sayılır — eksik ifşa, bir hukuki belgenin asla başarısız olmaması gereken tek yöndür.
  2. Tablonun başında bir uyarı kutusu, tarama aracının kapsam panelinden türetilir: hiç tarama başlatılmamış, hiç sayfa okunmamış, tarama kesilmiş, N URL başarısız, JavaScript etkinken hiç gözlem yok, N günlük pencere. Eksik bir tarama, tamamlanmış bir envanter gibi yayımlanmaz, ifşa edilir.
  3. Sınıflandırılmamış izleyiciler gizlenmez: kendi bölümleri vardır. Kimsenin incelemediği izleyiciler bunlardır.
  4. Bir Set-Cookie başlığında gözlemlenen bir çerez ayırt edici bir işaret taşır; sunucu tarafından bırakıldığını ve hiçbir istemci engellemesinin onu tutamayacağını açıklayan bir notla birlikte. Bu yüzden rızaya bağlıymış gibi sunulmamalıdır ve sınıflandırılmamış izleyicilerin yalnızca rızadan sonra bırakıldığını söyleyen madde, ilgili istisnayı taşır.
  5. Sorumlunun adı ve politikasının bağlantısı katalogdan gelir, yalnızca bir URL'yi hedefleyen kurallar için. Çerez adı desenleri dışarıdadır: hukuki bir belgede, kanıt olmadan kimin veri işlediği iddia edilmez.

Sitenin çerezleri ve yayımlanan süreler

“Bu sitenin bıraktığı çerezler” bölümü eklentinin kendi çerezlerini listeler: owc_consent (süresi yenileme ayarından türetilir), TCF açıksa euconsent-v2, bölgesel tespit açıksa owc_geo, owc_gpc (oturum süresi), owc_gpc_notice (5 dakika), artı WordPress'in oturum ve ayar çerezleri.

Saklama süreleri tablosu, sayılarını gerçek ayarlardan alır: ledger_retention_days, retention_form_data_days, retention_dsar_days ve rızanın yenilenme süresi. Süs olsun diye hiçbir değer yayımlanmaz. Rıza çerezinin süresi, çerezin kendisiyle aynı hesaptan türetilir; bu da 0 aylık bir ayarın “asla” değil, “13 ay” olarak yayımlanmasını garanti eder.

Faaliyet türünün tespiti (kullanım ve satış koşulları)

Kullanım ve satış koşulları 21 bölümden oluşur; satıcı/hizmet sağlayıcı, ürün/hizmet, teklif/sipariş geçişleri ve faaliyet türüne özgü maddeler içerir.

legal_business_type (auto, vitrine, rental, ecommerce, services, saas, content) doğruluk kaynağıdır. Değeri auto olduğunda bir buluşsal yöntem siteyi inceler — WooCommerce'in varlığı, açık kayıt, abonelik eklentileri, fiyat sayfası, hizmet sayfaları, ardından son elli yayımlanmış içerikteki anahtar kelime yoğunluğu — ama verdiği karar yayımlanan bir belgeye asla basılmaz: yalnızca isteğe bağlı maddeleri seçmeye yarar.

Fransız mevzuatına yapılan atıflar yalnızca legal_country FR ise eklenir. Belçika'nın kendi atıfları vardır (CDE md. VI.45 §1er, md. VI.47, Tüketici Arabuluculuk Servisi); Lüksemburg ve Québec nötr bir ifade alır. Doğrulanmamış bir metni anmak, çare değil, hatanın kendisi olurdu.

Diğer davranışlar

  • Belgenin tarihi, belgenin yerel ayarına göre biçimlendirilir. İlgili çeviri paketi kurulu değilse biçim gg/aa/yyyy olarak değişir: Fransızca bir belge “4 September 2026” ile açılamaz.
  • Elle düzenleme tespiti: saklanan içerik artık özetine uymuyorsa, üzerine yazmadan önce bir revizyon kaydedilir ve ekranda, revizyonlara bağlantı veren “elle yapılan değişiklikler değiştirildi” rozeti gösterilir.
  • Üreteç asla geri adım attırmaz: yayımlanmış bir sayfa, “yayımla” kutusu işaretsiz olsa bile yayımda kalır ve yeniden adlandırdığınız bir başlık ya da kalıcı bağlantı yeniden üretimden sağ çıkar.
  • Alt bilgi menüsüne ekleme: auto_footer_menu_inject, varsayılan olarak kapalı. Eklenti, açık bir talep olmadan herkese açık sitenizi değiştirmez. Açtığınızda tanınan konumlar: footer, footer-menu, footer_menu, footer-1, footer_1, secondary, legal.

Genişletme noktaları

// Şablonun ham gövdesi, {{değişkenler}} hâlâ yerinde.
add_filter( 'owc_policy_template', function ( $html, $type, $profile ) {
    return $html;
}, 10, 3 );

// Şablona enjekte edilen değişkenler.
add_filter( 'owc_policy_vars', function ( array $vars, $type, $profile ) {
    return $vars;
}, 10, 3 );

// Değişkenleri değiştirilmiş, nihai HTML.
add_filter( 'owc_policy_html', function ( $html, array $vars ) {
    return $html;
}, 10, 2 );

owc_policy_template ile kendi gövdenizi sağlamak dil kilidini devre dışı bırakır: kendi metnini sağlayan bir site, dilinin sorumluluğunu da üstlenir. Fransızca olmayan yasal bilgiler yayımlamanın resmî yolu budur.

Önceden üretilmiş dört blok, ayrılmış değişkenler olarak kullanılabilir: {{__trackers_table__}}, {{__categories_list__}}, {{__retention_table__}}, {{__jurisdictional_rights__}}. Tüm değişkenler kullanıldıkları bağlamda zaten kaçışlanmıştır. Üçüncü taraf bir şablonun yeniden kullanabileceği üç genel metot vardır: OWC_Policies::build_cookie_table(), build_data_retention_table() ve render_first_party_cookies().

REST rotaları

MetotYolParametrelerErişim
POST/owc/v1/policies/generatetype (zorunlu), publish (boole, varsayılan false)manage_options
GET/owc/v1/policies/previewtype (zorunlu)manage_options

Önizlemenin HTML'i, döndürülmeden önce wp_kses_post() süzgecinden geçer.

Üretecin sınırları

  1. Bunlar şablondur, hukuki danışmanlık değil. Okutun.
  2. Yasal bilgiler ile kullanım ve satış koşulları yalnızca Fransızca vardır. Diğer her yargı bölgesi, kendi gövdenizi sağlamadığınız sürece dil kilidine takılır.
  3. Yalnızca üç dil: Fransızca, İngilizce, Portekizce.
  4. AEA'da dört ülkenin adı geçen bir otoritesi vardır; diğerlerinde genel bir ifade.
  5. İzleyici tablosu ancak taramanız kadar değerlidir — ve belge bunu söyler.
  6. Üreteç sınıfı yaklaşık 440 KB hukuki şablon taşır: yalnızca üç giriş noktasından biri gerçekten çağrıldığında tembel olarak yüklenir.

Rıza kayıt defteri

Kayıt defteri, GDPR'nin 7.1 maddesine verilen yanıttır: kişinin rıza gösterdiğini ispatlayabilmek. Varsayılan olarak açıktır.

Tablo

{prefix}owc_ledger, tüm tarihler UTC:

SütunTürİçerik
idbigintBirincil anahtar
created_atdatetimeUTC zaman damgası
visitor_tokenchar(32)Tarayıcının takma adlı token'ı, 32 onaltılık karakter
eventvarchar(20)accept_all, reject_all, save_preferences, withdraw, auto, gpc_opt_out
categoriesvarchar(255)İzin verilen kategorilerin listesi
profilevarchar(20)Eylem anında yürürlükte olan uyumluluk profili
sourcevarchar(60)banner, preferences, footer_link, api, auto
ip_pseudonymousvarchar(45)Kırpılmış IP
ua_hashchar(64)User-agent'ın tuzlanmış özeti
page_urlvarchar(500)Eylemin gerçekleştiği sayfa
prev_hashvarchar(128)Önceki satırın özeti
row_hashvarchar(128)Bu satırın özeti
policies_hashchar(64)Yürürlükteki belgelerin özeti
banner_revisionvarchar(40)Gerçekte gösterilen banner'ın özeti
plugin_versionvarchar(20)Yazma anındaki eklenti sürümü

Son üç sütun, ziyaretçinin yalnızca neyi işaretlediğini değil, ne gördüğünü de yeniden kurmayı sağlar.

Zincir

Her satır, kendi içeriğinin ve önceki satırın özetinin uzunluk önekli kanonik bir serileştirmesi üzerinden HMAC ile imzalanır. Genesis, 64 sıfırdan oluşan bir dizidir. Yazma, son kayıt üzerinde bir satır kilidiyle bir işlem içinde yapılır: eşzamanlı yazmaları gerçekten sıraya sokan ve zincirin çatallanmasını engelleyen bu kilittir. İkinci bir siper olarak MySQL adlandırılmış kilidi elden geldiğince alınır: reddedilirse ekleme sürer ve bunu izleyebilmeniz için bir eylem tetiklenir.

Değerler imzalanmadan önce kırpılır; böylece imzalanan değer, saklanan değerin tam kendisidir.

Kurcalamaya karşı kanıt konusunda dürüstlük

Eklenti, imza anahtarının kaynağını kendisi belirler:

KaynakKoşulSonuç
constantOWC_LEDGER_KEY tanımlıKurcalamaya karşı kanıtlı
wp-configAUTH_KEY ve AUTH_SALT tanımlı, boş değil, birbirinden farklı ve varsayılan ifadeyi içermiyorKurcalamaya karşı kanıtlı
databaseDiğer durumlardaKanıtsız

Üçüncü durumda WordPress salt'ları veritabanında saklar: veritabanına erişebilen herkes zinciri yeniden imzalayabilir. Eklenti bunu doğrulama sonucunda bildirir ve açık açık söyleyen bir yönetim uyarısı gösterir. Anahtarın geri döndürülemez bir özeti saklanır; bu da bir salt rotasyonunu bir yeniden yazımdan ayırmayı sağlar.

Kurulum bölümünün OWC_LEDGER_KEY tanımlamayı önermesinin nedeni budur.

Doğrulama

Audit ledger sekmesindeki “Verify the chain now” düğmesi — ya da GET /owc/v1/ledger/verify rotası — zincirin tamamını 500 satırlık gruplar halinde dolaşır.

Üç imza şeması tanınır: mevcut kanonik şema, daha eski bir tarihsel şema ve ilk sürümlerden kalma anahtarsız bir şema. Sonuncusu, veritabanına sahip herkesin yeniden hesaplayabileceği bir özet üretir: asla geçerli sayılmaz, ayrıca sayılır ve bir kopma olarak bildirilir. Anahtarsız bir özet kanıt değildir.

Bildirilen kopmalar: hash_mismatch, chain_break, bad_genesis, unkeyed_rows, table_emptied, tail_truncated, head_mismatch, count_mismatch.

Sonuç şunları taşır: ok, total, checked, table_total, broken_at, breaks, break_count, partial, legacy_rows, unverifiable_rows, anchor, anchor_ok, key_source, tamper_evident, key_rotated.

Baş çıpası

Tablonun dışında bir çıpa saklanır: tanımlayıcı, özet, satır sayısı, zaman damgası. O olmadan en yeni satırları silmek ya da tabloyu boşaltmak hiçbir iz bırakmazdı. Çıpa her ilerlediğinde bir eylem tetiklenir ve kod, genel bir yeniden oynatmanın fark edilebilmesi için çıpanın veritabanı dışına — dosyaya, syslog'a, harici bir uç noktaya — kopyalanmasını açıkça önerir.

Eklenti var olan bir çıpanın üzerine yazmayı reddeder ve tablonun kendisinden türetilmiş bir çıpanın yalnızca sonraki kırpmaları tespit edilebilir kıldığını dürüstçe belirtir.

Saklama

ledger_retention_days, varsayılan 1825 gün (5 yıl), sınırlar 0–3650. 0 değeri sınırsız saklama demektir.

Budama kendi günlük cron'unda çalışır ve yalnızca bitişik bir öneki kaldırır: zincirin ortasında asla delik açılmaz. Kalanın doğrulanabilir olması için silinen son satırın özeti hatırlanır. Çalıştırma başına tavan: 20.000 satır (500'lük 40 grup). Çok büyük bir budama gecikmesi böylece birkaç güne yayılarak kapanır.

Veri minimizasyonu

  • IP adresi: IPv4'te son sekizli sıfırlanır (/24 korunur), IPv6 /48'e kırpılır ve kalan 80 bit sıfırlanır. Maskeleme ikili biçim üzerinde yapılır; IPv4'ü eşleyen bir IPv6 adresi IPv4 gibi işlenir.
  • User-agent: dizenin kendisi değil, yalnızca tuzlanmış bir özeti saklanır.
  • page_url: sitenin ana bilgisayarlarına karşı doğrulanır. Çağıran taraf esastır — değeri verirse, boş bile olsa, yanıt odur; Referer yalnızca hiçbir şey söylemediyse incelenir ve aynı şekilde doğrulanır.
  • Ziyaretçi token'ı: kriptografik bir üreteçten gelen, kimlikle hiçbir bağı olmayan 32 onaltılık karakter.

Algoritma

ledger_hash_algo, sha256 (varsayılan) ve sha3-256 değerlerini kabul eder; bunlar PHP'nizin gerçekten desteklediği algoritmalarla kesiştirilir. Ayar yönetimde görünür ama değiştirilemezdir: algoritma değiştirmek, var olan tüm satırların doğrulamasını başarısızlığa uğratırdı. Sütunlar daha geniş boyutlandırılmıştır, ama gerçek seçim bu iki algoritmayla sınırlıdır.

Audit ledger sekmesi

25'lik sayfalanmış liste: tanımlayıcı, yerel tarih ve ham UTC zaman damgası, ziyaretçi token'ı, olay, kategoriler, profil, takma adlaştırılmış IP ve zincir halkası (önceki özet → geçerli özet, ekranda kırpılır, tam değer ipucu balonunda).

Filtreler: ziyaretçi token'ı (32 onaltılık), olay, profil, tarih aralığı — girişler sitenin saat diliminde yapılır ve gerçekte saklanan UTC zaman damgalarıyla karşılaştırılır.

CSV ve JSON dışa aktarımları. JSON bir zarf taşır (biçim, algoritma, anahtarın kaynağı); böylece bir otorite, zincirin geri kalanına sahip olmadan kesiti yeniden doğrulayabilir. Tüm CSV hücreleri, elektronik tablo formül enjeksiyonuna karşı etkisizleştirilir.

Kayıt defterini API üzerinden okumak

GET /owc/v1/ledger şu parametreleri kabul eder: page, per_page (1–200, varsayılan 50), visitor_token, from ve to. Son üçü, zincirin tamamını dolaşmadan bir erişim talebine (md. 15) yanıt vermeyi sağlar. Sınırlar UTC olarak okunur ve YYYY-AA-GG biçimindeki bir tarih gün boyuna genişletilir. Gerçekten uygulanan filtreler yanıtta döndürülür: denetimlerce reddedilen bir filtre, “işte kayıt defterinin tamamı” gibi okunmamalıdır.

Kayıt defteri bir yazmayı reddettiğinde ne olur

Bu, eklentinin tamamındaki en önemli davranıştır. Kayıt defteri açıksa ve satırın yazılması başarısız olursa, rıza çerezi iptal edilir ve yanıt 503 olur. Hiçbir şey saklanmaz, hiçbir izleyici serbest bırakılmaz.

Gerekçe doğrudandır: ispatlanamayan bir rıza öne sürülmemelidir. İzlenecek yol için bkz. Sorun giderme.

Genişletme noktaları

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 );

Çıpayı veritabanının dışına kopyalamak için kullanılacak kanca owc_ledger_anchor'dır.

Kayıt defterinin sınırları

  1. Kurcalamaya karşı kanıt koşulludur ve eklenti bunu kendisi söyler.
  2. 1.2.0 öncesindeki satırlar anahtarsız bir özet taşır: asla yeniden imzalanmazlar — yeniden imzalama, bir saldırganın tahrif edilmiş bir geçmişi imzalatmasına yol açardı — ve var oldukları sürece “zincir sağlam” sonucunu engellerler.
  3. Saklama, günlük çalıştırma başına 20.000 satırla sınırlıdır.
  4. Kayıt defteri, WordPress'in kişisel veri silicisi tarafından silinmez: bu bir hash zinciridir, kaldırmak var olma nedeni olan kanıtı yok ederdi ve içinde yalnızca takma adlı bir token ile kırpılmış bir IP vardır. Bir mesaj, bu tercihi veri sahibine açıklar.

Haklar portalı (DSAR)

Portal, bir kişinin haklarını sitenizdeki bir sayfadan kullanmasını sağlar. Varsayılan olarak açıktır, ama yalnızca kısa kodu yerleştirdiğiniz yerde görünür.

Form

[owc_dsar_form]

Nitelikler:

NitelikVarsayılanGörevi
typesaccess,rectification,erasure,portability,restrict,object,optoutSunulan türler, virgülle ayrılmış
title“Kişisel verilerim üzerindeki haklarımı kullanmak istiyorum”Bloğun başlığı
submit_label“Talebimi gönder”Düğmenin etiketi

dsar_enabled kapalıysa kısa kod “portal kapalı” mesajını gösterir ve REST rotası 404 yanıtı verir: kapatma gerçekten sunucu tarafındadır.

İstediğiniz liste, sunucunun kabul ettiği listeyle kesiştirilir: uç noktanın reddettiği bir seçenek ziyaretçiye asla sunulmaz.

Sekiz talep türü

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

withdraw, formun sunduklarından bilerek çıkarılmıştır. Çerez rızasını geri çekmek tercih panelinde anlıktır; bunu 30 günlük yazılı bir prosedüre bağlamak, geri çekmeyi rıza vermekten zor hale getirirdi (GDPR md. 7.3). Formun altındaki bir bağlantı, bu durum için doğrudan tercih panelini açar.

owc_dsar_types filtresi tek doğruluk kaynağıdır: uç noktanın izin listesi ondan türetilir.

Tam döngü

1. Gönderim. POST /owc/v1/dsar. Şu sırayla üç sunucu koruması:

  • Bot tuzağı: doldurulmuş gizli bir alan, hatalı biçimli bir gönderimin genel mesajıyla 400 reddine yol açar — bot, reddin nedeni hakkında hiçbir şey öğrenmez. Tarayıcı tarafında form, hiçbir şey göndermeden başarı mesajını bile gösterir.
  • Beyan (md. 12.6): “KENDİ kişisel verilerim üzerinde bir hak kullandığımı onaylıyorum” kutusu işaretlenmelidir ve bu yalnızca tarayıcıda değil, sunucu tarafında doğrulanır. Talep ile birlikte kaydedilir.
  • Formun görünmesi ile gönderim arasında en az 3 saniyelik gecikme, istemci tarafında.

Hız sınırları: IP adresi başına saatte 3, hedeflenen e-posta adresi başına günde 3 — adresi saldırgan seçtiğine göre sınırlanması gereken de odur — ve tüm site için saatte 30.

Satır şu bilgilerle eklenir: pending durumu, yalnızca SHA-256 özeti saklanan 64 karakterlik bir token, token'ın son kullanma tarihi ve bir yanıt vadesi. Tanımlayıcı döndürülmez: numaralandırma yok, hacim sızıntısı yok. Yanıt {ok, mail_sent, message} biçimindedir ve mail_sent gerçek gönderim başarısızlığını yansıtır.

DPO bu aşamada bilgilendirilmez. Aksi halde anonim bir çağıran, her gönderimde alanınızdan iki e-posta gönderirdi.

2. Doğrulama e-postası. Bağlantı, token açık biçimde parametre olarak eklenmiş şekilde ana sayfanıza işaret eder. Geçerlilik: dsar_token_ttl_days, varsayılan 7 gün, sınırlar 1–90. E-posta bir Reply-To başlığı taşır ama asla yeniden yazılmış bir From taşımaz — zarfı yeniden yazmak, SPF'yi bozan şeydir. Yanıt adresi dsar_email, yoksa legal_dpo_email'dir; asla yayımlanmaması gereken site yönetim adresi değil.

3. Kimlik doğrulaması. Bağlantı, hiçbir şey çalıştırmayan bir sayfa açar: doğrulama, bir nonce ile korunan bir POST ile yapılır. Bir e-posta bağlantı tarayıcısının (Safe Links, URL Defense, gelen kutusu önizlemesi) kişinin yerine bir kimliği doğrulamasını engelleyen budur.

Sayfa, temanın dışında sunulan, noindex, nofollow ve önbelleklenemez başlıklar taşıyan bağımsız bir HTML belgesidir. Denemeler IP başına saatte 30 ile sınırlıdır. Yanıtlar birbirinden ayrıdır: bilinmeyen bir bağlantı için 404, zaten doğrulanmış bir bağlantı için 200, süresi geçmiş bir bağlantı için 410, süresi dolmuş bir nonce için 403, bir yazma hatası için 500, başarılı doğrulama için 200.

4. Doğrulamanın tetiklediği şeyler.

  • Durum verified olur.
  • Vade, doğrulamadan itibaren yeniden hesaplanır. Madde 12.3: süre, hiç doğrulanmamış bir gönderimden değil, talep tamamlandığı andan itibaren işler.
  • Token yakılır. Özeti ise bilerek saklanır; böylece bağlantısını yeniden açan bir kişi, her şeye yeniden başlamasını isteyen bir 404 yerine “zaten doğrulandı” mesajını okur. Tek kullanımlık olma, durum denetimiyle garanti edilir.
  • Kaydedilenler: doğrulama tarihi, kırpılmış IP, tarayıcının takma adlı token'ı — rıza kayıt defteri ile talep arasındaki tek olası köprü — ve ilişkili WordPress talebinin tanımlayıcısı.
  • Kimliği çoktan ispatlanmış bir WordPress yerel talebi açılır; yani doğrudan Araçlar → Kişisel Verileri Dışa Aktar / Sil kuyruğunuza düşer. Bu da uygulamanın yalnızca OW Consent'i değil, sitedeki tüm eklentileri kapsamasını sağlar. Eşleme: access ve portability → dışa aktarma; erasure → silme; diğer türler yerel bir talep açmaz.
  • Sorumlu, dsar_email ve dsar_notify_email adreslerinde bilgilendirilir; hiçbiri geçerli değilse yönetim adresine düşülür.

5. Uygulama. DSAR requests sekmesinin üzerindeki bir panel, doğrulanmış 20 talebi vadeye göre sıralanmış olarak, kalan ya da gecikilen gün sayısıyla birlikte listeler.

EylemDavranış
Verileri indir (JSON)Kimlik hiç doğrulanmamışsa 409 reddi. Dosyanın adı dsar-<id>-<YYYYAAGG>.json olur
Verileri silYalnızca erasure türündeki bir talep için ve yalnızca kimlik doğrulandıktan sonra sunulur. Talep, silmeden önce kapatılır; aksi halde işlemdeki talebin serbest metni kendi uygulamasından sağ çıkardı
+2 ayMd. 12.3 uzatması, yalnızca bir kez, en fazla 500 karakterlik bir gerekçeyle. Vade 60 gün geri gider, hatırlatmalar yeniden kurulur ve veri sahibine yeni vadeyi ve gerekçeleri içeren bir e-posta gönderilir
Kapatresolved veya rejected durumu, not zorunlu. Zaten kapatılmış bir talebi yeniden yazmak mümkün değildir ve hiç doğrulanmamış bir kimliğe “yerine getirildi” yazmak mümkün değildir
Bağlantıyı yeniden gönderYeni bir token üretir, bu da öncekini geçersiz kılar

Beş durum: pending, verified, resolved, rejected, expired.

Ekran, token'ı ya da özetini asla yüklemez ve talep sahibinin adını göstermez.

6. Süre takibi. Günlük cron üzerinde: vadeye göre en fazla 200 doğrulanmış talep dolaşılır, vadeden yedi gün önce bir hatırlatma, vade aşımında bir hatırlatma, her biri yalnızca bir kez. Bir yönetim şeridi, süresi geçmiş ve yedi günden az kalan talepleri bildirir.

7. Temizlik. Hiç doğrulanmamış gönderimler, token'larının süresi dolduktan sonra silinir; kapatılmış talepler ise retention_dsar_days süresinin ötesinde silinir. Ölçüm, gönderimden değil, kapatmadan başlar.

Taşınabilirlik paketi

Dışa aktarma, ow-consent/dsar-export biçiminde bir belge üretir; zaman damgası, site, veri sahibi, talep ve veri grupları ile birlikte. Sitede kayıtlı tüm dışa aktarıcıları çağırır, dışa aktarıcı başına 50 sayfaya kadar sayfalar ve 20 saniyede durur. Silme, aynı sınırlarla silici tarafında aynı şeyi yapar.

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

Dışa aktarmanın ve silmenin neyi kapsadığı, dolayısıyla sitenizde kurulu eklentilere bağlıdır: bu kancaların hiçbirini kaydetmeyen bir eklenti elle ele alınmalıdır.

WordPress'in yerel araçlarıyla entegrasyon

  • ow-consent anahtarı altında kayıtlı bir dışa aktarıcı, iki grupla: hak talepleri ve rıza kayıt defteri.
  • Silici:
    1. hiç doğrulanmamış gönderimler silinir — hiçbir ispat değeri yok, yalnızca kişisel veri;
    2. kapatılmış taleplerin serbest metni ve adı silinir, asgari satır (tarih, tür, durum) retention_dsar_days süresine kadar kanıt olarak (md. 5.2) korunur;
    3. hâlâ açık olan bir talep, silinmeden önce yanıtlanması gerektiğini açıklayan bir mesajla korunur;
    4. rıza kayıt defteri silinmez; nedeni yukarıda açıklanmıştır.
  • Eklenti ayrıca WordPress'in gizlilik politikası taslağını da besler.

Formun altındaki bilgilendirme

Formun altında, açılır bir blok 13. madde bilgilendirmesini taşır: sorumlunun kimliği ve adresi, gizlilik iletişimi, amaç ve hukuki dayanak (md. 6.1.c), toplanan veriler, alıcılar ve saklama süresi, yanıt süresi ve uzatma olasılığı, yetkili denetim otoritesi, politikaya bağlantı. Filtre: owc_dsar_form_notice( $html, $context ).

Gösterilen otorite, On bir uyumluluk profili bölümünde anlatılan türetmeden gelir ve yalnızca büyük harfle başlıyorsa kabul edilir: ham ayarı okumak, Güney Afrika, Hindistan, Avustralya ya da Kaliforniya'daki bir sitede Fransız otoritesini anmaya yol açardı.

JavaScript olmadan gönder düğmesi gizlenir ve bir mesaj iletişim adresini önerir — böylece tarayıcı, talep sahibinin adresini URL'ye ve dolayısıyla geçilen tüm sunucuların ve proxy'lerin günlüklerine yazacak yerel bir gönderim yapmaz.

DSAR ayarları

AyarVarsayılanSınırlar
dsar_enabledtrueboole
dsar_email''herkese açık iletişim ve bildirim alıcısı
dsar_notify_email''ek alıcı
dsar_response_days301–30 — asla bir aydan fazla değil
dsar_token_ttl_days71–90
retention_dsar_days1095 (3 yıl)1–3650

Genişletme noktaları

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 );

Portalın sınırları

  1. Kimlik tek bir faktöre dayanır: e-posta gidiş-dönüşü. Md. 12.6 kapsamındaki her ek kanıt, talebin notlarına elle girilir.
  2. Başarısız bir e-posta gönderimi döngüyü kilitler: yanıt mail_sent: false bilgisini verir ve form iletişim adresine yönlendiren bir mesaj gösterir, ama talep pending kalır ve yasal süre başlamaz.
  3. Vade hatırlatmaları ve temizlik WP-Cron'a bağlıdır.
  4. Talepler tablosu, ayarınız ne olursa olsun eklentinin kaldırılmasında her zaman silinir. Silmeden önce dışa aktarın.

CCPA opt-out'u: “Do Not Sell or Share”

ABD profilleri altında kanun; adlandırılmış, görünür ve opt-out'u gerçekten uygulayan bir denetim öğesi ister.

Yerleştirmenin iki yolu

Kısa kod, istediğiniz yere:

[owc_dnsmpi]
[owc_dnsmpi label="Kişisel bilgilerimi satmayın ve paylaşmayın" class="baglantim"]
NitelikVarsayılan
label“Do Not Sell or Share My Personal Information”
classowc-dnsmpi

Alt bilgiye otomatik ekleme: ccpa_inject_footer ayarı, varsayılan olarak açık, wp_footer üzerinde öncelik 20 ile render edilir.

Bir tıklama ne yapar

Bir tıklama opt-out'u uygular. Bir panel açmaz. Çalışma zamanı taze bir nonce alır, ardından footer_link kaynağıyla ve tüm isteğe bağlı kategoriler false olacak şekilde bir reject_all gönderir. Bağlantı aria-busy="true" durumuna geçer ve bir role="status" alanı durumu gösterir: “kaydediliyor”, ardından “opt-out'unuz bu tarayıcıda kaydedildi” ya da hata mesajı.

Kod gerekçesini anar: CCPA uygulama yönetmeliklerine göre (§7026(a)(1)), yalnızca bir panel açan bir bağlantı uyumlu bir mekanizma değildir.

fetch ve Promise olmadan yedek yol (eski WebView, gömülü tarayıcı): tıklama, reklam kategorileri önceden kapalı konumdayken tercih panelini açar.

Önbellek kısıtı

Sunulan HTML herkes için aynıdır. Bu yüzden bağlantı, sitenin yapılandırılmış profili ccpa ya da us_generic ise görünür olarak render edilir; değilse gizli render edilir ve bölgesel tespit çerezine göre, yargı bölgesi bunu gerektiren ziyaretçiler için istemci tarafında açığa çıkarılır.

Bölgesel tespit kapalıysa ve yapılandırılmış profiliniz ABD profillerinden biri değilse blok hiç basılmaz: ölü işaretleme yok.

Bu modülün JavaScript yapılandırmasında hiçbir ziyaretçi verisi yolculuk etmez — yalnızca profil listeleri, asla çözülmüş boole değeri değil.

Bu modülün kaynakları, Consent Mode reddinin bir etiket yöneticisi tetiklenmeden önce gtag'e ulaşabilmesi için alt bilgide değil, <head> içinde basılır. JavaScript yalnızca ES5'tir.

Sınırlar

  1. Tek tıklık denetim öğesi fetch ve Promise gerektirir.
  2. Bağlantı yalnızca ccpa ve us_generic profilleri altında zorunludur; diğer her profilde ne gösterilir ne de açığa çıkarılır.
  3. İstemci tarafındaki açığa çıkarma, bölgesel tespit çerezine ve dolayısıyla JavaScript'e bağlıdır.

Google Consent Mode v2

Modül varsayılan olarak açıktır (gcm_enabled).

Yedi sinyal

Consent Mode v2'nin yedi sinyali yayımlanır: ad_storage, ad_user_data, ad_personalization, analytics_storage, functionality_storage, personalization_storage ve security_storage. Eklentinin altı kategorisi bunlara tek bir doğruluk kaynağından eşlenir; bu da banner'ın, engellemenin ve bootstrap'ın birbirinden ayrışamayacağını garanti eder. Tablo, Çerez kategorileri bölümündedir.

Her türlü rızadan önceki varsayılan değerler

default çağrısı statik işaretleme olarak basılır ve update tarayıcıda hesaplanır: sayfayı önbelleklenebilir tutan budur.

SinyalOpt-in rejimiOpt-out rejimi
ad_storagedeniedgranted
analytics_storagedeniedgranted
ad_user_datadeniedgranted
ad_personalizationdeniedgranted
personalization_storagedeniedgranted
functionality_storagesite functional kategorisini sunuyorsa denied, aksi halde grantedgranted
security_storageher zaman grantedgranted

İki küme de aynı sayfada basılır. Çalışma zamanı, hangisinin uygulanacağını bölgesel tespit çerezine göre seçer. Bu olmasaydı önbelleğe alınmış bir sayfa, Amerikalı bir ziyaretçinin yargı bölgesini Avrupalı bir ziyaretçiye sabitlerdi.

İlgili iki ayar

AyarVarsayılanEtkisi
gcm_ads_data_redactiontruead_storage reddedildiği sürece reklam kimliklerini maskeler
gcm_url_passthroughtrueÇerezler reddedildiği sürece gclid / dclid değerlerini URL'ler üzerinden taşır

Bilinmesi gerekenler

security_storage bir güncellemeden asla etkilenmez: spesifikasyonun öngördüğü gibi verilmiş kalır. Kontrol paneli, Consent Mode'un etkin olup olmadığını gösteren bir kart sunar.


IAB TCF v2.2

TCF modülü varsayılan olarak kapalıdır ve eklentinin sağlayamayacağı bir tanımlayıcı ister. Açmadan önce sınırlar bölümünü okuyun.

Etkinleştirme

AyarVarsayılanSınırlar
tcf_enabledfalseboole
tcf_cmp_id00–4095
tcf_publisher_countryFR2 harfli ISO kodu
tcf_publisher_purposes_li[]amaç listesi
tcf_special_features[]özel özellik listesi

4095 tavanı keyfi değildir: CmpId alanı TCF dizesinde 12 bit kaplar.

Modülün hiçbir şey yayımlamayı reddettiği üç durum

  1. CMP ID yok (tcf_cmp_id < 1): __tcfapi yok, TC dizesi yok, euconsent-v2 çerezi yok, REST rotası yok. Bir yönetim uyarısı bunu açıklar. CMP ID size IAB Europe tarafından verilmelidir; eklenti bir tane sağlamaz. CmpId değeri 0 olan bir dize yayımlamak, hiçbir şey yayımlamamaktan kötü olurdu.
  2. 4095'ten büyük CMP ID: aynı ret, kendi uyarısıyla. 12 bite kırpılmış bir değer başka bir CMP'yi işaret ederdi — bir kimlik hırsızlığı.
  3. Önbellekte Global Vendor List yok: stub basılır ama API, bir liste sürüm numarası uydurmak yerine boş bir dizeyle cmpStatus: 'error' yanıtı verir.

Bir tanı bir seçeneğe yazılır (disabled, missing_cmp_id, no_gvl, active) ve yalnızca yönetim veya cron bağlamında, asla herkese açık bir sayfada değil.

Global Vendor List

  • Kaynak: https://vendor-list.consensu.org/v3/vendor-list.json.
  • Bir sayfa render edilirken asla indirilmez. Bunu günlük bir cron üstlenir; ilk çalıştırma etkinleştirmeden beş dakika sonradır. Yönetimde önbellek soğuksa tek seferlik bir alma kuyruğa konur.
  • İstek: en fazla 5 saniye zaman aşımı, 2 yönlendirme, 4 MB ile sınırlı yanıt. Tavana ulaşan bir gövde kırpılmış sayılır ve reddedilir.
  • Sağlayıcı başına yalnızca gerekli alanlar tutulur; yığınlar boşaltılır. Serileştirme yine de çok büyükse iki kademeli kırpma uygulanır: önce etiketler ve URL'ler, sonra yalnızca amaçlara indirgeme.
  • Saklama: bir transient içinde bir hafta, stale-if-error ile — bir başarısızlık durumunda son geçerli kopya korunur.
  • Herkese açık rota: GET /owc/v1/tcf/gvl, saatte 10 istekle sınırlı. Önbellekteki kopyayı bir ETag ve Cache-Control: public, max-age=86400 ile sunar ve koşullu istekleri işler. Önbellekte hiçbir şey yoksa Retry-After: 300 ile 503 yanıtı verir — asla sentetik bir liste değil. Bu rota asla giden bir istek tetiklemez.

TC dizesi nerede hesaplanır

PHP'de değil, tarayıcıda. <head> içinde öncelik 0 ile tamamen statik bir stub basılır: konumlandırıcı iframe, window.__tcfapi uygulaması, postMessage aktarımı ve JavaScript ile yazılmış bir Core segment kodlayıcısı. Yayımlanan yapılandırma hiçbir ziyaretçi verisi içermez — sayfa önbelleğiyle uyumlu kalmayı sağlayan budur. Filtre: owc_tcf_stub_config.

Kodlayıcının bir PHP aynası vardır ama eklenti içinde hiçbir çağıranı yoktur: entegrasyonlara ve testlere ayrılmıştır ve asla önbelleklenebilir HTML'e basılmaması uyarısıyla birlikte gelir.

Neler kodlanır

Yalnızca Core segmenti, dolgusuz base64url ile. Sağlayıcı bölümü ya bit alanı ya da aralık olarak kodlanır: iki boyut da ölçülür ve küçük olan kazanır. Tarayıcıya iletilen sağlayıcı dizini, kendi kompakt biçimimizi kullanır ve aşıldığında dizinin boşaltıldığı katı bir tavanı vardır (o zaman sağlayıcı rızaları kaybolur, liste sürümü korunur).

Kategori → TCF amacı eşlemesi

KategoriAmaçlar
necessaryhiçbiri — TCF kapsamı dışında; bu da “Tümünü reddet” işleminin 1. amaç için bir rıza üretemeyeceğini garanti eder
functional1
analytics1, 8, 9, 10
marketing1, 2, 3, 4, 7
preferences1, 5, 6, 11
social1

Filtre: owc_tcf_purpose_map.

Yayıncının meşru menfaati: yalnızca 2, 7, 8, 9, 10 ve 11 numaralı amaçlar tutulur; çünkü TCF v2.2, 1, 3, 4, 5 ve 6 numaralı amaçlar için meşru menfaati yasaklar. tcf_publisher_purposes_li içindeki diğer her değer sessizce ayıklanır.

Bir sağlayıcı, “rıza” dayanağıyla bildirdiği amaçlardan en az biri verildiğinde rızalı sayılır.

Özel özellikler

Yalnızca iki girdi desteklenir: 1 — kesin konum verisinin kullanımı ve 2 — cihaz özelliklerinin etkin taranması. Kullandıklarınızı tcf_special_features içinde bildirin; liste bu kataloğa indirgenir.

Tercih panelinde gerçek onay kutuları olarak görünürler. “Tümünü kabul et” bunları işaretlemez: kendilerine özgü açık bir opt-in isterler. “Tümünü reddet” ve “Do Not Sell” onların işaretini kaldırır. TC dizesinin içinde yaşarlar ve panel yeniden açıldığında TCF API'sinden yeniden doldurulurlar.

Paneldeki TCF katmanı

Yalnızca modül etkinse, yani tcf_enabled ve kullanılabilir bir CMP ID varsa render edilir. İki blok:

  • Amaçlar: yalnızca zorunlu olmayan bir kategori üzerinden erişilebilen ve sağlayıcı listesi kataloğunda adı geçen amaçlar. Kendiliğinden geri dönen bir anahtar, hiç anahtar olmamasından kötü olurdu. Bir amacı değiştirmek, onu bildiren tüm kategorilere yazar; ardından görünüm yeniden türetilir.
  • Bildirilen özel özellikler.

Gösterilmemiş hiçbir şey dizeye kodlanmaz.

JavaScript API'si

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

window.__owcTcfUpdateState( tcData );        // verileri değiştirir ve dinleyicileri bilgilendirir
window.__owcTcfRefresh();                    // yeniden hesaplar ve 'useractioncomplete' yayar
window.__owcTcfUiShown(); window.__owcTcfUiHidden();
window.__owcTcfSetSpecialFeatures( [ 1, 2 ] );

Kabul edilen sürümler: yok, null, 2, '2', 2.2, '2.2'. Diğer her değer callback(null, false) verir.

gdprApplies

İstemci tarafında kararlaştırılır. Bölgesel tespit kapalıysa değer true'dur. Değilse ziyaretçinin ülkesi, TCF anlamında GDPR'nin uygulandığı 31 kodluk listeyle karşılaştırılır (27 AB ülkesi, artı IS, LI, NO, GB ve CH). Kapalı tarafa düşer: bilinmeyen bir ülke true verir.

euconsent-v2 çerezi

Yalnızca istemci tarafında ve yalnızca modül hazırken ve ziyaretçi bir eylemde bulunmuşken yazılır. Aksi halde çerez silinir. Süresi rızanın süresidir, 13 ayla sınırlandırılır (IAB / CNIL tavsiyesi). SameSite=Lax, HTTPS'te Secure.

TCF modülünün sınırları — mutlaka okuyun

  1. Bu, IAB Europe nezdinde kayıtlı bir CMP değildir. Kendi CMP ID'nizi ister ve onunla bile TCF politikası, kayıtlı bir CMP'nin hem amaç düzeyinde hem de sağlayıcı düzeyinde seçim sunmasını zorunlu kılar. Burada amaç anahtarları kategorileri izler ve sağlayıcı düzeyinde hiçbir seçim yoktur: sağlayıcıların bu sinyali reddetmesi meşrudur. Yönetim ekranı bunu söyler ve “CMP uyumlu mod (resmî değil)” ifadesini kullanır; bu mod geliştirmede çoğu SSP tarafından kabul edilir ama AEA'da gerçek üretimde reddedilir. TCF kapsamındaki reklam geliri sizin için önemliyse sertifikalı bir CMP kullanın.
  2. Yalnızca Core segmenti: disclosedVendors, allowedVendors ya da publisherTC segmenti yok.
  3. Hiçbir yayıncı kısıtlaması yayımlanmaz: ilgili sayaç her zaman 0'dır ve kısıtlamalar nesnesi boştur.
  4. purposeOneTreatment ve useNonStandardTexts her zaman false, isServiceSpecific her zaman true'dur — küresel kapsam yoktur — ve rıza ekranı her zaman 0'dır.
  5. getVendorList, sürüm parametresini yok sayar ve her zaman önbellekteki listeyi döndürür.
  6. Yayıncı rızaları genel amaçları kopyalar: özel amaç yoktur.
  7. Yalnızca iki özel özellik.
  8. Modül, çalışan bir cron ve giden HTTPS ister. Önbellekte liste yoksa API cmpStatus: 'error' yanıtı verir ve herkese açık rota 503 döndürür.

Global Privacy Control

GPC, tarayıcının gönderdiği bir sinyaldir — Sec-GPC: 1 başlığı ve navigator.globalPrivacyControl özelliği. Eklenti bunu varsayılan olarak dikkate alır (gpc_honor), ama işlenme biçimi hukuki rejime bağlıdır ve önemli olan nokta budur.

ABD profilleri altında: bağlayıcı

Sinyal, ccpa ve us_generic profilleri altında bağlayıcı ve evrensel bir opt-out olarak işlenir. Avustralya açıkça dışarıdadır: opt-out rejimi, ama GPC'yi tanımıyor.

Sunucu tarafında yazma, yalnızca şu sıradaki tam bir denetim zincirinden sonra gerçekleşir:

  1. gpc_honor açık;
  2. sinyal var — Sec-GPC başlığı, bazı proxy'ler ve CDN'ler başlığı yeniden adlandırdığı için X-Sec-GPC yedeğiyle; yalnızca tam olarak 1 değeri sayılır;
  3. etkin profil ccpa ya da us_genericaksi halde hiçbir şey yazılmaz;
  4. bu, sıradan bir sayfa görüntülemesi: yönetim değil, cron değil, AJAX değil, REST değil, XML-RPC değil, WP-CLI değil ve metot GET;
  5. başlıklar henüz gönderilmemiş — konulamayan bir çerez, her istekte yeniden kaydedilecek bir karar demektir;
  6. owc_gpc oturum işaretçisi yok: tarama oturumu başına bir kez;
  7. ziyaretçi bota benzemiyor (boş kullanıcı aracısı ya da içinde bot, crawl, spider, slurp, monitor, uptime, pingdom, headless, preview, curl/, wget, python-, java/, go-http, okhttp, httpclient, libwww, facebookexternalhit geçenler);
  8. hâlihazırda saklanan seçim sinyali zaten karşılamıyor — karşılıyorsa yalnızca tarayıcı işaretlenir;
  9. paylaşılan hız sınırına uyuluyor: IP başına saatte 30;
  10. bir başarısızlık yeniden deneme döngüsüne dönüşmesin diye tarayıcı, yazmadan önce işaretlenir.

Olay, auto kaynağıyla gpc_opt_out olarak kaydedilir. Sayfa URL'si sitenin URL'sinden ve istenen yoldan yeniden kurulur — asla Host başlığından, asla Referer başlığından.

Kapsam: tüm isteğe bağlı kategoriler false olur; zorunlu kategoriler verilmiş kalır. Bu, satış veya paylaşım kavramının geniş bir okumasıdır.

Şeffaflık: GPC, açıkça kaydedilmiş bir seçimin üzerine yazarsa, beş dakikalık bir çerez istemci tarafında ekranın altında bunu açıklayan bir bildirim tetikler; paneli açan bir “tercihlerimi yönet” düğmesi ve bir kapatma düğmesiyle birlikte.

GDPR ve benzeri profiller altında: yalnızca bir ipucu

ABD opt-out rejimlerinin dışında sinyal, bir rıza olarak değil, bir belirti olarak işlenir:

  • <html> üzerine data-owc-gpc="1" niteliği konur;
  • Consent Mode; ad_storage, analytics_storage, ad_user_data, ad_personalization ve personalization_storage sinyallerini denied yapar;
  • tüm isteğe bağlı kategoriler yalnızca bellekte false yapılır;
  • given yanlış kalır, banner görünmeye devam eder ve hiçbir şey kaydedilmez.

Dahili bir bayrak, ne çerezin ne de kayıt defterinin söylemediği bir şeyi — ziyaretçinin “zaten opt-out” olduğunu — çalışma zamanının ilan etmesini engeller. Gerekçe kodda yazılıdır: GPC, GDPR ve ePrivacy, İsviçre nLPD'si, LGPD, POPIA, PIPL, DPDP ve 25 sayılı Kanun altında hukuken tanınan bir sinyal değildir.

Bu modülün bıraktığı iki çerez

ÇerezSüreGörevi
owc_gpcoturumSinyalin bu tarayıcı için işlendiğini işaretler
owc_gpc_notice300 sn“GPC seçiminizin yerine geçti” bildirimini tetikler

İkisi de path=/, SameSite=Lax, HTTPS'te Secure ve betikle okunabilirdir.

Genişletme noktası

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

Bölgesel tespit

Bölgesel tespit, her ziyaretçiye sitenin yapılandırılmış profilini değil, kendi yargı bölgesinin profilini uygular. Varsayılan olarak kapalıdır.

AyarVarsayılan
geo_enabledfalse
geo_default_profilegdpr
geo_mmdb_enabledfalse

Tespit zinciri

İlk başarı kazanır:

  1. Cloudflare (CF-IPCountry) — yalnızca site Cloudflare arkasında olduğunu bildirmişse;
  2. AWS CloudFront (CloudFront-Viewer-Country) — aynı koşul;
  3. GEOIP_COUNTRY_CODE, sunucunun kendisinin yazdığı değişken (mod_geoip, ngx_http_geoip), dolayısıyla istemci tarafından taklit edilemez; ardından, bir proxy bildirilmişse, HTTP başlığı biçimindeki varyantlar;
  4. Yerel MaxMind veritabanı, geo_mmdb_enabled açıksa;
  5. Hiçbiri.

wp-config.php içinde açık bir bildirim olmadan hiçbir HTTP ülke başlığına inanılmaz: bunlar istemci tarafından taklit edilebilir. Sabitler için bkz. Kurulum.

Ülke kodu, resmî olarak atanmış ISO-3166-1 alpha-2 izin listesine karşı doğrulanır (sabit kodlu yaklaşık 249 kod). Kullanıcıya ait ya da ayrılmış kodlar — XX, ZZ, Tor çıkışlarının T1 kodu — reddedilir.

Kapalı tarafa düşme

Ülke tespit edilemezse eklenti geo_default_profile değerini okur ama her opt-out profilini gdpr profiline düşürür. ccpa, us_generic ya da au olarak ayarlanmış bir geo_default_profile, tespit edilemeyen ziyaretçiler için yok sayılır — ve yönetim ekranı, sessizce yok sayılacak bir seçim sunmak yerine bu seçicide yalnızca opt-in profilleri önerir.

Gerekçe doğrudandır: bu güvence olmasaydı Amerikan İngilizcesiyle yapılandırılmış bir site, tüm AEA ziyaretçilerini opt-out rejimine sokar ve hiçbir rıza olmadan izleyicileri “verilmiş” olarak işaretlerdi.

Sitenin yerel ayarına düşülmez: bir sitenin dili, ziyaretçisinin nerede olduğu hakkında hiçbir şey söylemez.

owc_geo çerezi

  • Süre 24 saat, path=/, SameSite=Lax, HTTPS'te Secure, betikle okunabilir — ön yüz bootstrap'ının buna ihtiyacı var.
  • İçerik: ülke, profil, bir zaman damgası ve bir kimlik doğrulama kodu. Asla IP adresi yok.
  • Okumada: boyut sınırlı, ülke ISO listesine karşı doğrulanır, zaman damgası pencerede, kod sabit zamanda doğrulanır. Profil her zaman ülkeden yola çıkarak sunucu tarafında yeniden hesaplanır: bir ziyaretçi kendi hukuki rejimini seçemez.
  • Yalnızca gerçek bir tespit önbelleklenir. “Kapalı tarafa düşme” yedeği asla hatırlanmaz.
  • Yalnızca bir ön yüz isteğinde ve yalnızca tespit açıksa yazılır.

Ülke → profil eşlemesi

ÜlkeProfil
AEA'nın 30 ülkesigdpr
GB, JE, GG, IMuk_pecr
CHch_nfadp
BRlgpd
ZApopia
CN, HKpipl
INdpdp
AU, NZau
CAquebec
USccpa
Geri kalan her şeyYedek, opt-in'e düşürülmüş olarak

Hong Kong gerçekte kendi yerel yönetmeliğine tabidir; katılık gereği PIPL gibi işlenir. Yeni Zelanda, Avustralya gibi işlenir. Kanada'nın tamamı quebec alır — en katı rejim kazanır. Amerika Birleşik Devletleri, diğer eyaletler için de profil işlevi gören ccpa alır.

Önbellek kısıtı — tespitin yapmadıkları

Coğrafi profil, render edilen HTML'i değiştirmez. Profilin yeniden yazılması yalnızca iki ziyaretçi REST rotasına uygulanır: /owc/v1/consent ve /owc/v1/state. Sayfa render'ı, yönetim rotaları, wp-admin, cron ve WP-CLI yapılandırılmış profili korur. Bu yeniden yazımı kullanan her yanıt önbelleklenemez olarak işaretlenir.

Rejimi istemci tarafında, çerezden seçen ön yüz çalışma zamanıdır. Kabul edilmiş sonuç: bir ziyaretçiye uygulanan rejim JavaScript'e bağlıdır ve ilk sayfası önbellekten gelen bir ziyaretçi, çerez var olana kadar sitenin yapılandırılmış profiliyle işlenir.

Gömülü MaxMind okuyucusu

Eklenti kendi MMDB okuyucusunu taşır; saf PHP ile yazılmış, Composer bağımlılığı yok — WordPress.org'da yayımlanan bir eklenti resmî paketi gömemez.

  • Yalnızca okuma, yalnızca ülke. Şehir yok, ASN yok.
  • Sınırlı giriş/çıkış: küçük bloklar halinde okuma, birkaç megabaytlık bir dosyanın belleğe yüklenmesi asla yok.
  • Asla istisna fırlatmaz: eksik, okunamaz, kırpılmış, bozuk ya da düşmanca bir dosya null verir ve tespit kendi katı profiline düşer.
  • Dolaşma derinliği, çözme bütçesi ve yük boyutu üzerinde dahili güvenceler. Meta veriler, anahtarı dosyanın boyutunu ve tarihini içeren bir transient'te önbelleklenir: aylık indirmenizi değiştirmek önbelleği kendiliğinden geçersiz kılar.
  • registered_country ve represented_country bilerek yok sayılır. Bunlar anonim proxy, VPN ve uydu aralıklarının belgelenmiş biçimidir; orada kayıt ülkesi, ziyaretçiyi değil, bloğun sağlayıcı tarafından kaydedildiği yeri gösterir. Onları kullanmak, ABD VPN'i arkasındaki bir AEA ziyaretçisini opt-out rejimine sokardı.
  • Başka bir eklenti zaten bir GeoIP2 okuyucusu yüklüyorsa, o okuyucu ev yapımı okuyucudan sonra yedek olarak kullanılır.

Dosya nereye konur: wp-content/uploads/ow-geoip/GeoLite2-Country.mmdb. Yol, owc_geo_mmdb_path ile filtrelenebilir ve dizin geçişine karşı doğrulanır.

Önemli sınır: eklenti veritabanını indirmez ve hiçbir yükleme ekranı sunmaz. Dosyayı MaxMind'dan kendiniz almalı, kendiniz koymalı ve kendiniz güncellemelisiniz. Buna karşılık MaxMind'a hiçbir şey gönderilmez: arama tamamen yereldir, IP adresi yalnızca arama noktası olarak kullanılır ve sonrasında açıkça imha edilir — asla günlüklenmez, asla saklanmaz, asla çereze yazılmaz.

Bölgesel tespitin sınırları

  1. Varsayılan olarak kapalıdır ve MaxMind seçeneği sizin sağladığınız bir dosyayı ister.
  2. Proxy'nizi bildirmediğiniz sürece ülke başlıkları yok sayılır.
  3. ABD'de eyalet eyalet, Kanada'da vilayet vilayet ayrım yoktur.
  4. Ziyaretçinin rejimi JavaScript'e ve 24 saatlik çereze bağlıdır.
  5. us_generic profili asla otomatik olarak atanmaz.

OW Forms entegrasyonu

Tam kapsam: bu entegrasyon kardeş eklenti OW Forms'u hedefler, başka hiçbir şeyi değil. Contact Form 7, Gravity Forms veya WPForms entegrasyonu yoktur.

Ayar: forms_integration_enabled, varsayılan olarak açık, ama OW Forms etkin değilse entegrasyon hiçbir şey yapmaz.

Neler getirir

1. Rıza ↔ gönderim bağlantısı. Saklanan her gönderimde, OW Consent'e ait özel bir tabloya — OW Forms'un şemasına asla dokunulmaz — şunları içeren bir satır yazılır:

  • ziyaretçinin takma adlı token'ı (32 onaltılık, asla e-posta adresi değil);
  • bu token için en son kayıt defteri girdisinin tanımlayıcısı;
  • verilen kategoriler ve yürürlükteki uyumluluk profili;
  • o andaki yayımlanmış belgelerin tam özeti;
  • rızanın zaman damgası;
  • formdaki GDPR kutusunun durumu ve taşıdığı tam etiket.

Pratikte en yararlı olan son maddedir: yalnızca kutunun işaretli olduğunu değil, yanında ne yazdığını da ispatlayabilirsiniz.

2. Silme zinciri. Doğrulanmış bir silme talebi, silmeyi OW Forms'un rutinine devreder — o da yüklenen dosyaları da siler — ardından bağlantı satırlarını siler. Entegrasyon, OW Forms'un aynı eyleme kendi dinleyicisini bağlayıp bağlamadığını tespit eder; bağlamışsa yalnızca kendi bağlantılarını budamakla yetinir.

3. WordPress'in gizlilik araçları. Bir dışa aktarıcı ve bir silici kaydedilir; böylece Araçlar → Kişisel Verileri Dışa Aktar / Sil, OW Forms gönderimlerini kapsar — ve aynı kancaları dolaştığı için OW Consent'in haklar portalını da. Dışa aktarma, alanların gerçek etiketlerini kullanır ve rıza alanlarını ekler. Dışa aktarılan her değer, elektronik tablo formül enjeksiyonuna karşı etkisizleştirilir ve kırpılır.

4. Saklama. Günlük cron üzerinde, retention_form_data_days süresinden (varsayılan 1095 gün, sınırlar 1–3650) eski bağlantılar 500'lük gruplar halinde silinir; öksüz kalanlar için de bir tarama yapılır. Yalnızca OW Consent'in satırlarına dokunulur: gönderimlerin kendi saklama süresi OW Forms'a aittir.

Sınırlar

  1. Zincirlenmiş kayıt defterine hiçbir gönderim olayı yazılmaz. Bağlantı satırı var olan bir girdiye atıf yapar, yeni bir girdi oluşturmaz — zincir dışarıdan yazılmamalıdır.
  2. OW Forms gönderimleri saklamayacak şekilde yapılandırılmışsa bir gönderim bağlanamaz: tutunulacak hiçbir satır yoktur.
  3. Geriye dönük kurtarma yoktur: bağlantı, güncellemeden sonraki ilk gönderimle başlar.
  4. Eşleştirme, OW Forms'un hesapladığı tuzlanmış adres özeti üzerinden yapılır; yedek olarak OW Forms'un ayrıca sakladığı açık adres kullanılır. Bu sıfır bilgi ifşası olan bir şema değildir: kişiye yanıt verebilmek gerektiği için adres OW Forms tarafında açık kalır.
  5. Entegrasyon, OW Forms eklentisini, tablolarını ya da seçeneklerini asla değiştirmez.
  6. OW Forms etkin ama silme rutinini açacak kadar yeni değilse, silici gönderimlere dokunulmadığını açıkça bildirir.

Yüzen düğme

Küçük ve kalıcı bir düğme, tercih panelini her an yeniden açmayı sağlar. Bu, 7(3) maddesinin — geri çekme, rıza vermek kadar basit kalmalıdır — ve her sayfadan erişilebilir bir mekanizma isteyen CNIL 2020-091 sayılı kararın gereğidir.

Var olma koşulları

İki ayarı birden ister: floating_button_enabled ve banner_enabled. Tercih paneli ve JavaScript API'si banner'ın çalışma zamanında yaşar; o olmadan düğme, hiçbir şey yapmayan bir denetim öğesi olurdu.

Ayrıca yönetimde, bir beslemede, robots.txt üzerinde ve wp_head tetiklenmemişse çıkar.

Seçenekler

AyarDeğerlerVarsayılan
floating_button_enabledbooletrue
floating_button_positionbottom-left, bottom-right, top-left, top-rightbottom-left
floating_button_stylepill, iconpill
floating_button_labelserbest metinCookies

Düğmenin kendine ait bir tema ayarı yoktur: iki yüzey aynı paleti izlesin diye banner_style değerini devralır.

Davranış ve erişilebilirlik

Gerçek bir <button> öğesidir, dolayısıyla klavyeyle erişilebilir. aria-haspopup="dialog" ve çevrilebilir ama yapılandırılamaz bir aria-label taşır (“Manage my cookie choices”): yalnızca görünür etiket ayarlanabilir. icon modunda etiket görsel olarak gizlenir ama ekran okuyucular tarafından okunmaya devam eder.

hidden niteliğiyle render edilir; gösterip göstermemeye JavaScript karar verir. Banner ya da panel zaten ekrandayken hariç, tüm durumlarda görünür — geçerli sayfada bir seçim yapıldıktan hemen sonra da dahil.

Bir tıklama tercih panelini açar. Banner API'si yoksa düğme #owc-preferences parçasına düşer; bu zaten geçerli parça ise olayı elle yeniden tetikler.

z-index 99990, baskıda gizli, zorunlu kontrast modu ve prefers-reduced-motion desteği, üst konumda yönetim çubuğunun altına kaydırma.


Kısa kodlar

Eklenti iki kısa kod bildirir, o kadar. Ne banner'ın ne de yüzen düğmenin kısa kodu vardır: ikisi de ayarlarıyla yönetilir ve ya her yerde görünür ya da hiçbir yerde.

[owc_dsar_form] — haklar portalı

[owc_dsar_form]
[owc_dsar_form types="access,erasure,portability" title="Haklarım" submit_label="Gönder"]
NitelikVarsayılan
typesaccess,rectification,erasure,portability,restrict,object,optout
title“Kişisel verilerim üzerindeki haklarımı kullanmak istiyorum”
submit_label“Talebimi gönder”

İstenen türler, sunucunun kabul ettikleriyle kesiştirilir. withdraw türü form tarafından asla sunulmaz; bkz. Haklar portalı.

[owc_dnsmpi] — CCPA opt-out'u

[owc_dnsmpi]
[owc_dnsmpi label="Kişisel bilgilerimi satmayın ve paylaşmayın" class="altbilgi-baglantisi"]
NitelikVarsayılan
label“Do Not Sell or Share My Personal Information”
classowc-dnsmpi

Bir tıklama opt-out'u uygular; bkz. CCPA opt-out'u. ccpa_inject_footer ayarını açık bırakırsanız bağlantı zaten alt bilgiye eklenmiştir ve bu kısa kod yalnızca onu başka bir yere koymak için işe yarar.

Paneli bir menüden ya da bağlantıdan yeniden açmak

Bunun için kısa kod yoktur, çünkü bir sınıf niteliği yeter:

<a href="#owc-preferences" class="owc-open-preferences">Çerezlerimi yönet</a>
<button type="button" data-owc-open>Tercihlerim</button>
<a href="#owc-dnsmpi" data-owc-dnsmpi="1">Bilgilerimi satmayın</a>

Alt bilgi menünüze bir “Çerezler” girişi eklemenin önerilen yolu budur.


REST API

Tüm rotalar, olağan REST kökünde (https://example.com/wp-json/owc/v1/…) owc/v1 ad alanı altında yaşar. Toplam on üç rota: REST modülünün kaydettiği on iki rota, artı TCF modülünün kaydettiği sağlayıcı listesi rotası.

Herkese açık rotalar

Kimlik doğrulama yoktur. Güvenlikleri; kaynak denetimine, eklentiye özgü bir token'a ve aşağıda anlatılan hız sınırlarına dayanır.

MetotYolParametrelerGörevi
GET/nonceaction (varsayılan wp_rest)Taze bir token döndürür. Yanıt: {nonce, action, header: "X-OWC-Nonce", ttl: 43200}, no-store ve Vary: Cookie ile
POST/consentevent (varsayılan save_preferences), source (varsayılan banner), categories (zorunlu), page_url (varsayılan ''), cookie_unreadable (boole, varsayılan false)Bir seçimi kaydeder, çerezi koyar ve kayıt defteri satırını yazar
GET/stateYalnızca çağıranın durumu: {given, categories, profile, at}. Asla ziyaretçi token'ı, asla IP, asla sayfa URL'si. no-store + Vary: Cookie
GET/tcf/gvlÖnbellekteki Global Vendor List'i sunar. ETag, Cache-Control: public, max-age=86400, koşullu istekte 304, önbellekte hiçbir şey yoksa 503 + Retry-After: 300
POST/dsartype (zorunlu), email (zorunlu, e-posta biçimi), message (varsayılan '', en fazla 2000 karakter)Bir hak talebi bırakır. Yanıt {ok, mail_sent, message}asla tanımlayıcı değil

Kabul edilen değerler:

  • 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: bir nesne, en fazla 32 girdi, yalnızca skaler değerler
  • action (nonce): yalnızca wp_rest

Yönetim rotaları

Hepsi manage_options yetkisini ister.

MetotYolParametrelerGörevi
GET/ledgerpage (≥1, varsayılan 1), per_page (1–200, varsayılan 50), visitor_token (32 onaltılık), from, toKayıt defterini okur. Gerçekten uygulanan filtreler yanıtta döndürülür
GET/ledger/verifyZinciri baştan sona doğrular
GET/settingsEtkin ayarlar
POST/settingsserbest JSON gövdesiAyarları yazar. Yanıt {ok, updated, rejected, settings}
POST/scanner/runBir tarama başlatır
POST/scanner/ingestJSON gövdesi {page, findings[]}Sondanın gözlemlerini alır
GET/scanner/findingspage, per_page (1–200, varsayılan 50), filter (kategori slug'ı veya unknown)Bulguları listeler
POST/policies/generatetype (zorunlu), publish (boole, varsayılan false)Bir belge üretir
GET/policies/previewtype (zorunlu)Bir belgeyi önizler

/scanner/ingest ayrıca X-WP-Nonce başlığında ya da _wpnonce parametresinde geçerli bir wp_rest nonce'u ister — çünkü sendBeacon başlık koyamaz.

Yazma modundaki /settings yalnızca gerçek ayar olarak bildirilmiş anahtarları kabul eder: bir filtre, ayar olmayan sentetik anahtarlar enjekte edebilir. Her değer tek tek temizlenir. Hiçbir bilinen anahtarın olmaması 400 verir.

/ledger, başka bir yerde filtrelenmiş bir permission_callback ihtimaline karşı derinlemesine savunma olarak yetkiyi işleyicinin içinde yeniden test eder.

Herkese açık yazmaların güvenlik modeli

Başlangıç tespiti basittir: bir nonce, önbelleklenebilir HTML'de yaşayamaz. Bu yüzden /consent ve /dsar rotalarının erişim denetimi izin verici olup, sırası önemli olan dört katmanla korunur.

  1. Aynı ana bilgisayar kaynak denetimi. Bedava, belirlenimci, hiçbir bütçe tüketmez.
  2. X-OWC-Nonce başlığındaki eklentiye özgü token — bu bir kanıttır, asla veto değil. X-WP-Nonce kullanmama kararı bilinçlidir: WordPress çekirdeği bu başlığı her türlü rota erişim denetiminden önce yakalar ve doğrulayamazsa isteğin tamamını reddeder. Bir önbellekten gelen süresi geçmiş bir token, uç noktanın hiç token olmadan kabul edeceği bir yazmayı böylece öldürürdü.
  3. Kapalı tarafa düşme: ne kaynak ne de doğrulanmış token varsa 403 owc_missing_origin.
  4. Hız sınırı en sonda. En başta olsaydı, hatalı bir yapılandırma her tıklamada iki token tüketir ve 429 ile biterdi; bu da yapılandırma hatasını bir hız sınırının arkasına gizlerdi.

Kabul edilen ana bilgisayarlar: WordPress'in bildirdikleri (site URL'si, WordPress URL'si, REST kökü) ve bunların www./apex ikizleri, artı geçerli isteğin Host başlığındaki ana bilgisayar ve onun ikizi. “Aynı kaynak”, “WordPress'in veritabanında yazana uyuyor” değil, “kaynak, tarayıcının bağlandığı ana bilgisayara uyuyor” demektir — aksi halde bir önizleme alan adıyla, bir takma adla, bir ön üretim adıyla, çoklu sitede eşlenmiş bir alan adıyla ya da Host başlığını yeniden yazan bir proxy arkasından erişilen her site, kendi kendini onaramadan sessizce reddedilirdi. Filtre: owc_allowed_request_hosts.

CORS bilerek WordPress çekirdeğine bırakılmıştır.

/nonce JSONP biçimini açıkça reddeder: bu ret olmasaydı üçüncü taraf bir sayfa, kaynak denetimine tabi olmayan basit bir <script src> ile oradan geçen bir yöneticinin canlı token'ını toplayabilirdi.

Hız sınırları

BölmeBütçePencereAnahtar
nonce1205 dakikaIP adresi
consent305 dakikaIP adresi
dsar31 saatIP adresi
dsar_email324 saathedeflenen e-posta adresi
dsar_global301 saattüm site
gpc301 saatIP adresi
tcf_gvl101 saatIP adresi
  • Sabit pencere, kayan değil: trafik alan bir bölmenin süresi eninde sonunda dolar.
  • Saklanan anahtar tuzlanmış bir özettir: seçeneklerde ya da nesne önbelleğinde açık biçimde hiçbir IP ya da e-posta adresi bulunmaz.
  • IP normalleştirme: IPv4 korunur, IPv6 /64'e kırpılır — arayüz tanımlayıcısının her bitini istemci kontrol ettiğinden, tam bir anahtar her istekte yeni bir bütçe yaratmayı mümkün kılardı.
  • Paylaşılan kimlik: OWC_TRUSTED_PROXY ile bildirilmemiş bir CDN ya da proxy arkasında tüm ziyaretçiler aynı adresle gelir. Bütçe o zaman ziyaretçi başına bölünür ve paylaşılan adres üzerinde genişletilmiş bir sayaç tutulur. Bu daha kaba bir sınırdır: proxy'nizi bildirin.
  • owc_throttle_max( $max, $bucket, $window ) filtresi — 0 döndürmek sınırı kapatır.
  • Nesne önbelleği kullanılamıyorsa sınırlayıcı açık tarafa düşer: birinin haklarını kullanmasını engellemektense sınırlamamak yeğdir.

/consent rotası ayrıntılı olarak

  • headers_sent() en başta okunur. Çıktı çoktan başladıysa sunucu çerezi konulamaz: satır yine de yazılır ve yanıt 200 kalır, cookie_set: false ile ve istemcinin kendisinin koyacağı bir cookie tanımlayıcısıyla (name, value, ttl, path, samesite, secure).
  • Sitenin sunmadığı kategoriler sessizce yok sayılmaz, dropped_categories içinde döndürülür.
  • page_url, sitenin ana bilgisayarlarına karşı doğrulanır; yedek olarak aynı şekilde doğrulanmış bir Referer, o da yoksa boş dize kullanılır. Anahtar her zaman vardır; böylece kayıt defteri ham Referer değerini aramaya gitmez.
  • Kayıt defteri açıksa ve yazma reddedilirse çerez iptal edilir ve yanıt 503 owc_ledger_write_refused olur. Hiçbir şey saklanmaz, hiçbir izleyici serbest bırakılmaz.
  • cookie_unreadable saf telemetridir: ona hiçbir doğrulama denetimi uygulanmaz; tam da bir tanı alanının bir rıza yazmasını asla reddedememesi için. Tek etkisi, ret günlüğüne düşülen bir nottur.

Tipik yanıt: {ok, state, dropped_categories, logged, cookie_set[, cookie]}. Kayıt defteri kapalıyken logged alanı null olur.

Hata kodları

KodHTTPAnlamı
owc_bad_param400Geçersiz parametre
owc_bad_categories400Hatalı biçimli, çok büyük ya da skaler olmayan categories nesnesi
owc_bad_email400Geçersiz e-posta adresi
owc_bad_dsar400Hatalı biçimli DSAR gönderimi (bot tuzağı dahil)
owc_dsar_not_attested400Md. 12.6 beyanı yok
owc_no_settings400Gövdede hiçbir bilinen ayar anahtarı yok
owc_missing_origin403Ne kaynak ne token: kapalı tarafa düşme
owc_bad_origin403Bildirilen kaynak bu sitenin bir ana bilgisayarı değil — yanıt, kabul edilen en fazla on ana bilgisayarı listeler
owc_bad_nonce403/scanner/ingest üzerinde geçersiz nonce
owc_jsonp_forbidden403/nonce üzerinde JSONP biçimi reddedildi
owc_forbidden401/403Yetersiz yetki
owc_dsar_disabled404Haklar portalı sunucu tarafında kapalı
owc_no_template404Bu tür ve bu profil için şablon yok
owc_rate_limited429Hız sınırına ulaşıldı
owc_consent_failed500Rızanın uygulanması başarısız
owc_dsar_store_failed500Talebin yazılması başarısız
owc_gen_faileddeğişkenBelge üretimi reddedildi (eksik alanlar, dil bariyeri)
owc_ledger_write_refused503Kayıt defteri yazmayı reddetti — hiçbir şey kaydedilmez, hiçbir şey serbest bırakılmaz

Ret günlüğü

Son yirmi yazma reddi saklanır ve kontrol panelinde gösterilir — yalnızca günlük boş değilse. Orada iki tür ayırt edilir:

  • HTTP durumu olan bir girdi gerçek bir reddir: hiçbir şey saklanmamıştır ve ziyaretçi bir hata görmüştür;
  • durumu 0 olan bir girdi bir uyarıdır: seçim aslında kaydedilmiştir.

Panel, kaynağın bildirdiği ana bilgisayarı ve isteğin Host başlığını yan yana gösterir. WordPress bir ana bilgisayarla yapılandırılmışken ziyaretçilerinizin başka bir ana bilgisayarda gezinmesi durumunda farklı olan tam olarak budur — “kaydedilmeyen” bir rızanın en sık nedeni.

API'nin sınırları

  1. /consent ve /dsar, tasarım gereği anonim yazmalar kabul eder; koruma bir nonce değil, kaynak artı hız sınırıdır.
  2. Nesne önbelleği yoksa hız sınırlayıcı açık tarafa düşer.
  3. Rıza çerezi yalnızca ana bilgisayara özeldir: apex için konulan bir çerez bir www. sayfasından okunamaz ve hiçbir CORS başlığı bunu düzeltemez. Çare, aynı kaynaklı bir yazma URL'sidir.
  4. /scanner/ingest yalnızca manage_options kabul eder: sonda bir ziyaretçiden gelemez.
  5. /settings rotasının kendi nonce'u yoktur: manage_options yetkisi artı çekirdeğin çerez tabanlı nonce denetimi vardır.

Ayar referansı

Tüm ayarlar tek bir seçenekte, owc_settings içinde tutulur; her ön yüz sayfasında okunduğu için otomatik yüklenir.

PHP'de okuma ve yazma

$ayarlar = OWC_Core::settings();               // etkin ayarlar (varsayılanlar + kayıtlılar + filtreler)
$profil  = OWC_Core::setting( 'compliance_profile' );
$ham     = OWC_Core::stored_setting( 'compliance_profile' ); // ziyaretçi bazlı yeniden yazımı yok sayar

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

update_settings(), var olanın üzerine yalnızca gönderilen anahtarları birleştirir, varsayılanların tamamını asla. Siz hiçbir şeyi özelleştirmediğiniz sürece seçenek satırının boş kalmasını, dolayısıyla metinlerin sitenin dilini izlemesini sağlayan da budur.

settings() sonucu belleğe alınır ve anahtarı owc_settings filtresinin tüm geri çağırmalarına dayanır: filtresini ilk okumadan sonra kaydeden bir modül, yok sayılmak yerine belleği geçersiz kılar. Bellek, seçenek her yazıldığında boşaltılır.

Varsayılan değerler

[
    // Banner
    '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,          // çarpı = zımni ret
    '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',

    // Yüzen düğme
    'floating_button_enabled'   => true,
    'floating_button_position'  => 'bottom-left',
    'floating_button_style'     => 'pill',
    'floating_button_label'     => 'Cookies',

    // Rıza
    'consent_renewal_months'    => 12,             // 0 değeri « asla » değil, 13 olur
    'consent_policy_hash_check' => true,

    // Uyumluluk
    '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,

    // Kategoriler
    '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.',

    // Kayıt defteri
    'ledger_enabled'            => true,
    'ledger_retention_days'     => 1825,           // 5 yıl ; 0 = sınırsız
    'ledger_hash_algo'          => 'sha256',

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

    // Haklar portalı
    'dsar_enabled'              => true,
    'dsar_email'                => '',
    'dsar_response_days'        => 30,
    'dsar_notify_email'         => '',
    'dsar_token_ttl_days'       => 7,

    // Engelleme
    'blocker_unknown_script_policy' => 'allow',
    'blocker_unknown_iframe_policy' => 'block',
    'blocker_allowlist'             => '',         // satır başına bir ana bilgisayar
    'blocker_block_resource_hints'  => true,

    // Entegrasyon ve yaşam döngüsü
    'forms_integration_enabled' => true,
    'auto_footer_menu_inject'   => false,
    'delete_data_on_uninstall'  => false,

    // Yasal kimlik
    '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'        => '',            // bilerek boş : ülke + profilden türetilir
    '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,

    // Bağlantılar
    'link_privacy_policy'        => '',
    'link_cookie_policy'         => '',
    'link_terms'                 => '',
    'link_legal_notice'          => '',
]

Kapalı listeler

Liste dışı bir değer varsayılana geri çekilir.

AyarKabul edilen değerler
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 (PHP'nin desteklediğiyle kesiştirilir)
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

Tam sayı sınırları

AyarSınırlar
consent_renewal_months0–13 (0, 13 gibi işlenir)
dsar_response_days1–30
dsar_token_ttl_days1–90
ledger_retention_days0–3650 (0 = sınırsız)
scanner_max_urls1–500
scanner_timeout1–60
legal_minor_age13–18
retention_form_data_days1–3650
retention_dsar_days1–3650
tcf_cmp_id0–4095

Temizleme

  • text_message, zengin HTML kabul eden tek alandır; bir WordPress yazısında izin verilen HTML'i kabul eder, banner ise sonuçta yalnızca <a href target rel> render eder.
  • Çok satırlı alanlar: 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 ve _desc ile biten her anahtar.
  • URL'ler: link_ önekli ya da _url sonekli her anahtar, artı legal_profession_rules.
  • E-posta adresleri: içinde email geçen her anahtar.
  • Geri kalan her şey: düz metin.
  • Skaler bir ayara gönderilen skaler olmayan bir değer yok sayılır, anahtar yazılmaz.

Ne nerede ayarlanır

SekmeAyarlar
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 (algoritma gösterilir, değiştirilemez)
Scannerscanner_*
DSAR requestsdsar_*

Tablolar

Tabloİçerik
{prefix}owc_ledgerZincirlenmiş rıza kayıt defteri
{prefix}owc_dsarHak talepleri
{prefix}owc_scannerTarama aracının bulguları
{prefix}owc_scriptsEngellemenin imza kataloğu
{prefix}owc_form_linksRıza ↔ OW Forms gönderimi bağlantıları

owc_table( 'ledger' | 'dsar' | 'scanner' | 'scripts' ) PHP yardımcısı, adı geçerli önekten yeniden hesaplar: sabitler istek süresince dondurulduğundan, bir switch_to_blog() içinde bunu kullanın.

Diğer seçenekler ve transient'ler

Seçenekler: 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, artı geçiş bayrakları (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'ler: owc_catalog_<sürüm>, owc_invalid_patterns, owc_gvl_cache, owc_gvl_stub, owc_gvl_etag, owc_gvl_retry, owc_mmdb_<özet>, 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 ve hız sınırlama sayaçları.

wp-config.php içinde tanınan sabitler

SabitEtkisi
OWC_LEDGER_KEYKayıt defterinin HMAC anahtarı ve bölgesel tespit çerezinin türetilmiş anahtarı
OWC_TRUSTED_PROXY / OWC_TRUSTED_PROXIESGüvenilen proxy'lerin CIDR aralıkları; bunlar olmadan istemci IP başlıkları yok sayılır
OWC_GEO_TRUSTED_HEADERScloudflare, cloudfront, proxy veya all
OWC_BEHIND_CLOUDFLARECloudflare ülke başlığı için kısayol
OWC_BEHIND_CLOUDFRONTCloudFront ülke başlığı için kısayol

Geliştirici kancaları

Filtreler

FiltreGörevi
owc_settingsEtkin ayarlar. Yanıt, istek boyunca kararlı bir şeye dayanmalıdır
owc_banner_textsBanner metinleri
owc_bootstrap_config<head> içine basılan statik yapılandırma — asla ziyaretçi bazlı veri
owc_scripts_catalogDoğrulamadan önceki katalog satırları
owc_blocker_allowlistAsla engellenmeyecek ana bilgisayarlar
owc_scanner_urlsTaranacak URL'ler (sonrasında yeniden sitenin ana bilgisayarıyla sınırlandırılır)
owc_throttle_maxBir hız sınırının bütçesi; 0 onu kapatır
owc_allowed_request_hostsHerkese açık bir yazma için kabul edilen ana bilgisayarlar
owc_allow_headerless_writeKaynaksız yazmalarda kapalı tarafa düşmeyi kaldırır (varsayılan false)
owc_geo_mmdb_pathMaxMind veritabanının yolu
owc_tcf_purpose_mapKategori → TCF amacı eşlemesi
owc_tcf_stub_configTCF stub'ının statik yapılandırması
owc_policy_templateBir şablonun ham gövdesi — dil kilidini devre dışı bırakır
owc_policy_varsBir belgenin değişkenleri
owc_policy_htmlBir belgenin nihai HTML'i
owc_dsar_typesSunulan ve kabul edilen talep türleri
owc_dsar_form_noticeFormun altındaki bilgilendirme
owc_dsar_export_bundleTaşınabilirlik paketinin içeriği
owc_dsar_show_fulfilment_panelUygulama panelinin gösterilmesi

Aksiyonlar

Aksiyonİmza
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'lar: owc_daily_maintenance, owc_ledger_retention, owc_scanner_run, owc_scanner_run_batch, owc_tcf_refresh_gvl, owc_run_upgrade.

Uluslararasılaştırma

Çeviri alanı ow-consent, yolu /languages. Kaynak dil İngilizcedir. Paket, ow-consent.pot şablonunu ve eksiksiz bir Fransızca çeviriyi içerir.

Yukarıda anlatılan mekanizmanın hatırlatması: bir etiket ya da bir banner metni ayarlarda özelleştirilmediği sürece sitenin dilini izler. Kendi değerinizi girdiğiniz anda, ziyaretçinin dili ne olursa olsun o değer olduğu gibi sunulur.

Yasal belgelerin gövdeleri bu mekanizmadan geçmez: dilleri, yöneticinin yerel ayarını değil, yargı bölgesini izler.


Sorun giderme

Banner görünmüyor

Listeyi sırayla gözden geçirin:

  1. banner_enabled açık mı? Yönetim ekranının üstündeki rozet bunu söyler.
  2. Temanız wp_head() ve wp_footer() çağırıyor mu? Onlar olmadan banner, etkisiz bir işaretleme üretmek yerine basılmayı reddeder.
  3. Ziyaretçi daha önce bir seçim yaptı mı? Banner yalnızca <html data-owc="none"> durumunda görünür. Gizli pencerede ya da window.OWCBanner.reset() ile test edin.
  4. Ziyaretçinin JavaScript'i var mı? Onsuz banner — bilerek — gizli kalır ve <noscript> bloğu devreye girer.
  5. Bir sayfa önbelleği, etkinleştirmeden önceki bir sürümü mü sunuyor? Boşaltın.

Seçim kaydedildiği halde banner her sayfada geri geliyor

Sıklık sırasına göre üç neden.

  1. Gezilen ana bilgisayar, WordPress'te yapılandırılandan farklı (www. yerine apex, takma ad, ön üretim alan adı). O zaman WordPress 200 yanıtı verirken tarayıcı çerezi saklamayı reddeder. Kontrol panelini açın: ret günlüğü kaynağı ve Host başlığını yan yana gösterir. Çare, siteyi tek bir kanonik ana bilgisayardan sunmaktır.
  2. consent_policy_hash_check açık ve belgeleriniz değişti — bu istenen davranıştır; politika değişikliğinden sonra ziyaretçiye yeniden sorulur.
  3. 1.4.3 öncesi bir sürümdesiniz. O zamanlar çerez iki kez kodlanıyordu ve tarayıcı onu geri okuyamıyordu; oysa sunucu gayet iyi okuyordu. Güncelleyin: düzeltmeden önce yazılmış çerezler okunabilir kalır.

“Seçiminiz kaydedilemedi” — refused hatası ya da 403

Mesaj öğesindeki data-owc-code değerine ya da kontrol panelindeki ret günlüğüne bakın.

  • owc_bad_origin: bildirilen kaynak tanınan bir ana bilgisayar değil. Yanıt kabul edilen ana bilgisayarları listeler. Siteniz meşru olarak birden fazla adla erişiliyorsa bunları owc_allowed_request_hosts filtresiyle ekleyin.
  • owc_missing_origin: ne kaynak ne token var. Bu tipik olarak başlıkları silen bir gizlilik eklentisi ya da onları yeniden yazan bir proxy'dir.
  • owc_bad_nonce: yalnızca tarama sondasını ilgilendirir, rıza yazmasını değil — nonce, /consent üzerinde asla bir veto değildir.

ratelimit hatası — 429

Sınırlar, herkese açık yazmalarda bilerek düşük tutulmuştur. İki neden:

  1. Bildirilmemiş bir CDN ya da proxy: tüm ziyaretçileriniz aynı adresle gelir ve aynı bütçeyi paylaşır. wp-config.php içinde OWC_TRUSTED_PROXY ile bildirin.
  2. Aynı adresten 5 dakikada 30'dan fazla yazma gönderen otomatik bir test.

503 owc_ledger_write_refused

Kayıt defteri yazmayı reddetti, dolayısıyla hiçbir şey kaydedilmedi ve hiçbir izleyici serbest bırakılmadı. Bu istenen davranıştır: ispatlanamayan bir rıza öne sürülmemelidir.

  1. {prefix}owc_ledger tablosunun var olduğunu doğrulayın. Audit ledger sekmesi boş bir ekran yerine okunabilir bir “henüz kurulmadı” mesajı gösterir.
  2. MySQL kullanıcısının yazma haklarını doğrulayın.
  3. Son çare olarak, hizmeti geri getirmek için ledger_enabled ayarını geçici olarak kapatın — bu süre boyunca kanıtı kaybettiğinizi bilerek.

Rızadan önce hâlâ izleyiciler yükleniyor

  1. compliance_strict açık mı? Onsuz yalnızca WordPress'in kuyruğa aldığı betikler işlenir.
  2. İzleyici katalogda mı? Bilinmeyen bir üçüncü taraf betiğine varsayılan olarak izin verilir. Bir tarama başlatın, bulguyu sınıflandırın: bu, engelleme kuralını yazar.
  3. Birinci taraf JavaScript ile mi enjekte ediliyor? Dinamik koruma yalnızca yirmi ana bilgisayarı kapsar. İzleyicinin alan adı üzerine bir katalog kuralı ekleyin.
  4. Set-Cookie başlığıyla bırakılan bir çerez mi? Hiçbir istemci engellemesi onu tutamaz. Kaynağında, sunucu tarafında ele alınmalıdır.
  5. blocker_unknown_script_policy ayarını block yapın — sonra siteyi dikkatle test edin, çünkü bu ayar tanınmayan her üçüncü tarafı engeller.

Meşru bir entegrasyon engelleniyor

Ana bilgisayarını blocker_allowlist içine satır başına bir tane olacak şekilde ya da owc_blocker_allowlist filtresiyle ekleyin. blocker_unknown_iframe_policy ayarını da kontrol edin: bilinmeyen iframe'ler varsayılan olarak engellenir, en sık karşılaşılan durum budur.

Entegrasyonun rızaya bağlı kalması gerekiyorsa onu doğru kategoriye yerleştirmeyi tercih edin: görsel yer tutucu, tek tıkla serbest bırakan bir “Kabul et …” düğmesi taşır.

Tarama aracı hiçbir şey bulmuyor

  1. Açık mı? Varsayılan olarak kapalıdır.
  2. WP-Cron çalışıyor mu? DISABLE_WP_CRON tanımlıysa ve sistem cron'u yoksa planlı tarama hiç başlamaz. Doğrulamak için elle bir tarama başlatın.
  3. HTTP loopback mümkün mü? Bir ön üretim HTTP kimlik doğrulaması ya da bir güvenlik duvarı taramayı engeller. Kapsam paneli ilk hatayı gösterir.
  4. Sunucu taraması hiç JavaScript çalıştırmaz. Bir etiket yöneticisinin enjekte ettiklerini sondanın bildirmesi için sitenin bir sayfasını oturum açmış yönetici olarak ziyaret edin.

Her durumda, sonuca varmadan önce “bu tarama gerçekte neyi kapsıyor” panelini okuyun: “hiçbir şey bulunamadı” ile “hiçbir şey okunamadı” ayrımını yapar.

Bir belgenin üretimi reddediliyor

İki olası neden var ve mesaj bunu söyler:

  • Zorunlu alanlar boş — eksik anahtarların listesi gösterilir. Legal identity sekmesini tamamlayın.
  • Dil bariyeri — Fransızca konuşmayan bir yargı bölgesi için yasal bilgiler ya da kullanım ve satış koşulları istiyorsunuz. Bu durumda düğme gizlidir. Tek yol, owc_policy_template filtresiyle kendi gövdenizi sağlamaktır.

DSAR doğrulama e-postası gelmiyor

Bu neredeyse her zaman teslim edilebilirlikle ilgilidir, eklentiyle değil.

  1. Gönderim başarısız olduğunda API yanıtı mail_sent: false taşır ve form o zaman iletişim adresine yönlendiren özel bir mesaj gösterir.
  2. Bir SMTP eklentisi kurun. PHP'nin mail() fonksiyonu, alıcı sunucuların çoğu tarafından reddedilir.
  3. Alan adınızın SPF, DKIM ve DMARC kayıtlarını doğrulayın. Eklenti gönderen adresini asla yeniden yazmaz — SPF'yi bozacak olan budur — yalnızca bir Reply-To koyar.
  4. dsar_email değerinin geçerli bir adres olduğunu doğrulayın.

E-posta alınıp doğrulanmadığı sürece talep pending kalır ve yasal süre başlamaz.

TCF modülü etkinleşmiyor

Compliance sekmesini açın: bir yönetim uyarısı nedeni adlandırır.

  • missing_cmp_id: tcf_cmp_id değeri 0. IAB Europe'dan bir CMP ID almalısınız; eklenti bir tane sağlamaz ve tanımlayıcısı 0 olan bir dize yayımlamayı reddeder.
  • 4095'ten büyük CMP ID: değer, dizenin 12 bitlik alanına sığmaz ve başka bir CMP'yi işaret ederdi.
  • no_gvl: Global Vendor List henüz indirilmedi. Günlük bir cron ile gelir; WP-Cron'un çalıştığını ve sunucunuzun vendor-list.consensu.org adresine giden HTTPS ile ulaşabildiğini doğrulayın.

Bölgesel tespite rağmen tüm ziyaretçiler yapılandırılmış profili alıyor

  1. geo_enabled açık mı? Varsayılan olarak kapalıdır.
  2. Proxy'nizi bildirdiniz mi? wp-config.php içinde OWC_BEHIND_CLOUDFLARE, OWC_BEHIND_CLOUDFRONT ya da OWC_GEO_TRUSTED_HEADERS olmadan ülke başlıkları yok sayılır, çünkü taklit edilebilirler.
  3. MaxMind dosyası yerinde mi? Eklenti onu indirmez ve bir yükleme ekranı sunmaz.
  4. Bu normal de olabilir: önbellekten sunulan bir ziyaretçinin ilk görüntülemesi, 24 saatlik çerez var olana kadar yapılandırılmış profili kullanır. Kontrol paneli; tespit edilen ülkeyi, uygulanan profili ve kaynağı içeren bir tanı bloğu gösterir.

Yönetim, kayıt defteri anahtarının veritabanında olduğunu bildiriyor

Bu notice_ledger_key uyarısıdır. AUTH_KEY ve AUTH_SALT değerlerinin wp-config.php içinde olmadığı — bu durumda WordPress onları veritabanında saklar — ve OWC_LEDGER_KEY değerinin de tanımlı olmadığı anlamına gelir. Zincir kurulmaya devam eder, ama veritabanına erişebilen herkes onu yeniden imzalayabilir: kurcalamaya karşı kanıt iddiası artık geçerli değildir.

Çare, wp-config.php içine OWC_LEDGER_KEY (ve hazır oradayken AUTH_KEY ile AUTH_SALT) eklemektir. Doğrulama sonrasında bir anahtar rotasyonunu bir yeniden yazımdan ayırır, dolayısıyla bu değişiklik geçmişinizi geçersiz kılmaz.

Eklenti hiçbir şey yapmıyor ve kırmızı bir uyarı var

WordPress sürümünüz 6.2'den eski. Eklenti başlatmayı reddeder ve uyarı, hiçbir şeyin engellenmediğini ve hiçbir rızanın kaydedilmediğini açıkça söyler. WordPress'i güncelleyin ya da bu arada eklentiyi kapatıp banner'ı sayfalarınızdan kaldırın.

Katalog kuralları “tetiklenemiyor”

Bir yönetim uyarısı bunları bildirir ve Tracker catalogue sekmesinin buna ayrılmış bir filtresi vardır. Dört olası neden: boş ya da yalnızca görünmez karakterlerden oluşan desen, derlenmeyen veya felaket düzeyinde geri izleme yapan düzenli ifade, bir URL'yi hedeflemek için fazla kısa ve noktasız desen, ya da sitede artık var olmayan bir kategori. Bu satırları düzeltin ya da silin: yanlış bir kapsam izlenimi veriyorlar.


SSS

Eklenti bir sayfa önbelleğinin arkasında çalışır mı? Evet, ve mimarisinin tamamı bu kısıt etrafında kurulmuştur. Üretilen HTML tüm ziyaretçiler için aynıdır; rıza tarayıcıda okunur ve ilk render'dan önce uygulanır. Önbelleklenebilir HTML'e hiçbir nonce basılmaz. Yalnızca gerçekten kişiye özel yanıtlar önbelleklenemez olarak işaretlenir.

Ücretli bir CMP'nin yerini tutar mı? Çoğu sitede aynı alanı kapsar: banner, engelleme, denetim günlüğü, hak talepleri, coğrafi yönlendirme ve üretilen belgeler. Yapmadığı iki şey: IAB Europe nezdinde kayıtlı bir CMP değildir ve hukuki danışmanlık ya da gözden geçirilmiş belgeler sağlamaz — üreteç, sizin onaylatmanız gereken taslaklar üretir.

Kayıt defteri kurcalamaya karşı kanıtlı mı? Bir koşulla, kurcalandığında belli olur. Her satır, bir öncekinin özeti üzerinden HMAC ile imzalanır: değiştirilen ya da silinen bir satır zinciri kırar ve doğrulama nerede olduğunu söyler. Güvence, imza anahtarının veritabanının dışında yaşamasına dayanır. AUTH_KEY ve AUTH_SALT wp-config.php içindeyse ya da OWC_LEDGER_KEY tanımlıysa durum böyledir. Aksi halde WordPress salt'ları veritabanında saklar ve oraya erişen bir saldırgan zinciri yeniden imzalayabilir — eklenti bu durumu tespit eder ve sizi uyarır.

Tarama aracı siteyi yavaşlatır mı? Hayır. Varsayılan olarak kapalıdır ve açıldıktan sonra, seçtiğiniz sıklıkta WP-Cron üzerinde çalışarak kendi sayfalarınızdan sunucu tarafında bir örneklem alır. Bir ziyaretçinin gezinmesi sırasında asla çalışmaz.

Tarama aracı çerezleri buluyor mu? Kısmen, ve bunu anlamak önemli. Sunucu taraması sayfalarınızın Set-Cookie başlıklarını okur: dolayısıyla HttpOnly olanlar dahil, sunucunun bıraktığı çerezleri bulur. Hiç JavaScript çalıştırmadığı için tarayıcıda betiklerin yazdığı çerezler ona görünmez; onlar, yalnızca oturum açmış bir yönetici için çalışan bir sonda tarafından toplanır. Sonucu eksiksiz bir liste olarak değil, görülenlerin envanteri olarak ele alın — iki ekran da tersini varsaymanıza izin vermek yerine bunu söyler.

Bir hak talebi nasıl yerine getirilir? Kişi formu gönderir ve bir doğrulama e-postası alır. Talebi bağlantıdaki sayfada onaylamak, 12.3 maddesinin süresini başlatır ve bir WordPress yerel talebi açar. DSAR ekranından, sitede kayıtlı tüm dışa aktarıcıların ürettiği bir JSON dışa aktarımını indirir, tüm silicileri çalıştırır ve talebe bağlı kalan yazılı bir yanıtla kapatırsınız. Dışa aktarmanın neyi kapsadığı, dolayısıyla kurulu eklentilere bağlıdır; bu kancaların hiçbirini kaydetmeyenler elle ele alınmalıdır.

TCF modülünü AdSense ya da Ad Manager için kullanabilir miyim? Yalnızca IAB Europe'un verdiği kendi CMP ID'nizle ve o durumda bile bir çekinceyle. CMP ID olmadan modül hiç yüklenmez. CMP ID varken doğru kodlanmış bir TC dizesi yayımlar ve panel, bu dizenin öne sürebileceği her amacı ve her özel özelliği gösterir — ama TCF politikası, kayıtlı bir CMP'den hem amaç düzeyinde hem de sağlayıcı düzeyinde seçim ister. Burada amaç anahtarları kategorileri izler ve sağlayıcı seçimi yoktur: bu, kayıtlı bir CMP değildir ve sağlayıcıların sinyalini reddetmesi meşrudur. TCF kapsamındaki reklam geliri siteniz için önemliyse sertifikalı bir CMP kullanın.

Belgeler hangi dilde üretiliyor? Gizlilik politikası ve çerez politikası on bir profilin tamamı için, yargı bölgesinin dilinde vardır: İngilizce; Fransa, Belçika, Lüksemburg ve Québec için Fransızca; Brezilya için Portekizce. Yasal bilgiler ile kullanım ve satış koşulları yalnızca Fransızca vardır; diğer her yargı bölgesi için üreteç, uygun olmayan bir belge yayımlamak yerine bunları üretmeyi reddeder.

Banner'da neleri değiştirebilirim? Dört konum; açık, koyu ya da otomatik tema; isteğe bağlı bir logo; etiketler ve yeniden açmak için bir yüzen düğme. owc-open-preferences sınıfını taşıyan her öğe paneli yeniden açar. “Tümünü reddet”, “Tümünü kabul et” ile aynı belirginlikte render edilir. Kapatma çarpısı varsayılan olarak kapalıdır; açıldığında sessiz bir kapatma değil, eksiksiz bir ret kaydeder. Panel klavyeyle kullanılabilir, anahtarları görünür bir durum taşır ve modal odağı tuzaklayıp sonra geri verir. Metinler çevrilebilir ve owc_banner_texts filtresiyle değiştirilebilir.

Otomatik engelleme tam olarak neyi engelliyor? Üçüncü taraf betikler, satır içi izleme kodları, iframe'ler, ölçüm pikselleri, analitik ve pazarlama stil dosyaları ve üçüncü taraf medya kaynakları rızadan önce yeniden yazılır ve sonra belge sırasına göre serbest bırakılır. Kataloğa girmiş bir üçüncü tarafa yönelik kaynak ipuçları ertelenmez, silinir; çünkü bir ipucu bağlantı açar ve geri getirilecek hiçbir şeyi yoktur. functional sınıfındaki bir ana bilgisayarın sunduğu stil dosyaları ve yazı tipleri olduğu gibi bırakılır. Önbellek eklentilerinin tembel yükleme nitelikleri, bir yükleyici engellenmiş bir URL'yi geri getirmesin diye etkisizleştirilir. Eklenti 175 imza sunar; bunlar Tracker catalogue ekranından düzenlenebilir ve filtreyle genişletilebilir.

Kayıt defterine ne yazılıyor? Her rıza eylemi — kabul, ret, kısmi kayıt, GPC opt-out'u, yenileme, geri çekme — zincirlenmiş tabloya eklenir. Bir satır şunları içerir: takma adlaştırılmış bir IP, bir user-agent özeti, sayfa URL'si, uyumluluk profili, yürürlükteki belgelerin bir özeti, gerçekte gösterilen banner'ın bir özeti ve eklenti sürümü — yani ziyaretçinin ne gördüğünü yeniden kurmayı sağlayan öğeler.

Haklar formunda hangi korumalar var? Bir bot tuzağı, asgari bir doldurma süresi, sunucu tarafında doğrulanan zorunlu bir beyan, üç ayrı hız sınırı, yalnızca özet biçiminde saklanan tek kullanımlık bir token ve sayfada açık bir eylem gerektiren bir onay — böylece bir e-posta bağlantı tarayıcısı, kişinin yerine bir kimliği doğrulayamaz. Sahibinin kimliğini hiç doğrulamadığı bir talep ne dışa aktarılabilir, ne silinebilir, ne de yerine getirilmiş olarak kaydedilebilir; bu denetim yalnızca düğmeleri gizleyerek değil, sunucu tarafında uygulanır.

Hangi Google Consent Mode v2 sinyalleri yayımlanıyor? Yedisi de: ad_storage, ad_user_data, ad_personalization, analytics_storage, functionality_storage, personalization_storage ve security_storage. Altı kategori bunlara tek bir doğruluk kaynağından eşlenir; böylece banner, engelleme ve bootstrap birbirinden ayrışamaz.

CCPA opt-out'u ve GPC nasıl yönetiliyor? Alt bilgiye eklenen ya da kısa kodla yerleştirilen bir “Do Not Sell or Share” denetim öğesi vardır. İlk tıklama, Kaliforniya yönetmeliklerinin gerektirdiği gibi, bir panel açmak yerine opt-out'u kaydeder. Global Privacy Control sinyali, ABD profilleri altında tarama oturumu başına bir kez bağlayıcı bir opt-out olarak işlenir ve ziyaretçi, kaydettiği bir seçimin yerine geçilmişse uyarılır. GDPR ailesindeki profillerde GPC bir ipucu olarak işlenir: isteğe bağlı kategoriler arayüzde önceden reddedilmiş görünür, banner görünmeye devam eder ve hiçbir şey kaydedilmez — çünkü orada rıza olumlu bir eylem olmalıdır.

Eklenti kendisi hangi çerezleri bırakıyor? Hepsi dahili çerezlerdir, hiçbiri izlemeye hizmet etmez ve üretilen çerez politikasında bildirilirler: owc_consent (seçimler, tarayıcının takma adlı token'ı ve profil; süresi yenileme ayarını izler, varsayılan 12 ay, 13 ile sınırlı), owc_geo (tespit edilen ülke ve profil, 24 saat, hiçbir IP adresi olmadan), owc_gpc (oturum işaretçisi), owc_gpc_notice (5 dakika) ve euconsent-v2 (TCF dizesi, yalnızca modül açıksa ve ziyaretçi bir eylemde bulunduktan sonra).

Çoklu sitede çalışır mı? Evet. Ağdaki her sitenin kendi tabloları ve kendi ayarları vardır. Ağ genelinde etkinleştirme, yalnızca ağda en fazla 200 site varsa tüm siteleri dolaşır; üzerindeyse her site ilk isteğinde hazırlanır.

Peki eklentiyi silersem? Kayıt defteri, tarama bulguları, katalog, OW Forms bağlantıları, seçenekler ve ayarlar varsayılan olarak yerinde kalır. Ayarınız ne olursa olsun her zaman iki şey gider: altı zamanlanmış görev ve hak talepleri tablosu — üçüncü kişilere ait doğrudan kimlik belirtici kişisel veri içeren tek tablo odur ve eklenti gittikten sonra saklama süresini hiçbir şey sınırlamaz, hiçbir ekran da yanıt vermeye izin vermez. Taleplerinizi eklentiyi silmeden önce dışa aktarın. Geri kalanının tamamen temizlenmesi için, silmeden önce “Delete all data on uninstall” seçeneğini açın.

Destek nereden alınır?