OW Consent — Документација
Целосно управување со согласноста во WordPress: банер за повеќе јурисдикции, блокирање на следачите, скенер, правни документи, регистар на докази и портал за правата. Автор: OptionWeb — Julien Daniel Страница на приклучокот: https://optionweb.dev/mk/addons/ow-consent/ Лиценца: GPL-2.0-or-later Верзија опфатена со овој документ: 1.4.3
Содржина
- Преглед
- Инсталација
- Брз почеток
- Единаесетте профили на усогласеност
- Категориите колачиња
- Банерот
- Автоматското блокирање
- Скенерот на следачи
- Генераторот на правни документи
- Регистарот на согласности
- Порталот за правата (DSAR)
- CCPA opt-out „Do Not Sell or Share“
- Google Consent Mode v2
- IAB TCF v2.2
- Global Privacy Control
- Регионалното откривање
- Интеграцијата со OW Forms
- Пловечкото копче
- Shortcodes
- REST API
- Преглед на поставките
- Решавање проблеми
- Најчести прашања
Преглед
OW Consent е пакет за управување со согласноста во WordPress. Го покрива целиот синџир: да прикаже избор, тој избор навистина да го примени врз следачите, да чува доказ за него, да ги објави документите што го објаснуваат и да ги прима барањата на субјектите на податоците.
Испорачани се единаесет профили на усогласеност — од ГДПР до CCPA, преку квебечкиот Закон 25, бразилскиот LGPD или индискиот DPDP. Активниот профил го одлучува моделот на согласност (opt-in или opt-out), стандардните вредности на Google Consent Mode, текстот на генерираните документи, објавените права и наведениот надзорен орган.
Сѐ останува во вашиот сајт. Приклучокот контактира само една надворешна услуга, Global Vendor List на IAB Europe, и тоа само ако го вклучите модулот TCF, кој е исклучен по правило. Без телеметрија, без сметки, без претплата.
Спојлив со целосен кеш на страници, по конструкција
Тоа е архитектонската точка што управува со сѐ останато. Ништо од она што серверот го прикажува не зависи од колачето за согласност. HTML-от е идентичен за сите посетители: следачите се препишани во инертни ознаки за секого, а еден JavaScript рантајм ги ослободува во прелистувачот, категорија по категорија, читајќи го колачето пред првото исцртување.
Практична последица: LiteSpeed Cache, WP Rocket, Varnish или CDN не можат да го сервираат
изборот на еден посетител на друг. Само вистински личните одговори — страницата за потврда
на идентитет при барање за остварување на правата, REST-одговорите што содржат податоци за
посетителот — се изречно означени како некеширачки. Ниту еден nonce не се печати во
кеширачки HTML: банерот презема свеж nonce од крајна точка со no-store непосредно пред
секој запис.
Што е испорачано
- Банер за согласност: четири позиции, светла / темна / автоматска тема, „Одбиј сѐ“ подеднакво видливо како „Прифати сѐ“, панел со преференции достапен со тастатура, целосно преводлив.
- Автоматско блокирање на следачите: скрипти, вградени фрагменти, iframe-ови, пиксели,
наговестувања за ресурси (
preconnect,dns-prefetch,preload), analytics/marketing стилски листови и медиуми од трети страни, врз основа на 175 потписи испорачани и уредливи. - Скенер на следачи: скенирање на вашите сопствени страници преку WP-Cron, читање на
заглавјата
Set-Cookie, сонда во прелистувачот резервирана за администратори, и панел што секогаш кажува што скенирањето навистина опфатило. - Генератор на правни документи: политика за приватност и политика за колачиња за сите единаесет профили, на јазикот на јурисдикцијата; правни информации и општи услови на француски.
- Регистар на согласности: секое дејство се додава во табела поврзана во синџир со HMAC, заедно со важечкиот профил, отпечатокот на објавените документи и отпечатокот на банерот што бил навистина прикажан.
- Портал за правата (DSAR): формулар преку shortcode, потврда преку е-пошта, рокот од членот 12.3 што почнува со потврдата на идентитетот, поврзување со изворниот извозник и бришач на WordPress.
- Google Consent Mode v2, IAB TCF v2.2, Global Privacy Control, регионално откривање, интеграција со OW Forms: секое се вклучува независно.
- Целосен REST API под namespace-от
owc/v1.
Што не прави — прочитајте пред да се обврзете
Во една правна материја, претераното ветување ве изложува вас исто толку колку и издавачот. Еве ги ограничувањата, онака како што се напишани во кодот.
- Генерираните документи се шаблони, не правен совет. Секој документ завршува со предупредување што го кажува тоа, и тоа предупредување е вклучено по правило. Дајте ги документите на преглед пред да ги објавите.
- Модулот TCF не е CMP регистриран кај IAB Europe. Тој бара CMP ID што сами треба да го обезбедите, не нуди никаков избор на ниво на добавувач, а добавувачите имаат основа да го одбијат неговиот сигнал. Ако рекламниот приход преку TCF ви е важен, користете сертифициран CMP.
- Регистарот е неизменлив само под услов. Синџирот е доказ само ако клучот за потпишување живее надвор од базата на податоци. Приклучокот го открива спротивниот случај, самиот го пријавува и ви го кажува во администрацијата, наместо да тврди обратно.
- Скенерот не извршува JavaScript. Тој гледа што содржи вашиот HTML и што оставаат
вашите заглавја
Set-Cookie; она што менаџерот на ознаки го внесува при извршување го гледа само сондата резервирана за најавени администратори. - Стандардното блокирање не значи „сѐ што е од трета страна“. Непозната скрипта од трета страна е дозволена по правило; iframe-овите се тие што се блокирани по правило. Блокирањето почива на каталогот со потписи, кој можете да го проширите.
- Без JavaScript не може да се запише никаков избор. Посетителот гледа блок
<noscript>и ништо што не е неопходно не се вчитува, но и ништо не се запишува. - Нема поделба по држава во САД ниту по покраина во Канада во регионалното откривање:
целата американска територија го добива профилот
ccpa, цела Канада го добиваquebec. - Правните информации и општите услови постојат само на француски. За секоја јурисдикција чиј целен јазик не е француски, генераторот одбива да ги произведе тие два документа, наместо да објави неприлагоден текст.
- Нема посебна улога: целата администрација бара овластување
manage_options.
Овој список е свесен избор, а не прикриена патна карта. Кај усогласеноста, алатка што ги кажува своите дупки вреди повеќе од алатка што ги крие.
Инсталација
Од .zip
- Преземете
ow-consent-1.4.3.zipод https://optionweb.dev/mk/addons/ow-consent/ - Приклучоци → Додај нов → Качи приклучок
- Изберете ја датотеката, кликнете на Инсталирај, потоа на Активирај
Преку FTP
Отпакувајте ја архивата и ставете ја папката ow-consent во /wp-content/plugins/,
потоа активирајте го приклучокот од Приклучоци.
Предуслови
- WordPress 6.2 или понов — тоа е одбивање да стартува, не препорака (видете подолу)
- PHP 7.4 или понов
- MySQL 5.7+ / MariaDB 10.2+
- Функционален WP-Cron ако го користите скенерот, чувањето на регистарот, потсетниците за роковите на DSAR или модулот TCF
Заштитната ограда за WordPress 6.2. Од верзијата 1.3.0, секој идентификатор на табела е врзан преку маркерот
%iнаwpdb::prepare(), кој WordPress го разбира дури од 6.2. На постаро јадро,prepare()би вратил празна низа, каталогот на следачи тивко би се сведол на празно множество, а банерот би продолжил да му ветува на посетителот блокирање што нема да се случи. Затоа приклучокот одбива да стартува и прикажува порака за грешка што изречно вели дека ништо не е блокирано и дека ниедна согласност не се запишува. ЗаглавјетоRequires at leastвеќе ја спречува активацијата под 6.2, но не го покрива ниту враќањето на јадрото на постара верзија под инсталација во работа, ниту копија оставена преку FTP.
Што се инсталира
При активација, OW Consent создава четири табели:
| Табела | Содржина |
|---|---|
{prefix}owc_ledger | Регистарот на согласности, поврзан во синџир со хешови |
{prefix}owc_dsar | Барањата за остварување на правата |
{prefix}owc_scanner | Наодите на скенерот на следачи |
{prefix}owc_scripts | Каталогот со потписи што го користи блокирањето |
Петта табела, {prefix}owc_form_links, се создава посебно од интеграцијата со OW Forms
ако сестринскиот приклучок е активен (видете Интеграцијата со OW Forms).
Активацијата додава и:
- опцијата
owc_settings, посеана празна — намерно: сѐ додека не сте зачувале ништо, сите текстови доаѓаат од англиските стандардни вредности, преведени во лет на јазикот на сајтот, наместо во базата да се замрзне локалот на лицето што го активирало приклучокот; - опцијата
owc_version; - испорачаниот каталог на следачи (
data/tracker-catalog.json), внесен во групи по 100 соINSERT IGNORE, со знаменце за сеење по верзија (owc_catalog_seeded_1.4.3); - дневната задача
owc_daily_maintenance, закажана еден час по активацијата.
Уште пет cron-настани ги наоружуваат модулите што ги користат. Шесте cron-куки на
приклучокот се: owc_scanner_run, owc_scanner_run_batch, owc_ledger_retention,
owc_tcf_refresh_gvl, owc_run_upgrade и owc_daily_maintenance.
Во multisite, табелите се создаваат по сајт, никогаш заеднички
(wp_2_owc_ledger и слично). Мрежната активација ги обиколува сите сајтови само ако
мрежата брои најмногу 200 сајта; над тоа, секој сајт се обезбедува лениво при своето прво
барање. Подсајт создаден по мрежна активација се обезбедува преку куката
wp_initialize_site.
Што да дефинирате во wp-config.php
Ниту една од овие константи не е задолжителна, но две од нив ја менуваат доказната вредност на она што приклучокот го произведува.
// Препорачано: го изведува клучот за потпишување на регистарот надвор од базата.
define( 'OWC_LEDGER_KEY', 'долга случајна низа, единствена за овој сајт' );
// Препорачано: стандардните WordPress salts. Без нив, WordPress ги чува во базата,
// и регистарот самиот се пријавува како неизменлив.
define( 'AUTH_KEY', '…' );
define( 'AUTH_SALT', '…' );
// Ако сајтот е зад CDN, балансер на оптоварување или reverse proxy.
// Без оваа константа, CF-Connecting-IP, X-Forwarded-For и X-Real-IP се ИГНОРИРААТ
// и се користи само REMOTE_ADDR — што им дава ист идентитет на сите ваши посетители
// за ограничувањето на брзината.
define( 'OWC_TRUSTED_PROXY', '198.51.100.0/24, 2001:db8::/32' );
// `OWC_TRUSTED_PROXIES` се прифаќа како алијас; работи и низа и низа од вредности.
// Само за регионално откривање: изјавува кои заглавја за земја се доверливи.
define( 'OWC_GEO_TRUSTED_HEADERS', 'cloudflare' ); // 'cloudflare'|'cloudfront'|'proxy'|'all'
define( 'OWC_BEHIND_CLOUDFLARE', true );
define( 'OWC_BEHIND_CLOUDFRONT', true );
OWC_LEDGER_KEY служи и за изведување на клучот на колачето за регионално откривање. Ако
не е дефинирана, клучот на регистарот паѓа на wp_salt('auth').
Кој има пристап
Целата администрација на приклучокот и сите административни REST-рути бараат овластување
manage_options. Не постои ниту посебна улога, ниту пофино овластување: да му го
отворите екранот на приклучокот на некого значи да му ги дадете поставките на сајтот.
Патека на надградба
Приклучокот никогаш не ја мигрира својата шема во лет на анонимна страница. Кога верзијата
се менува, owc_version и знаменцето owc_pending_upgrade се запишуваат веднаш, потоа:
- миграцијата се извршува inline ако барањето е административно барање надвор од AJAX, извршување на cron или WP-CLI команда;
- инаку се закажува настан
owc_run_upgradeпет секунди подоцна.
admin-ajax.php се третира како анонимно барање: тоа е јавна влезна точка. Миграцијата се
извршува под брава (owc_upgrade_lock, одземена по 300 секунди), а мрежа за спасување на
admin_init ги фаќа сајтовите каде што WP-Cron е исклучен. При иста верзија, вкупната цена
е едно единствено get_option().
Деактивација и бришење
Деактивацијата ги чува сите податоци и ги брише само шесте cron-настани. При мрежна деактивација, сите сајтови се обиколуваат во серии по 200 — за разлика од активацијата — затоа што cron оставен наоружан никогаш не би исчезнал.
Бришењето на приклучокот го активира uninstall.php, кој постапува во два чекора:
- Секогаш, без оглед на вашата поставка: шесте cron-задачи се бришат и табелата
{prefix}owc_dsarсе отстранува, заедно со нејзините transient-и за ограничување на брзината. Тоа е единствената табела што содржи директно идентификувачки лични податоци за трети лица (адреса на е-пошта, име, слободен текст); штом приклучокот го нема, ништо повеќе не го ограничува нивното чување и ниту еден екран не овозможува да им се одговори, да се извезат или да се избришат. Извезете ги барањата што морате да ги зачувате пред да го избришете приклучокот. - Само ако
delete_data_on_uninstallе изречно вклучено: бришење на табелитеowc_ledger,owc_dsar,owc_scanner,owc_scriptsиowc_form_links, на именуваните опции, на сите опции со префиксowc_(вклучувајќи ги transient-ите) и наusermetaсо префиксowc_. Во multisite, мрежните опции ја следат одлуката на главниот сајт.
Таа поставка е исклучена по правило: доказот за согласноста, кој го бара членот 7.1 од ГДПР, го преживува бришењето на приклучокот.
Брз почеток
По активацијата, отворете ја ставката OW Consent во страничната лента на администрацијата. Целиот приклучок се собира на тој единствен екран, во десет картички: Dashboard, Banner, Compliance, Legal identity, Categories, Policies, Scanner, Tracker catalogue, Audit ledger, DSAR requests.
Едно зачувување се однесува само на отворената картичка. Тоа е намерно: секој булев прекинувач има свое скриено поле-близнак, и клуч што недостига во формуларот значи „ова поле е на друга картичка“, никогаш „отштиклирано“. Без тоа, зачувувањето на една картичка би ги пребришало поставките на сите други.
1. Изберете го својот профил на усогласеност
Картичка Compliance. Профилот го одлучува моделот на согласност, стандардните вредности
на Consent Mode, генерираните документи и објавените права. Стандардно: gdpr.
compliance_strict е вклучено по правило: тоа е она што го проширува блокирањето
надвор од скриптите регистрирани од WordPress. Оставете го активно ако сакате да се
обработуваат и iframe-овите, пикселите и скриптите зашиени во вашата тема.
2. Пополнете го правниот идентитет
Картичка Legal identity. Тие полиња се суровината на генерираните документи, а генерирањето се одбива сѐ додека некое задолжително поле е празно — со список на клучевите што недостигаат, а не со тивок неуспех.
Минимум за сите документи: legal_company_name и legal_company_email. За сѐ освен
политиката за колачиња, додајте ги адресата и земјата. За правните информации, додајте и
телефон, директор на изданието и целосните податоци за хостерот; во Франција, Белгија и
Луксембург, правната форма и матичниот број исто така стануваат задолжителни.
Оставете го legal_dpa_authority празно: надзорниот орган се изведува од вашата земја
и вашиот профил. Да го внесете рачно на сајт со повеќе јурисдикции значи да го именувате
погрешниот регулатор.
3. Проверете ги своите категории
Картичка Categories. Шесте категории се достапни по правило. Исклучете ги оние што
вашиот сајт не ги користи: категорија што ја нема во интерфејсот не е добивка во
усогласеност, туку ресурс блокиран засекогаш без прекинувач што би го ослободил —
блокирањето тогаш го прелева врз marketing.
Оставете ги ознаките празни сѐ додека ви одговараат: тогаш го следат јазикот на сајтот. Штом приспособите некој текст, тој текст престанува да го следи јазикот.
4. Наместете го банерот
Картичка Banner. Позиција, тема, копчиња, ознаки, рок на обновување.
Две работи што не смеете да ги пропуштите: оставете го banner_reject_all вклучено
(„Одбиј“ мора да биде исто толку едноставно и видливо колку и „Прифати“), и оставете го
крстчето за затворање исклучено — го нема по правило затоа што затворањето без избор
претставува премолчено одбивање. Ако го вклучите, кликот на крстчето го извршува целосниот
пат „Одбиј сѐ“, никогаш тивко затворање.
5. Генерирајте ги своите документи
Картичка Policies. Четири документа: политика за колачиња, политика за приватност, правни информации, општи услови. Секој станува верзионирана WordPress-страница, чиј линк се враќа назад во поставките.
Прво генерирајте во преглед, прочитајте, па објавете. И дајте ги на преглед кај професионалец: лентата со предупредување на дното на секој документ не е украс.
6. Отворете го порталот за правата
Создајте страница и залепете [owc_dsar_form]. Внесете dsar_email во картичката
DSAR requests: тоа е адресата за контакт објавена под формуларот и примачот на
известувањата. Без неа, приклучокот паѓа на legal_dpo_email, потоа на admin_email — но
admin_email никогаш не се објавува на јавна страница.
7. Проверете пред да отворите за јавноста
Контролната табла извршува петнаесет проверки на усогласеност и ги разликува грешките од предупредувањата: исклучен банер, отсутно „Одбиј сѐ“, вклучено крстче за затворање, непотполн правен идентитет, затворен портал за правата, исклучен регистар, ниту една поврзана политика, надзорен орган во противречност со активниот профил (со копче „Fix this“ што го ресетира), сајт што не е на HTTPS, некатегоризирани следачи, DSAR барања надвор од рок, каталошки правила што не можат да се активираат.
Доведете ги тие петнаесет линии до зелено пред да објавите дека вашиот сајт е усогласен.
Единаесетте профили на усогласеност
Профилот на усогласеност не е козметика. Тој го води правниот модел, интерфејсот, техничките сигнали и содржината на објавените документи.
Списокот
| Профил | Цел на режимот | Модел |
|---|---|---|
gdpr | ГДПР + ePrivacy (ЕУ/ЕЕП) | Opt-in |
uk_pecr | UK GDPR + PECR (Обединето Кралство) | Opt-in |
ch_nfadp | Швајцарскиот nLPD | Opt-in |
quebec | Закон 25 (Квебек) | Opt-in |
lgpd | LGPD (Бразил) | Opt-in |
popia | POPIA (Јужна Африка) | Opt-in |
pipl | PIPL (Кина) | Opt-in |
dpdp | DPDP Act 2023 (Индија) | Opt-in |
ccpa | CCPA / CPRA (Калифорнија) | Opt-out |
us_generic | Генерички американски државни закони | Opt-out |
au | Privacy Act (Австралија) | Opt-out |
Поставка: compliance_profile, стандардно gdpr.
Opt-in значи дека пред каков било избор се одобрени само задолжителните категории.
Opt-out значи дека сѐ е одобрено додека не се одбие. Трите opt-out профили се
ccpa, us_generic и au. JavaScript рантајмот го применува точно истото правило како
PHP, така што серверот и прелистувачот не можат да пријават две различни состојби.
Што навистина менува профилот
| Што се менува | Детал |
|---|---|
| Модел на согласност | Opt-in, освен ccpa, us_generic, au |
| Стандардни вредности на Consent Mode | Седумте сигнали одат на granted под opt-out профил |
| Задолжителен линк „Do Not Sell or Share“ | Само ccpa и us_generic |
| Правно обврзувачки GPC | Само ccpa и us_generic — Австралија е изречно исклучена: opt-out режим, но што не го признава GPC |
| Опфат „ГДПР се применува“ за TCF | 27 земји од ЕУ + IS, LI, NO + GB + CH, вкупно 31 код |
| Јазик на генерираниот документ | quebec → француски; lgpd → португалски; gdpr со земја FR, BE или LU → француски; сѐ останато → англиски |
| Наведен надзорен орган | Табела по профил, доуточнета по земја за ГДПР |
| Објавен список на права | Список напишан по профил, со цитат на член |
| Тело „режим на колачиња“ на англискиот документ | Различен текст, опфат на пренос и гаранции по профил |
Генерираните документи по профил
Политиката за приватност и политиката за колачиња постојат за сите единаесет профили.
Шаблоните се разрешуваат по овој редослед, првиот пронајден победува:
<type>_<профил>_<јазик>, потоа <type>_<профил>, потоа <type>_<јазик>, потоа <type>.
Англиските тела на политиката за колачиња се свесни за профилот: применливото правило,
опфатот на пренос, гаранциите и ознаката на панелот се разликуваат за gdpr, uk_pecr,
ch_nfadp, au, pipl, dpdp, ccpa и us_generic, со соодветните цитати
(чл. 5(3) од директивата 2002/58, PECR reg. 6, чл. 45c(b) LTC и
чл. 19/6(7)(b) nLPD, APP 8, чл. 24 PIPL, деловите 5/6/7/9(3)/16 од DPDP Act 2023,
§1798.121 и Cal. Code Regs. tit. 11 §7025, VCDPA/CPA/CTDPA/UCPA/TDPSA).
Наведен надзорен орган
| Профил | Именуван орган |
|---|---|
gdpr, земја FR | CNIL |
gdpr, земја BE | APD-GBA |
gdpr, земја LU | CNPD |
gdpr, земја DE | BfDI |
gdpr, друга земја од ЕЕП | Општа формулација („надлежниот надзорен орган“) |
uk_pecr | ICO |
ch_nfadp | PFPDT / FDPIC |
quebec | Commission d'accès à l'information |
lgpd | ANPD |
ccpa | California Privacy Protection Agency |
popia | Information Regulator (South Africa) |
pipl | Cyberspace Administration of China |
dpdp | Data Protection Board of India |
au | OAIC |
us_generic | Attorney General на вашата држава |
Ако сте го изменале legal_dpa_authority, вашиот внес има предност над ова изведување.
Ограничувања на јурисдикцискиот опфат
- Само четири земји од ЕЕП имаат именуван орган (FR, BE, LU, DE). ГДПР сајт во Шпанија, Италија или Холандија објавува општа формулација.
- Нема поделба по држава во САД. Профилот
us_genericпостои и ги носи своите сопствени текстови VCDPA/CPA/CTDPA/UCPA/TDPSA, но ниту едно автоматско откривање не го доделува: се избира рачно. - Нема поделба по покраина во Канада.
- Само три јазика на документите: француски, англиски, португалски. Телата не поминуваат низ механизмот за превод на WordPress — тоа е намерно: правен документ мора да биде еднојазичен, а неговиот јазик ја следи јурисдикцијата, никогаш локалот на администраторот.
- Правни информации и општи услови: само француски шаблони. Генераторот категорично
одбива за секој друг целен јазик, освен ако не го обезбедите вашето сопствено тело преку
филтерот
owc_policy_template.
Категориите колачиња
Канонскиот список
Шест категории, во овој редослед на прикажување, necessary секогаш прва:
| Slug | Испорачана ознака | Испорачан опис |
|---|---|---|
necessary | Necessary | Strictly required for the site to function (cart, login, language preferences). Cannot be disabled. |
functional | Functional | Enhance the experience (chat, embedded videos, maps). Without them some features may not work. |
analytics | Statistics | Help us understand how you use the site (anonymously). No personal data is shared for commercial purposes. |
marketing | Marketing | Enable us to show you ads and content tailored to your interests on other sites. |
preferences | Preferences | Remember your interface choices (layout, saved filters). |
social | Social & embeds | Allow embedded social content (YouTube, Instagram, X) to load. |
Вредностите погоре се англиските стандардни вредности што можат да се зачуваат. На сајт на македонски, посетителот ја гледа преведената верзија — видете го механизмот за превод подолу.
Достапност
Поставка cat_<slug>_available, по една за секоја категорија. Сите шест се достапни по
правило. Стариот клуч cat_<slug>_enabled сѐ уште се чита како резерва, без миграција.
preferences и social се испорачуваат како достапни затоа што каталогот на семето ги
класифицира YouTube, Spotify, SoundCloud, Instagram, X и Facebook во social: без таа
категорија во интерфејсот, тие интеграции би останале трајно блокирани без начин за opt-in.
necessary е задолжителна: не може да се исклучи (чл. 5.3 од ePrivacy). Затоа нема
прекинувач за достапност во администрацијата, само ознака и опис.
Механизмот за превод
Поставки cat_<slug>_label и cat_<slug>_desc. Зачуваната вредност се враќа дословно
само ако не е празна и ако се разликува од англиската стандардна вредност; инаку излегува
преводот.
Последица што вреди да се знае: сѐ додека ништо не приспособувате, менувањето на јазикот на сајтот го менува јазикот на категориите. Штом внесете свој сопствен текст, тој текст е замрзнат на јазикот на кој сте го напишале. Истото правило важи и за текстовите на банерот.
Преведениот опис на necessary е составен од две низи: втората ги именува колачињата на
самиот приклучок, owc_consent (до 13 месеци) и owc_geo (24 часа, се запишува само кога
е вклучено регионалното откривање).
Пресликување кон Google Consent Mode v2 — обврзувачко
Тоа е единствениот извор на вистина на приклучокот: банерот, блокирањето и bootstrap-от сите ја читаат оваа табела, па затоа не можат да се разидат.
| Категорија | Сигнали на Consent Mode v2 |
|---|---|
necessary | security_storage, functionality_storage |
functional | functionality_storage, personalization_storage |
analytics | analytics_storage |
marketing | ad_storage, ad_user_data, ad_personalization |
preferences | personalization_storage |
social | ad_storage, ad_user_data |
Важна нијанса: ако вашиот сајт ја изложува категоријата functional,
functionality_storage се отстранува од списокот на necessary. Инаку би бил одобрен
пред каква било согласност, иако припаѓа на изборна категорија.
Пресликување кон TCF — само описно
functional → functional, analytics → measurement, marketing → advertising,
preferences → personalization, social → social_media.
Тоа се ознаки за прикажување. Обврзувачкото пресликување кај TCF е табелата со нумеричките идентификатори на целите на IAB, опишана во делот IAB TCF v2.2. Никогаш не врзувајте TCF-однесување за овие пет ознаки.
Што се случува ако некоја категорија исчезне
Ако правило од каталогот покажува кон категорија што вашиот сајт повеќе не ја изложува —
на пример сте ја исклучиле social — блокирањето го прелева ресурсот врз marketing, или
во недостиг на неа, врз првата достапна изборна категорија. Без таа нормализација, ресурсот
би бил блокиран засекогаш без ниту еден прекинувач за да се ослободи.
Банерот
Кога се прикажува
Банерот се исцртува на wp_footer со приоритет 5, а неговите ресурси се редат на
wp_enqueue_scripts. Тој излегува веднаш ако е точен некој од овие услови: административен
контекст, RSS-канал, robots.txt, или исклучен banner_enabled. Излегува и ако wp_head
никогаш не бил активиран — тема што не повикува wp_head() инаку би добила инертен и
нестилизиран HTML.
HTML-от е идентичен за сите посетители. Сите полиња во панелот се исцртуваат на OFF на
серверот, па потоа се хидрираат кај клиентот од колачето. JavaScript е тој што го поставува
<html data-owc="given|none"> синхроно, пред првото исцртување; CSS-от го прикажува банерот
само на data-owc="none".
Последица што вреди да се знае: посетител без JavaScript никогаш не го гледа банерот,
па затоа никогаш не останува заклучен зад модален прозорец што не може да го затвори. Тој
наместо тоа гледа блок <noscript> што објаснува дека неговите преференции не можат да се
запишат и дека ниту едно неопходно колаче не се вчитува сѐ додека не е направен избор.
Позиции и тема
| Поставка | Вредности | Стандардно |
|---|---|---|
banner_position | bottom-bar, bottom-card, center-modal, top-bar | bottom-bar |
banner_style | auto, light, dark | auto |
Само center-modal добива role="dialog", aria-modal="true", затемнета позадина, замка
за фокусот и тастер Esc. Другите три позиции се role="region": Esc не се пресретнува
(темата си го задржува своето ракување), а фокусот не се одзема при првото исцртување, што
би го фрлило корисникот на тастатура зад сите линкови за прескокнување.
Темната палета се применува под prefers-color-scheme: dark со заштити за да не се
пребрише тема што изречно изјавува light. Темата на сајтот може да ја води палетата преку
CSS-променливи: --owc-paper-tint, --owc-ink, --owc-smoke, --owc-fog,
--owc-ui, --owc-accent, --owc-accent-strong, --owc-accent-darker.
Детали од имплементацијата: z-index 99998 за банерот и 99997 за позадината,
поддршка за env(safe-area-inset-*) за засеците на iOS, автоматско поместување под
административната лента на WordPress во горна позиција.
Копчињата
| Поставка | Стандардно | Ефект |
|---|---|---|
banner_accept_all | true | Прикажува „Прифати сѐ“ |
banner_reject_all | true | Прикажува „Одбиј сѐ“ |
banner_preferences | true | Прикажува „Прилагоди“ |
banner_close_x | false | Прикажува крстче за затворање |
banner_show_logo | true | Го прикажува логото на сајтот |
„Прифати сѐ“ и „Одбиј сѐ“ делат иста класа за обликување: иста позадина, иста рамка, иста дебелина, ист внатрешен простор. Тоа е одговорот на барањето на CNIL / EDPB (насоки 03/2022): одбивањето мора да биде исто толку едноставно и исто толку видливо колку и прифаќањето.
Крстчето за затворање
Тоа е исклучено по правило, затоа што крстче за затворање претставува премолчено одбивање. Три однесувања што треба да ги знаете:
- Кога
banner_close_xе исклучено, крстчето постои во HTML-от но носи атрибутhidden, а CSS-от целосно го отстранува: ниту видливо, ниту достапно за фокус, ниту најавено кај читачите на екран. - Кога е вклучено, кликот на крстчето го извршува целосниот пат „Одбиј сѐ“, никогаш тивко затворање.
- Тоа е откриено од рантајмот и преименувано во еден единствен случај: кога одбивањето воопшто не можело да се запише. Тогаш повеќе ништо не одбива, туку само го склонува известувањето — и тоа затворање не се смета за избор. Посетител чија одлука серверот ја одбива не се остава пред банер што не може да го затвори.
Првиот слој
- Насловот (
text_title) и пораката (text_message). Пораката е единственото поле со богат HTML во приклучокот; се исцртува соwp_ksesограничен на<a href target rel>. - Линкот кон политиката за приватност:
link_privacy_policy, со резервна опција на страницата со политика пријавена во WordPress ако поставката е празна. - Линкот кон политиката за колачиња:
link_cookie_policy, без резервна опција. - Името на контролорот:
legal_company_name, инаку името на сајтот, прикажано како „Контролор: …“ (чл. 13(1)(a)). - Логото: приспособеното лого на темата во големина
medium, инаку иконата на сајтот.
Панелот со преференции
Еден ред по достапна категорија, во именуван role="group".
- Задолжителна категорија прикажува текстуална ознака „Always active“, без прекинувач.
- Изборна категорија прикажува
<button role="switch">соaria-checked,aria-labelledbyиaria-describedby. Состојбата ја носатaria-checked, позицијата на лизгачот и видлив збор On/Off — никогаш само бојата. - Зголемена цел за допир на 44 px на мал екран (WCAG 2.2 AA, критериум 2.5.8).
- Лентата со дејства на панелот е
stickyна дното, за да остане „Зачувај ги моите избори“ достапно додека списокот се прелистува.
Ако модулот TCF е активен, се појавуваат два дополнителни блока: достижните TCF-цели и пријавените специјални функции. Видете IAB TCF v2.2.
Обновување на согласноста
| Поставка | Стандардно | Граници |
|---|---|---|
consent_renewal_months | 12 | 0 до 13 |
consent_policy_hash_check | true | — |
0 не значи „никогаш повторно да не се прашува“. Вредноста 0 се претвора во 13 месеци,
а 13 месеци е тврдата горна граница (одлука на CNIL 2020-091). Затоа ефективното траење е
секогаш меѓу 1 и 13 месеци, и токму таа иста вредност го води траењето на колачето,
серверската проверка на истечност и траењето објавено во генерираните документи. Константата
OWC_COOKIE_TTL видлива во изворниот код е само резерва.
consent_policy_hash_check бара согласност повторно кога вашите документи ќе се сменат:
колачето носи отпечаток од поврзаните страници со политики, а разлика го отвора банерот
одново. Отпечатокот е празна низа кога ниту една страница не е поврзана — тоа е она што
овозможува да се разликува „непознато“ од „сменето“ и никогаш да не се прашува цел сајт
одново врз основа на празна споредба.
Текстовите
Седум места, сите празни по правило и затоа автоматски преведени:
text_title, text_message, text_accept_all, text_reject_all, text_preferences,
text_save, и floating_button_label за пловечкото копче.
Во администрацијата, секое поле ја прикажува својата преведена стандардна вредност како placeholder: ако го оставите празно, се задржува стандардната вредност што го следи јазикот на посетителот.
Филтерот owc_banner_texts овозможува овие текстови да се заменат преку код. Се прифаќаат и
дополнителни места; нескаларните или празните вредности се отфрлаат за да не може невешт
callback да го испразни банерот.
Како навистина се запишува изборот
JavaScript рантајмот е во строг ES5 — без стрелкасти функции, без шаблонски низи — за да работи во прелистувачите вградени во апликациите и во старите WebView-и. Неговата низа на запишување вреди да се знае, затоа што таа ги објаснува повеќето пораки за грешка.
- Повторно всидрување на потеклото. REST URL-адресите доаѓаат од конфигурацијата на
WordPress. Ако вашите посетители се движат на друг хост (www наспроти apex, алијас, домен
за преглед, прокси што го препишува
Host), тоа URL е cross-origin и прелистувачот одбива да го зачуваSet-Cookieдодека WordPress одговара со 200. Затоа рантајмот ја всидрува патеката дадена од PHP врз навистина посетеното потекло. - Nonce. Се презема свеж од
GET /owc/v1/nonceнепосредно пред записот, никогаш не се вградува во кеширачки HTML, се праќа во заглавјетоX-OWC-Nonce. Преземањето е ограничено на 4 секунди, а nonce што недостига, е празен или е недостижен никогаш не го спречува записот ниту се пријавува кај посетителот. - Изречен
page_urlво телото на барањето, за да не зависи редот во регистарот од заглавјетоReferer, кое приклучок, meta-referrer или прокси можат да го отстранат. - Заштита од блокирање од 15 секунди со
AbortController: барањето се откажува, не само се игнорира, за задоцнет POST да не запише втор ред. - Дефиниција на успех. POST-от е успешен ако и само ако: одговорот е
ok, телото е парсибилен JSON,json.ok === true, и колачето е повторно прочитано во прелистувачот. Кеш-страница, предизвик на работ на мрежата или WAF сервиран со 200 не се сметаат. - Ако серверот одговори
cookie_set: false, рантајмот сам го запишува колачето со вратените параметри, потоа повторно чита. Неуспехот си останува неуспех: ништо не се објавува, ништо не се одблокира. - Само едно повторно праќање, и тоа само на 403 чиј код е
owc_bad_nonce,rest_cookie_invalid_nonceилиrest_nonce_invalid, и само ако добиениот nonce е навистина различен. - Она што рантајмот го објавува е она што серверот го зачувал: категориите одбиени од серверот се одземаат од локалната состојба.
Сѐ додека POST-от не успее, ништо не се открива, ништо не се одблокира и не се емитува ниту еден сигнал „granted“ на Consent Mode.
Таксономијата на грешките
Рантајмот разликува девет причини, секоја со своја видлива порака: network, refused,
ratelimit, unexpected, timeout, browser, config, cookie,
owc_cookie_not_persisted. HTTP-статусот и серверскиот код се ставаат на елементот
(data-owc-status, data-owc-code) и се запишуваат еднаш во console.warn — никогаш не се
исцртуваат како видлив текст. Затоа снимка од екранот испратена до поддршката ја именува
причината без да е потребен мрежен запис.
JavaScript API-то на банерот
window.OWCBanner.show(); // отвора во режим на банер
window.OWCBanner.hide(); // затвора
window.OWCBanner.openPreferences(); // го отвора панелот со преференции
window.OWCBanner.openDnsmpi(); // го отвора панелот со marketing, social
// и preferences веќе на OFF (CCPA влез)
window.OWCBanner.reset(); // го брише колачето кај клиентот, праќа повлекување,
// потоа ја превчитува страницата
window.OWCBanner.acceptCategory( 'social' ); // враќа promise решен на true
// само ако серверот навистина зачувал
Полесен bootstrap се печати во <head> со приоритет 1 и го изложува
window.OWConsent: .config, .categories, .geo, .profile, .optOut, .state,
.has(cat), .refresh(), .paint(), .gcmSignals(state). Неговата конфигурација е
филтрирачка преку owc_bootstrap_config — но сѐ што се наоѓа таму е јавно и
споделено од кешот: никогаш не ставајте таму податок што е специфичен за еден посетител.
Отворање на панелот од вашите страници
Три начина, сите еднакви:
- URL-фрагментот
#owc-preferences(или#owc-dnsmpi), кој се зема предвид при вчитување и наhashchange; - секој елемент со класата
owc-open-preferencesили со атрибутотdata-owc-open; - атрибутот
data-owc-dnsmpi="1"за да се наметне однесувањето „Do Not Sell“.
Настанот owc:consent-changed се емитува при секоја промена, со испратениот товар во
деталот. Него го слушаат bootstrap-от, пловечкото копче, CCPA рантајмот и модулот TCF;
можете и вие да го слушате.
Ограничувања на банерот
- Сѐ зависи од
wp_head()иwp_footer(): тема што не ги повикува не добива ништо. - Без
window.fetchиwindow.Promise, никаков запис не е можен и се прикажува грешкатаbrowser. - Согласност може да се запише на серверот без да се зачува во прелистувачот (адресата на сајтот се разликува од посетениот хост, блокирано складирање, полн cookie jar). Рантајмот го открива тој случај, одбива да го смета за успех, прикажува посебна порака и го пренесува фактот до серверот при следниот запис.
- Банерот нема shortcode: се прикажува насекаде или никаде.
Автоматското блокирање
Ова е модулот што го претвора изборот во вистински ефект. Тој ги препишува ознаките што носат следачи пред каква било согласност, за секого, и го остава рантајмот да ги ослободи во прелистувачот.
Два режима, една поставка
compliance_strict, вклучено по правило.
- Исклучено (мек режим): закачен е само филтерот
script_loader_tag. Со други зборови, се препишуваат само скриптите регистрирани соwp_enqueue_script().<script>зашиен во темата, embed, iframe,<img>пиксел: ништо не се допира. - Вклучено (строг режим): покрај филтерот, бафер за излез го фаќа целиот документ, а се
обработува и HTML-от исцртан преку REST API. Во администрацијата, ако барањето е
admin-ajax.php, посебен бафер ги покрива одговорите што го опслужуваат и предниот дел („вчитај повеќе“, филтрирани архиви) — но само ако самиот handler изјавилContent-Type: text/html.
Што никогаш не се баферира
Строгиот бафер излегува веднаш за: администрацијата, AJAX-барањата, каналите,
robots.txt, trackback-ите, cron, favicon-ите, REST-барањата, JSON-барањата,
прегледот на Customizer, sitemap-ите, и влезните точки
wp-login.php, wp-register.php, wp-signup.php, xmlrpc.php, wp-cron.php,
wp-trackback.php — проверени по точното име на скриптата, никогаш како подниза во URL-то.
Излегува и за барањата на скенерот, на кои им треба сировиот HTML.
Петте поминувања
Препишувањето се прави со прецизно калибрирани регуларни изрази, никогаш со DOM-парсер. Три заштитни огради го обвиткуваат целото: документ поголем од 8 MB се враќа недопрен, откажување на PCRE-машината го враќа документот недопрен, а ако резултатот е помал од половина од оригиналната големина, се враќа оригиналот. Со други зборови, режимот на откажување на блокирањето е „страница сервирана без блокирање“, никогаш „скршена страница“.
Поминување 0 — маскирање. HTML-коментарите, <style> и <textarea> се заменуваат со
маркери базирани на контролни знаци, за ниту еден подоцнежен образец да не се совпадне
внатре во нив.
Поминување 1 — <script>. Одлука, по редослед:
- веќе обработено → недопрено;
- скрипта на самиот приклучок → недопрена;
type="text/plain"или тип што не е JS (ld+json,importmap,x-template) → недопрено;- URL-то се бара во
src,data-src,data-rocket-src,data-lazy-src,data-litespeed-src,data-cfsrc— значи, покриени се и атрибутите на приклучоците за перформанси; - хост во белата листа → недопрено; ресурс од прва страна што не личи на следач → недопрено;
- совпаѓање со каталогот во форма
хост + патека; URL од типотdata:илиjavascript:се декодира и се суди како вградено тело; - правило класифицирано како
necessaryникогаш не се блокира (Stripe.js, reCAPTCHA, Turnstile, cdnjs…): неговото блокирање не носи никаква усогласеност и го крши фрагментот што го повикува; - никакво совпаѓање →
blocker_unknown_script_policy, стандардноallow; - инаку препишување во
type="text/plain"соdata-owc-cat,data-owc-vendor,data-owc-srcи, ако изворниот тип бил посебен (module, на пример),data-owc-typeза да не се деградира вратената скрипта.
Вградените тела прво се споредуваат со каталошките правила од типот
inline_signature, потоа со четиринаесет тврдо кодирани всидрени потписи: fbq(,
_fbq.push, gtag(, dataLayer.push(, ga('…, _gaq.push, _paq.push, hjid,
clarity(, ttq.load|track|page, snaptr(, twq(, lintrk(, pintrk(. Изречен
исклучок: осамен gtag('consent', …), односно стандардна декларација на Consent Mode без
друг маркер, останува да се извршува.
Поминување 2 — <iframe>. Истите URL-атрибути, плус data-original и data-srcset.
Прва страна или бела листа → недопрено. necessary → недопрено, инаку формулар со captcha
би станал неиспратлив. Без совпаѓање → blocker_unknown_iframe_policy, стандардно
block. Блокираниот iframe добива src="about:blank" и се обвиткува во визуелна замена
што содржи копче „Прифати <добавувач>“ што ја одблокира соодветната категорија.
Поминување 3 — <img>, само следечки пиксели. Важно правило: сама по себе, една
каталошка линија никогаш не е доволна за да се неутрализира слика. Ако сликата се
совпаѓа со каталогот, но нејзината категорија не е ниту analytics ниту marketing — CDN
за слики, услуга за gravatar, хостер на фонтови — таа се остава недопрена, инаку би ги
бришеле медиумите на сајтот наместо еден следач. Само хеуристиката на ознаката може да
блокира: единаесет познати точки на собирање (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) или слика од трета страна со
димензии 1×1 пиксел. Тогаш src се заменува со проѕирен GIF, а се бришат сите атрибути
што носат URL, за да не го врати мрзливиот вчитувач оригиналот.
Поминување 4 — <link>. Условено од blocker_block_resource_hints, стандардно
true. Обработува само хостови што веќе се во каталогот, никогаш непознат.
- Наговестувањата за ресурси (
preconnect,dns-prefetch,prefetch,prerender,preload,modulepreload) кон каталогизирана трета страна се бришат, а не се одложуваат: наговестувањето отвора TCP+TLS врска и ги открива IP-адресата и TLS-отпечатокот на посетителот, а потоа нема што да се враќа. - Стилски лист класифициран како
analyticsилиmarketingсе неутрализира. - Google Fonts и другите хостови за типографија класифицирани како
functionalникогаш не се допираат: нивното неутрализирање дава текст со резервен фонт на целиот сајт, без никаква добивка во усогласеност.
Поминување 5 — <object>, <embed>, <source>, <video>, <audio>. Никогаш
стандардно блокирање: се обработува само трета страна што веќе е во каталогот. Атрибутите
autoplay и preload се отстрануваат.
Што се смета за „прва страна“
URL-то на сајтот, WordPress URL-то, URL-то на содржината, URL-то на includes, нивните
мрежни еквиваленти во multisite, и основата на прикачувањата. www. се отстранува при
споредбата. Секоја патека што почнува со /wp-content/ или /wp-includes/ е од прва
страна без оглед на хостот, за да се покријат CDN-препишувањата. Шемите што не се HTTP
(data:, blob:, javascript:) никогаш не се од прва страна.
Контра-исклучок: URL што содржи gtag, gtm.js, analytics, pixel, fbevents,
hotjar, matomo, piwik или clarity се обработува дури и на хостот на сајтот. Тоа
е она што фаќа самохостиран GTM или Matomo, како и прокси-адреси од прва страна.
Рантајмот за одблокирање
Се печати во <head> со приоритет 2. Неговата JSON-конфигурација содржи само името на
колачето и списокот надгледувани хостови — ништо што зависи од посетителот.
- Читање на состојбата: колачето
owc_consentсе декодира до стабилност, со најмногу три поминувања, затоа што колачињата запишани пред 1.4.3 биле кодирани двапати. - Заштита од динамички внесени скрипти: setter-от
HTMLScriptElement.prototype.srcиsetAttributeсе обвиткани. Вчитувач од прва страна што доделуваs.src = 'https://www.googletagmanager.com/gtm.js?id=…'се пресретнува и елементот се обележува пред извршување. Надгледуваниот список брои дваесет хостови: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. Сѐ што не е таму поминува без да биде вознемирено. Хостовите од вашата бела листа се отстрануваат од тој список пред печатењето. - Повторно внесување по редоследот на документот. Вратена надворешна скрипта ја блокира
редицата сѐ до нејзиниот
onloadилиonerror, со најмногу 5 секунди чекање, за недостижен добавувач да не го блокира остатокот. Атрибутотasyncсе применува само ако бил присутен од самиот почеток — без тоа, скрипта создадена соcreateElementби била присилена во асинхрона и конфигурацискиот фрагмент би се извршил пред својата библиотека. За вратена вградена скрипта,document.writeпривремено се пренасочува за да не го избрише документот. - Повлекување на согласноста: ако веќе применета категорија изречно премине на
false, рантајмот ја превчитува страницата. Веќе извршена скрипта не може да се растовари (чл. 7.3 од ГДПР). Категорија што едноставно ја нема во товарот не е повлекување. - Еден
MutationObserverповторно го скенира HTML-от внесен по вчитувањето (AJAX, мрзливо вчитани делови). - Клик на копчето на блокиран embed повикува
OWCBanner.acceptCategory(); ако API-то на банерот не постои, embed-от се одблокира локално, без ништо да се зачува.
Каталогот со потписи
Табела {prefix}owc_scripts. Испорачаната датотека, data/tracker-catalog.json, содржи
175 реда што покриваат 71 различни добавувачи:
| Распределба | Детал |
|---|---|
| По цел | 110 URL-обрасци, 65 имиња на колачиња |
| По тип | 172 текстуални фрагменти, 3 регуларни изрази |
| По категорија | necessary 55, marketing 37, functional 37, analytics 36, social 10 |
Колони: pattern, pattern_type (host, regex, inline_signature), match_target
(url или cookie), name, vendor, category, privacy_policy_url, gcm_signal,
tcf_vendor_id, retention_days.
Две однесувања што треба да ги знаете:
- Редовите со
match_target = 'cookie'никогаш не ги користи блокирањето. Тие служат само за табелата со колачиња во генерираните документи. Нивното споредување како подниза во URL е токму она што им го кршеше JavaScript-от на сајтовите. - Образец од типот
hostшто цели URL, покус од шест знаци и без точка, се одбива: „fr“ или „IDE“ би се совпаднале со „frame.js“ и „provider.js“.
Каталогот се кешира во кешот на објекти (1 час) и во transient (12 часа). Празен резултат
никогаш не се кешира. Секој запис ја активира акцијата owc_catalog_updated, која ги
празни тие кешови.
Картичката Tracker catalogue овозможува додавање, менување, бришење и пребарување на правила, со филтер „само правилата што не можат да се активираат“: празен или невидлив образец, регуларен израз што не се компајлира или што катастрофално се враќа наназад, преоткус образец без точка за URL, категорија што повеќе не постои. Таа дијагностика се прави во PHP, затоа што само PCRE-машината може да каже дали еден израз се компајлира.
Поставки на блокирањето
| Поставка | Стандардно | Вредности |
|---|---|---|
compliance_strict | true | булева |
blocker_unknown_script_policy | allow | allow, block |
blocker_unknown_iframe_policy | block | allow, block |
blocker_block_resource_hints | true | булева |
blocker_allowlist | '' | еден хост по ред |
Точки на проширување
// Хостови што никогаш не се блокираат, дополнително на blocker_allowlist.
add_filter( 'owc_blocker_allowlist', function ( array $hosts ) {
$hosts[] = 'cdn.moj-partner.example';
return $hosts;
} );
// Редови на каталогот пред валидација.
add_filter( 'owc_scripts_catalog', function ( array $rows ) {
$rows[] = array(
'pattern' => 'tracker.example.com',
'pattern_type' => 'host',
'match_target' => 'url',
'name' => 'Пример',
'vendor' => 'Primer DOO',
'category' => 'analytics',
);
return $rows;
} );
Јавниот метод OWC_Blocker::block_html_fragment( $html ) го применува блокирањето врз
фрагмент што не поминал низ баферот за излез.
Ограничувања на блокирањето
- Без
compliance_strict, се обработуваат само скриптите ставени во редица од WordPress. - Непозната скрипта од трета страна е дозволена по правило. Вистинското блокирање почива на каталогот и на вградените потписи — проширете ги.
- Заштитата од скрипти внесени преку JavaScript покрива само дваесет хостови; следач надвор од списокот внесен од код од прва страна поминува.
- Стилските листови класифицирани како
functional(веб-фонтови) намерно се пропуштаат. - Следач каталогизиран во
<img>, но класифициран поинаку одanalyticsилиmarketing, не се неутрализира. - Медиумите (
object,embed,source,video,audio) никогаш не се блокираат по правило: се обработува само трета страна што веќе е во каталогот. - Документ поголем од 8 MB, откажување на PCRE или губење на повеќе од 50 % од содржината даваат страница сервирана без никакво блокирање, тивко.
- Повлекувањето на согласноста предизвикува целосно превчитување на страницата.
Скенерот на следачи
Скенерот попишува што вашите страници навистина вчитуваат. Тој е исклучен по правило: вклучете го во картичката Scanner.
Три извора на откривање
Секој наод си го задржува потеклото и информацијата „може ли блокирањето да дејствува врз него“.
1. Сервираниот HTML. Скенерот презема примерок од URL-адресите на вашиот сопствен
сајт и го чита HTML-от: <script src> и <script data-owc-src> — значи, веќе блокираните
скрипти сепак се гледаат —, вградени потписи, <iframe>, надворешни стилски листови и слики
чие URL содржи 1x1, pixel, track, beacon или impression. Не се извршува никаков
JavaScript: она што менаџерот на ознаки го внесува при извршување е невидливо за ова
поминување.
2. Заглавјата Set-Cookie. Тоа се единствените колачиња што серверското скенирање може
да ги докаже, вклучувајќи ги и HttpOnly колачињата што сонда во прелистувачот никогаш
нема да ги види. Тие се означени како неблокирачки: ништо во блокирањето кај клиентот не
може да задржи колаче испратено од серверот. Колачињата на самиот приклучок се игнорираат.
3. Сондата во прелистувачот. Се печати во подножјето само за најавен корисник со
manage_options, и тоа само ако скенерот е вклучен. Таа го фотографира document.cookie
при вчитувањето, ги набљудува мутациите на DOM — тоа е она што го фаќа она што менаџерот на
ознаки го внесува —, го проверува document.cookie на секои 5 секунди за колачињата
запишани кај клиентот, и ги пренесува своите набљудувања на секои 2 секунди и на
beforeunload. Одговорот што ја носи сондата е означен како некеширачки.
Ограничување признаено во кодот: администраторот по правило веќе сѐ прифатил. Затоа сондата ја опишува состојбата по согласноста, не состојбата пред неа.
Скенирањето
Редицата URL-адреси е составена за да покрие шаблони, не страници: прво основните URL адреси (почетна страница, статична насловна, страница со објави и четирите поврзани страници со политики), потоа наизменично редење во круг по фамилија — до 30 страници, 15 објави, 5 по јавен приспособен тип содржина, 3 категории и 3 ознаки. Без тоа наизменично редење, триесет речиси идентични страници го трошеа целиот буџет, а WooCommerce-шаблоните никогаш не се достигнуваа.
Филтерот owc_scanner_urls овозможува додавање URL-адреси, но резултатот повторно се
ограничува на хостот на сајтот: скенерот никогаш не излегува од вашиот домен.
Секое барање се прави со рачно следени пренасочувања (најмногу два скока, секој скок
повторно проверен наспроти хостот на сајтот), одговор ограничен на 2 MB, заглавје
Cache-Control: no-cache, no-store и уникатен URL-параметар за да не се прочита кеширана
страница, и user-agent OW-Consent-Scanner/<version>. Одговор што не е HTML се смета за
прескокнат, не за неуспех.
Тајна за заобиколување се праќа во заглавјето X-OWC-Scanner за да се повлече
блокирањето и да се види сировиот HTML. Се споредува во константно време, а заглавјето се
проверува прво, за обичен посетител воопшто да не го предизвика читањето на опцијата.
Буџет, брава, продолжување
| Ограничување | Вредност |
|---|---|
| URL-адреси по извршување | scanner_max_urls, стандардно 25, граници 1 до 500 |
| Тајмаут по барање | scanner_timeout, стандардно 8 s, граници 1 до 60 |
| Временски буџет по серија | max_execution_time − 10 s, инаку 45 s, ограничено меѓу 5 и 60 s |
| Брава за извршување | 15 минути |
| Живот на редицата | 6 часа |
Ако буџетот се исцрпи, продолжување се закажува една минута подоцна и скенирањето продолжува од таму каде што застанало. Второ стартување додека едно скенирање трае одговара „скенирање веќе е во тек“. Краток спој: ако три барања пропаднат без ниту една прочитана страница, скенирањето запира наместо да го изгори својот тајмаут на уште дваесет и две URL адреси — тоа е типичен случај на сајт чиј HTTP loopback е блокиран.
Препознаените вградени потписи
Дваесет и три игли, групирани во дваесет и една ознака: 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.
Клучот за отстранување дупликати е потписот, никогаш отпечаток од телото: вистински gtag или Pixel фрагмент содржи вредности специфични за страницата, што би дало по еден ред за секоја страница.
Повратната врска: наод → каталог → блокирање
Тоа е точката што го прави скенерот корисен. Класифицирањето на еден следач запишува правило во каталогот за блокирање. Клик на категоријата на еден наод прави три работи: ја запишува категоријата во редот, ја памети вашата рачна одлука и го создава соодветното правило. На крајот од секое целосно скенирање, истата операција се прави масовно за сѐ што каталогот не умее веќе да го класифицира.
Правила за претворање:
- наод од типот
cookieстанува правилоmatch_target = cookieврз името на колачето; - наод од типот
inline_scriptзапишува правило само ако изворната игла е повторно пронајдена. Без неа не се запишува никакво правило: правило изградено од ознаката „Google gtag (config)“ би било мртво засекогаш и би се совпаднало со името на наодот, што би го прикажувало како „покриен“ засекогаш; - инаку, правило од типот
hostврз доменот, одбиено ако доменот е празен.
Вашите рачни одлуки се чуваат одвоено (најмногу 500) и повторно се применуваат при секое ново набљудување, затоа што знаменцето „потврдено“ значи и „се совпаднало каталошко правило“ и затоа не може само по себе да ја носи информацијата „администраторот пресудил“. Враќањето во „некатегоризирано“ ја брише ставката: тоа е вистинско враќање назад.
Каталогот се споредува прво по најдолгиот образец, за широко правило
(google-analytics.com) да не го пребрише попрецизното правило што сте го напишале
(www.google-analytics.com).
Распоред, известувања, чување
scanner_frequency прифаќа hourly, twicedaily, daily и weekly — но
администрацијата ги нуди само повторувањата што вашата инсталација навистина ги познава.
Стандардно: weekly. Исклучувањето на скенерот ги откажува двата настана.
Две различни е-пораки, никогаш и двете истовремено:
- Некатегоризирани следачи — се праќа само за навистина нови идентификатори, со памет ограничена на 500 ставки.
- „Скенирањето не можеше да го прочита овој сајт“ — ограничено на една порака неделно и по потпис на грешката. Тоа е најтешкиот режим на откажување, затоа што скенирање што не чита ништо не дава никакви наоди, значи ниту едно известување од првиот тип.
Примач: scanner_alert_email, инаку административната адреса на сајтот.
Чување: 90 дена. Наодите непрегледани 90 дена се бришат, штом барем една страница е прочитана — не само кога скенирањето ќе заврши.
Панелот за покриеност
Тоа е најважниот дел од картичката Scanner, и тој го храни и предупредувачкиот блок во генерираните документи. Секогаш одговара на овие прашања:
- дали воопшто е стартувано скенирање?
- дали последното заврши, или беше прекинато од својот временски буџет?
- колку страници се навистина преземени (а не извадени од редицата)?
- колку не можеле да бидат преземени, и која беше првата грешка?
- дали некој прелистувач воопшто пријавил нешто, или JavaScript никогаш не бил набљудуван?
- кој е прозорецот по кој непрегледан следач исчезнува?
Скенирање што не достигнало ниту една страница се претставува како неуспех, не како чист резултат. Токму тој панел треба да го прочитате пред да објавите политика за колачиња изградена врз тие наоди.
Картичката Scanner
Три картички со бројки (откриени следачи, некатегоризирани, последно скенирање и следно
извршување), панелот за покриеност, копче „стартувај скенирање сега“, формуларот за
распоред, потоа списокот наоди: филтри по категорија, текстуално пребарување, филтер по тип
на елемент (script, inline_script, iframe, stylesheet, pixel, cookie, link,
preconnect), филтер по состојба, извоз во CSV, страничење по 25.
Класифицирање поединечно или масовно — масовниот избирач има празна прва ставка што е
оневозможена, за случајно испраќање да не стане масовно декласирање.
Поставки на скенерот
| Поставка | Стандардно | Граници |
|---|---|---|
scanner_enabled | false | булева |
scanner_frequency | weekly | hourly, twicedaily, daily, weekly |
scanner_max_urls | 25 | 1 до 500 |
scanner_timeout | 8 | 1 до 60 |
scanner_probe_mode | admins | admins, off |
scanner_alert_email | '' | адреса на е-пошта |
Да се знае:
scanner_probe_modeне се користи во оваа верзија. Кодот тоа изречно го кажува — условот за печатење на сондата повеќе не ја чита таа поставка и се потпира само наscanner_enabled. Зачувувањето наoffја складира вредноста без да ја исклучи сондата. За навистина да ја запрете сондата, исклучете го скенерот.
Ограничувања на скенерот
- Серверското скенирање не извршува никаков JavaScript. Без сондата, она што менаџерот на ознаки го внесува го нема во пописот.
- Сондата е резервирана за најавени администратори и не постои режим што ја извршува за обичен посетител: тоа би барало свое сопствено претходно известување.
- Колаче поставено преку заглавје
Set-Cookieсе открива, но не може да се блокира. - Скенирањето никогаш не излегува од доменот и е ограничено на 25 URL-адреси по правило: голем сајт никогаш не се покрива целосно.
- На хост каде што HTTP loopback е блокиран (HTTP-автентикација на staging, огнен ѕид), скенирањето не чита ништо.
- Наод непрегледан 90 дена исчезнува, а со тоа исчезнува и од политиката за колачиња.
- Скенерот зависи од WP-Cron: на сајт со
DISABLE_WP_CRONи без системски cron, закажаното скенирање не се активира.
Генераторот на правни документи
Четирите документа
| Тип | Содржина | Достапни јазици |
|---|---|---|
cookie_policy | Политика за колачиња | француски, англиски, португалски |
privacy_policy | Политика за приватност | француски, англиски, португалски |
legal_notice | Правни информации | само француски |
terms | Општи услови | само француски |
Секој генериран документ е WordPress-страница, верзионирана преку метаподатоци:
_owc_policy_type, _owc_policy_version (се зголемува при секое генерирање),
_owc_policy_hash (SHA-256 отпечаток од HTML-от), _owc_policy_generated_at,
_owc_policy_profile, _owc_policy_lang, _owc_policy_manual_edit.
По генерирањето, линкот се враќа во соодветните поставки
(link_cookie_policy, link_privacy_policy, link_legal_notice, link_terms), а
објавувањето на политика за приватност ја ажурира и страницата со политика пријавена во
WordPress.
Две брави пред објавување
Брава 1 — задолжителните полиња. Генерирањето се одбива со список на празните клучеви, наместо да се објават клаузули со дупки.
| Документ | Побарани полиња |
|---|---|
| Сите | legal_company_name, legal_company_email |
| Освен политиката за колачиња | + legal_company_address, legal_country |
| Правни информации | + legal_company_phone, legal_publication_director, legal_host_name, legal_host_address, legal_host_phone |
| Правни информации, земји FR / BE / LU | + legal_company_legal_form, legal_company_reg_number |
Брава 2 — јазикот. Генераторот одбива да објави документ напишан на јазик што јурисдикцијата не го користи. Во преглед, документот излегува со црвена предупредувачка лента; при објавување, тоа е категорично одбивање. Во картичката Policies, копчето за генерирање е скриено кога не постои шаблон за активниот тип и профил, наместо да се прикажува и постојано да откажува.
Разрешување на јазикот
| Профил | Јазик на документот |
|---|---|
quebec | француски |
lgpd | португалски |
gdpr со legal_country ∈ {FR, BE, LU} | француски |
| Сѐ останато | англиски |
Задолжителното предупредување
Сѐ додека policy_disclaimer е вклучено — а тоа е по правило — секој документ завршува
со блок што вели дека тоа е автоматски генериран шаблон, дека мора да го прегледа
квалификуван професионалец пред објавување, и што ги носи датумот на генерирање и верзијата
на приклучокот. Исклучете го само ако знаете што правите.
Табелата со следачи — правилата на искреност
Табелата објавена во политиката за колачиња доаѓа од вашата табела на скенерот, не од некоја туѓа база. Пет правила го одредуваат тоа што таа го прикажува.
- Прозорец на свежина: се објавуваат само наодите прегледани во последните 90 дена. Ако колоната за последно набљудување сѐ уште не постои затоа што некоја миграција не поминала, прозорецот се игнорира наместо да се објави „нема следачи“ на сајт што ги има — недоволното објавување е единствената насока во која правен документ никогаш не смее да потфрли.
- Предупредувачки блок на почетокот на табелата, изведен од панелот за покриеност на скенерот: скенирање никогаш не стартувано, ниту една прочитана страница, прекинато скенирање, N URL-адреси со неуспех, ниту едно набљудување со активен JavaScript, прозорец од N дена. Непотполно скенирање се објавува како такво, а не како завршен попис.
- Некласифицираните следачи не се кријат: тие имаат свој сопствен дел. Тоа се оние што никој не ги прегледал.
- Колаче забележано во заглавје
Set-Cookieноси посебен знак, со белешка што објаснува дека е поставено од серверот и дека никакво блокирање кај клиентот не може да го задржи. Затоа тоа не смее да се претстави како условено од согласноста, а клаузулата што тврди дека некласифицираните следачи се поставуваат само по согласност го носи соодветниот исклучок. - Името на добавувачот и линкот до неговата политика доаѓаат од каталогот, само за правилата што целат URL. Обрасците со имиња на колачиња се исклучени: во правен документ не се тврди кој обработува податоци без доказ.
Колачињата на сајтот и објавените траења
Делот „колачиња поставени од овој сајт“ ги наведува колачињата на самиот приклучок:
owc_consent (траење изведено од поставката за обновување), euconsent-v2 ако TCF е
вклучен, owc_geo ако е вклучено регионалното откривање, owc_gpc (траење на сесија),
owc_gpc_notice (5 минути), плус колачињата за најава и поставки на WordPress.
Табелата со роковите на чување ги влече своите бројки од вистинските поставки —
ledger_retention_days, retention_form_data_days, retention_dsar_days и рокот на
обновување на согласноста. Не се објавува ниту една декоративна вредност. Траењето на
колачето за согласност е изведено од истата пресметка како и самото колаче, што
гарантира дека поставка од 0 месеци објавува „13 месеци“, а не „никогаш“.
Откривање на типот на дејност (општи услови)
Општите услови содржат 21 дел, со префрлање продавач/давател на услуги, производи/услуги, понуда/нарачка, и посебни клаузули по тип на дејност.
legal_business_type (auto, vitrine, rental, ecommerce, services, saas,
content) е изворот на вистина. Кога има вредност auto, една хеуристика го испитува
сајтот — присуство на WooCommerce, отворена регистрација, приклучоци за претплати, страница
со цени, страници со услуги, потоа густина на клучни зборови во последните педесет објавени
содржини — но нејзината пресуда никогаш не се печати во објавен документ: таа служи само
за избор на изборните клаузули.
Цитатите од француските членови се вметнуваат само ако legal_country е FR. Белгија има
свои цитати (CDE чл. VI.45 §1, чл. VI.47, Служба за посредување за потрошувачи);
Луксембург и Квебек добиваат неутрална формулација. Да се цитира непроверен текст би било
дефектот, не лекот.
Други однесувања
- Датумот на документот се форматира во локалот на документот. Ако соодветниот преводен
пакет не е инсталиран, форматот паѓа на
дд/мм/гггг: француски документ не смее да почне со „4 September 2026“. - Откриено рачно уредување: ако зачуваната содржина повеќе не одговара на својот отпечаток, се запишува ревизија пред пребришувањето, а екранот прикажува ознака „рачните измени се заменети“, со линк кон ревизиите.
- Генераторот никогаш не деградира: објавена страница останува објавена дури и ако полето „објави“ е отштиклирано, а наслов или permalink што сте ги преименувале преживуваат повторно генерирање.
- Вметнување во менито на подножјето:
auto_footer_menu_inject, исклучено по правило. Приклучокот не го менува вашиот јавен сајт без изречно барање. Препознаени позиции кога ќе го вклучите:footer,footer-menu,footer_menu,footer-1,footer_1,secondary,legal.
Точки на проширување
// Сирово тело на шаблонот, со {{променливите}} сѐ уште на место.
add_filter( 'owc_policy_template', function ( $html, $type, $profile ) {
return $html;
}, 10, 3 );
// Променливите вметнати во шаблонот.
add_filter( 'owc_policy_vars', function ( array $vars, $type, $profile ) {
return $vars;
}, 10, 3 );
// Финалниот HTML, со заменети променливи.
add_filter( 'owc_policy_html', function ( $html, array $vars ) {
return $html;
}, 10, 2 );
Ако го обезбедите вашето сопствено тело преку owc_policy_template, бравата за јазик се
исклучува: сајт што го дава својот текст ја презема одговорноста за неговиот јазик. Тоа е
официјалниот пат за објавување правни информации што не се на француски.
Четири претходно генерирани блока се достапни како резервирани променливи:
{{__trackers_table__}}, {{__categories_list__}}, {{__retention_table__}},
{{__jurisdictional_rights__}}. Сите променливи се веќе екранирани во контекстот на
нивната употреба. Три јавни методи може да ги употреби повторно и туѓ шаблон:
OWC_Policies::build_cookie_table(), build_data_retention_table() и
render_first_party_cookies().
REST-рути
| Метод | Патека | Параметри | Пристап |
|---|---|---|---|
POST | /owc/v1/policies/generate | type (задолжителен), publish (булев, стандардно false) | manage_options |
GET | /owc/v1/policies/preview | type (задолжителен) | manage_options |
HTML-от на прегледот поминува низ wp_kses_post() пред да биде вратен.
Ограничувања на генераторот
- Тоа се шаблони, не правен совет. Дајте ги на преглед.
- Правните информации и општите услови постојат само на француски. Секоја друга јурисдикција удира во бравата за јазик, освен ако не го обезбедите вашето сопствено тело.
- Само три јазика: француски, англиски, португалски.
- Четири земји од ЕЕП имаат именуван орган; на друго место — општа формулација.
- Табелата со следачи вреди онолку колку што вреди вашето скенирање — и документот тоа го кажува.
- Класата на генераторот тежи околу 440 KB правни шаблони: се вчитува лениво, само кога некоја од трите влезни точки навистина се повика.
Регистарот на согласности
Регистарот е одговорот на членот 7.1 од ГДПР: да може да се докаже дека лицето дало согласност. Тој е вклучен по правило.
Табелата
{prefix}owc_ledger, сите датуми во UTC:
| Колона | Тип | Содржина |
|---|---|---|
id | bigint | Примарен клуч |
created_at | datetime | UTC временска ознака |
visitor_token | char(32) | Псевдонимен токен на прелистувачот, 32 хексадецимални знаци |
event | varchar(20) | accept_all, reject_all, save_preferences, withdraw, auto, gpc_opt_out |
categories | varchar(255) | Список на одобрените категории |
profile | varchar(20) | Профилот на усогласеност важечки во моментот на дејството |
source | varchar(60) | banner, preferences, footer_link, api, auto |
ip_pseudonymous | varchar(45) | Скратена IP-адреса |
ua_hash | char(64) | Осолен отпечаток на user-agent |
page_url | varchar(500) | Страницата на која се случило дејството |
prev_hash | varchar(128) | Отпечаток на претходниот ред |
row_hash | varchar(128) | Отпечаток на овој ред |
policies_hash | char(64) | Отпечаток на важечките документи |
banner_revision | varchar(40) | Отпечаток на банерот што бил навистина прикажан |
plugin_version | varchar(20) | Верзија на приклучокот во моментот на записот |
Последните три колони овозможуваат да се реконструира што видел посетителот, не само што штиклирал.
Синџирот
Секој ред е потпишан со HMAC врз канонска серијализација со префикс на должина од неговата содржина и од отпечатокот на претходниот ред. Генезата е низа од 64 нули. Записот се прави во трансакција, со брава на редот врз последната ставка: таа брава е тоа што навистина ги серијализира истовремените записи и го спречува гранењето на синџирот. Именувана MySQL брава се зема како втор бедем, во најдобар случај: ако биде одбиена, додавањето продолжува и се активира акција за да можете да го проследите тоа.
Вредностите се скратуваат пред потпишување, за потпишаната вредност да биде точно зачуваната вредност.
Искреноста околу неизменливоста
Приклучокот сам го одредува потеклото на својот клуч за потпишување:
| Потекло | Услов | Пресуда |
|---|---|---|
constant | OWC_LEDGER_KEY е дефинирана | Неизменливо |
wp-config | AUTH_KEY и AUTH_SALT се дефинирани, непразни, различни меѓу себе и без стандардната фраза | Неизменливо |
database | Инаку | Не е неизменливо |
Во третиот случај, WordPress ги чува salts во базата: секој што има пристап до базата може повторно да го потпише синџирот. Приклучокот тоа го пријавува во резултатот од проверката и прикажува административно известување што го кажува со полни зборови. Се чува неповратен отпечаток на клучот, што овозможува да се разликува ротација на salts од препишување.
Токму затоа делот Инсталација препорачува да се дефинира
OWC_LEDGER_KEY.
Проверката
Копчето „Verify the chain now“ од картичката Audit ledger — или рутата
GET /owc/v1/ledger/verify — го поминува целиот синџир во серии по 500 реда.
Се препознаваат три шеми на потпишување: сегашната канонска шема, една постара историска шема, и шема без клуч од најраните верзии. Последната дава отпечаток што секој што ја поседува базата може да го пресмета: таа никогаш не се смета за важечка, се брои одвоено и се пријавува како прекин. Отпечаток без клуч не е доказ.
Пријавени прекини: hash_mismatch, chain_break, bad_genesis, unkeyed_rows,
table_emptied, tail_truncated, head_mismatch, count_mismatch.
Резултатот носи меѓу другото: ok, total, checked, table_total, broken_at,
breaks, break_count, partial, legacy_rows, unverifiable_rows, anchor,
anchor_ok, key_source, tamper_evident, key_rotated.
Водечкото сидро
Едно сидро се чува надвор од табелата: идентификатор, отпечаток, број редови, временска ознака. Без него, бришењето на најновите редови или празнењето на табелата не би оставило никаква трага. При секое поместување на сидрото се активира акција, а кодот изречно поканува тоа да се реплицира надвор од базата — датотека, syslog, надворешна крајна точка — за глобалното повторно емитување да стане откриено.
Приклучокот одбива да пребрише постојно сидро и искрено пријавува дека сидро изведено од самата табела ги прави откриени само подоцнежните скратувања.
Чувањето
ledger_retention_days, стандардно 1825 дена (5 години), граници 0 до 3650. Вредноста
0 значи неограничено чување.
Кастрењето работи на свој дневен cron и отстранува само непрекинат префикс: никогаш дупка во средината на синџирот. Отпечатокот на последниот избришан ред се памети за остатокот да остане проверлив. Горна граница по извршување: 20 000 реда (40 серии по 500). Затоа многу голем заостаток во кастрењето се решава низ повеќе дена.
Минимизација на податоците
- IP-адреса: IPv4 со последниот октет ставен на нула (се чува /24), IPv6 скратена на /48 со останатите 80 бита на нула. Маскирањето се прави врз бинарната форма; IPv6 адреса што мапира IPv4 се третира како IPv4.
- User-agent: се чува само осолен отпечаток, никогаш низата.
page_url: се проверува наспроти хостовите на сајтот. Повикувачот е меродавен — ако ја даде вредноста, дури и празна, тоа е одговорот;Refererсе консултира само ако тој воопшто ништо не кажал, и се проверува на ист начин.- Токен на посетителот: 32 хексадецимални знаци од криптографски генератор, без врска со идентитет.
Алгоритмот
ledger_hash_algo прифаќа sha256 (стандардно) и sha3-256, пресечени со алгоритмите што
вашиот PHP навистина ги поддржува. Поставката е прикажана, но не и изменлива во
администрацијата: промената на алгоритмот би ја оневозможила проверката на сите постојни
редови. Колоните се димензионирани пошироко, но вистинскиот избор се ограничува на овие два
алгоритма.
Картичката Audit ledger
Список со страничење по 25: идентификатор, локален датум и сирова UTC временска ознака, токен на посетителот, настан, категории, профил, псевдонимизирана IP-адреса, и алката од синџирот (претходен отпечаток → тековен отпечаток, скратени при прикажување, целосната вредност во облаче).
Филтри: токен на посетителот (32 хексадецимални), настан, профил, распон на датуми — внесени во часовната зона на сајтот и споредени со UTC временските ознаки што се навистина зачувани.
Извоз во CSV и JSON. JSON носи обвивка (формат, алгоритам, потекло на клучот), за да може некој орган повторно да го провери извадокот без да го има остатокот од синџирот. Сите CSV-ќелии се неутрализирани против внесување табеларни формули.
Прегледување на регистарот преку API
GET /owc/v1/ledger прифаќа page, per_page (1 до 200, стандардно 50), visitor_token,
from и to. Последните три овозможуваат да се одговори на барање за пристап (чл. 15) без
да се поминува целиот синџир. Границите се читаат во UTC, а датум во формат
ГГГГ-ММ-ДД се проширува на целиот ден. Навистина применетите филтри се враќаат во
одговорот: филтер одбиен од проверките не смее да се чита како „еве го целиот регистар“.
Што се случува кога регистарот одбива запис
Тоа е најважното однесување во целиот приклучок. Ако регистарот е вклучен и запишувањето на редот не успее, колачето за согласност се поништува и одговорот е 503. Ништо не се складира, ниту еден следач не се ослободува.
Расудувањето е директно: согласност што не може да се докаже не смее да се тврди. Видете Решавање проблеми за постапката.
Точки на проширување
add_action( 'owc_consent_updated', function ( $categories, $event, $source ) {}, 10, 3 );
add_action( 'owc_consent_cookie_not_sent', function ( $cookie, $event ) {}, 10, 2 );
add_action( 'owc_ledger_lock_failed', function ( $event, $token ) {}, 10, 2 );
add_action( 'owc_ledger_write_failed', function ( $error, $event, $token ) {}, 10, 3 );
add_action( 'owc_ledger_anchor', function ( array $anchor ) {} );
add_action( 'owc_ledger_pruned', function ( $deleted, $days ) {}, 10, 2 );
owc_ledger_anchor е куката што треба да се користи за репликација на сидрото надвор од
базата.
Ограничувања на регистарот
- Неизменливоста е условена, и приклучокот тоа сам го кажува.
- Редовите постари од 1.2.0 носат отпечаток без клуч: тие никогаш не се потпишуваат повторно — повторното потпишување би му дозволило на напаѓач да натера фалсификувана историја да биде препотпишана — и ја спречуваат пресудата „непрекинат синџир“ сѐ додека постојат.
- Чувањето е ограничено на 20 000 реда по дневно извршување.
- Регистарот не се брише од бришачот на лични податоци на WordPress: тоа е синџир од хешови, неговото отстранување би го уништило доказот што тој постои да го носи, а содржи само псевдонимен токен и скратена IP-адреса. Порака му го објаснува тој избор на субјектот на податоците.
Порталот за правата (DSAR)
Порталот му овозможува на едно лице да ги оствари своите права од страница на вашиот сајт. Тој е вклучен по правило, но се појавува само таму каде што ќе го ставите shortcode-от.
Формуларот
[owc_dsar_form]
Атрибути:
| Атрибут | Стандардно | Улога |
|---|---|---|
types | access,rectification,erasure,portability,restrict,object,optout | Понудени типови, одделени со запирки |
title | „Остварување на моите права врз личните податоци“ | Наслов на блокот |
submit_label | „Испрати го моето барање“ | Ознака на копчето |
Ако dsar_enabled е исклучено, shortcode-от прикажува „порталот е исклучен“ и
REST-рутата одговара со 404: исклучувањето е навистина на страна на серверот.
Списокот што го барате се пресекува со списокот што серверот го прифаќа: опција одбиена од крајната точка никогаш не му се нуди на посетителот.
Осумте типа барања
access, rectification, erasure, portability, restrict, object, optout,
withdraw.
withdraw намерно е отстранет од тоа што формуларот го нуди. Повлекувањето на
согласноста за колачиња е моментално во панелот со преференции; да се спроведе преку писмена
постапка од 30 дена би го направило повлекувањето потешко од согласноста (чл. 7.3 од ГДПР).
За тој случај, линк под формуларот директно го отвора панелот со преференции.
Филтерот owc_dsar_types е единствениот извор на вистина: белата листа на крајната точка се
изведува од него.
Целосниот циклус
1. Испраќање. POST /owc/v1/dsar. Три серверски заштити, во овој редослед:
- Замка за ботови: пополнето скриено поле води до одбивање 400 со генеричка порака за неисправно испраќање — ботот не дознава ништо за причината за одбивањето. Кај прелистувачот, формуларот дури ја прикажува пораката за успех без да испрати ништо.
- Изјава (чл. 12.6): полето „потврдувам дека остварувам право врз МОИТЕ сопствени лични податоци“ мора да биде штиклирано, и тоа се проверува на серверот, не само во прелистувачот. Се запишува заедно со барањето.
- Минимално задржување од 3 секунди меѓу прикажувањето на формуларот и испраќањето, кај клиентот.
Ограничувања на брзината: 3 на час по IP-адреса, 3 дневно по целна адреса на е-пошта — адресата ја избира напаѓачот, па токму неа треба да ја ограничиме — и 30 на час за целиот сајт.
Редот се внесува со статус pending, токен од 64 знаци од кој се чува само SHA-256
отпечатокот, датум на истекување на токенот и рок за одговор. Идентификаторот не се
враќа: без набројување, без откривање на обемот. Одговорот е {ok, mail_sent, message}, а
mail_sent го одразува вистинскиот неуспех при испраќањето.
Офицерот за заштита на податоците не се известува во оваа фаза. Инаку анонимен повикувач би испратил по две е-пораки од вашиот домен за секое испраќање.
2. Е-порака за потврда. Линкот покажува кон вашата почетна страница со токенот во
отворен облик како параметар. Важност: dsar_token_ttl_days, стандардно 7 дена, граници 1
до 90. Е-пораката носи заглавје Reply-To, но никогаш препишан From — препишувањето
на пликот е она што го крши SPF. Адресата за одговор е dsar_email, инаку
legal_dpo_email; никогаш административната адреса на сајтот, која не смее да се
објавува.
3. Потврда на идентитетот. Линкот отвора страница што не извршува ништо: потврдата се прави со POST заштитен со nonce. Тоа е она што спречува скенер на линкови во е-пошта (Safe Links, URL Defense, преглед во сандаче) да потврди идентитет наместо самото лице.
Страницата е самостоен HTML-документ, сервиран надвор од темата, со noindex, nofollow и
некеширачки заглавја. Обидите се ограничени на 30 на час по IP. Одговорите се разликуваат:
404 за непознат линк, 200 за веќе потврден линк, 410 за истечен линк, 403 за истечен nonce,
500 за неуспех при запишување, 200 за потврда.
4. Што активира потврдата.
- Статусот преминува во
verified. - Рокот се пресметува повторно од моментот на потврдата. Член 12.3: рокот тече откако барањето е потполно, не од испраќање што никогаш не било потврдено.
- Токенот се гори. Неговиот отпечаток се чува намерно, за лице што повторно ќе го отвори својот линк да прочита „веќе потврдено“ наместо 404 што бара сѐ да почне одново. Еднократната употреба е загарантирана со проверката на статусот.
- Се запишуваат: датумот на потврдата, скратената IP-адреса, псевдонимниот токен на прелистувачот — единствениот можен мост меѓу регистарот на согласности и барањето — и идентификаторот на поврзаното WordPress-барање.
- Се отвора изворно WordPress-барање со веќе докажан идентитет, значи директно во вашата
редица Алатки → Извези / Избриши лични податоци. Тоа прави извршувањето да ги опфати
сите приклучоци на сајтот, не само OW Consent. Пресликување:
accessиportability→ извоз;erasure→ бришење; другите типови не отвораат изворно барање. - Одговорното лице се известува на
dsar_emailиdsar_notify_email, со резервна опција на административната адреса ако ниту една не е валидна.
5. Извршување. Панел над картичката DSAR requests ги наведува 20-те потврдени барања, подредени по рок, со бројот преостанати денови или денови задоцнување.
| Дејство | Однесување |
|---|---|
| Преземи ги податоците (JSON) | Одбивање 409 ако идентитетот никогаш не бил потврден. Датотеката се вика dsar-<id>-<ГГГГММДД>.json |
| Избриши ги податоците | Се нуди само за барање од тип erasure, и само по потврда на идентитетот. Барањето се затвора пред бришењето, инаку слободниот текст на тековното барање би го преживеал своето сопствено извршување |
| +2 месеци | Продолжување по чл. 12.3, само еднаш, со образложение од најмногу 500 знаци. Рокот се поместува за 60 дена, потсетниците се наоружуваат одново, и субјектот на податоците добива е-порака со новиот рок и образложението |
| Затвори | Статус resolved или rejected, со задолжителна белешка. Не може да се препише веќе затворено барање, и не може да се запише „исполнето“ врз идентитет што никогаш не бил потврден |
| Испрати го линкот повторно | Издава нов токен, што го поништува претходниот |
Пет статуси: pending, verified, resolved, rejected, expired.
Екранот никогаш не го вчитува токенот ниту неговиот отпечаток, и не го прикажува името на подносителот.
6. Надзор над рокот. На дневниот cron: до 200 потврдени барања се поминуваат по рок, потсетник седум дена однапред, потсетник при пречекорување, и едното и другото само еднаш. Административна лента ги пријавува барањата надвор од рок и оние на помалку од седум дена.
7. Чистење. Испраќањата што никогаш не биле потврдени се бришат по истекот на својот
токен, а затворените барања се бришат по retention_dsar_days. Мерењето тргнува од
затворањето, не од испраќањето.
Пакетот за преносливост
Извозот произведува документ во формат ow-consent/dsar-export, со временска ознака, сајтот,
субјектот, барањето и групите податоци. Тој ги повикува сите регистрирани извозници на
сајтот, страничи до 50 страници по извозник и запира на 20 секунди. Бришењето прави исто
кај бришачите, со истите граници.
Филтер: owc_dsar_export_bundle( $bundle, $email, $id ).
Затоа она што извозот и бришењето го опфаќаат зависи од приклучоците инсталирани на вашиот сајт: приклучок што не регистрира ниту една од тие куки мора да се обработи рачно.
Интеграција со изворните алатки на WordPress
- Извозник регистриран под клучот
ow-consent, со две групи: барањата за остварување на правата и регистарот на согласности. - Бришач:
- испраќањата што никогаш не биле потврдени се бришат — немаат никаква доказна вредност, само лични податоци;
- на затворените барања им се брише слободниот текст и името, а минималниот ред (датум,
тип, статус) се чува како доказ (чл. 5.2) до
retention_dsar_days; - барање што е сѐ уште отворено се задржува, со порака што објаснува дека мора да се одговори пред да се избрише;
- регистарот на согласности не се брише, од причината објаснета погоре.
- Приклучокот го храни и нацртот на политиката за приватност на WordPress.
Информативната белешка под формуларот
Под формуларот, расклоплив блок ја носи белешката од членот 13: идентитет и адреса на
контролорот, контакт за приватност, цел и правен основ (чл. 6.1.в), собрани податоци,
примачи и рок на чување, рок за одговор и можност за продолжување, надлежен надзорен орган,
линк до политиката. Филтер: owc_dsar_form_notice( $html, $context ).
Прикажаниот орган доаѓа од изведувањето опишано во Единаесетте профили на усогласеност, и се задржува само ако почнува со голема буква: читањето на сировата поставка би го именувало францускиот орган на јужноафрикански, индиски, австралиски или калифорниски сајт.
Без JavaScript, копчето за испраќање е скриено и порака ја нуди адресата за контакт — за прелистувачот никогаш да не направи изворно испраќање што би ја ставило адресата на подносителот во URL-то, а со тоа и во дневниците на сите поминати сервери и прокси-сервери.
DSAR поставки
| Поставка | Стандардно | Граници |
|---|---|---|
dsar_enabled | true | булева |
dsar_email | '' | јавен контакт и примач на известувањата |
dsar_notify_email | '' | дополнителен примач |
dsar_response_days | 30 | 1 до 30 — никогаш повеќе од еден месец |
dsar_token_ttl_days | 7 | 1 до 90 |
retention_dsar_days | 1095 (3 години) | 1 до 3650 |
Точки на проширување
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 );
Ограничувања на порталот
- Идентитетот почива на еден единствен фактор: размената преку е-пошта. Секој дополнителен доказ по чл. 12.6 се внесува рачно во белешките на барањето.
- Неуспешно испраќање на е-пошта го блокира циклусот: одговорот изложува
mail_sent: falseи формуларот прикажува порака што упатува кон адресата за контакт, но барањето остануваpendingи законскиот рок не почнува да тече. - Потсетниците за роковите и чистењето зависат од WP-Cron.
- Табелата со барањата секогаш се брише при деинсталација на приклучокот, без оглед на вашата поставка. Извезете пред да го избришете.
CCPA opt-out „Do Not Sell or Share“
Под американските профили, законот бара именувана, видлива контрола што навистина го извршува opt-out.
Два начина да се постави
Shortcode, каде што сакате:
[owc_dnsmpi]
[owc_dnsmpi label="Не ги продавајте и не ги споделувајте моите лични податоци" class="moj-link"]
| Атрибут | Стандардно |
|---|---|
label | „Do Not Sell or Share My Personal Information“ |
class | owc-dnsmpi |
Автоматско вметнување во подножјето: поставка ccpa_inject_footer, вклучена по
правило, се исцртува на wp_footer со приоритет 20.
Што прави еден клик
Еден клик го извршува opt-out. Не отвора панел. Рантајмот презема свеж nonce, потоа
праќа reject_all со извор footer_link и сите изборни категории на false. Линкот
преминува во aria-busy="true", а зона со role="status" ја прикажува состојбата:
„се запишува“, потоа „вашиот opt-out е запишан на овој прелистувач“, или пораката за грешка.
Кодот ја наведува причината: според прописите за спроведување на CCPA (§7026(a)(1)), линк што само отвора панел не е механизам во согласност со законот.
Резервно решение без fetch и Promise (стар WebView, вграден прелистувач): кликот го
отвора панелот со преференции со рекламните категории веќе поставени на off.
Ограничувањето од кешот
Сервираниот HTML е ист за сите. Затоа линкот се исцртува видлив ако конфигурираниот
профил на сајтот е ccpa или us_generic; инаку се исцртува скриен и се открива кај
клиентот за посетителите чија јурисдикција тоа го бара, според колачето за регионално
откривање.
Ако регионалното откривање е исклучено и вашиот конфигуриран профил не е американски, блокот воопшто не се печати: без мртов HTML.
Никаков податок за посетителот не патува во JavaScript-конфигурацијата на овој модул — само списоците профили, никогаш разрешената булева вредност.
Ресурсите на овој модул се печатат во <head>, не во подножјето, за одбивањето во Consent
Mode да стигне до gtag пред да се активира менаџерот на ознаки. JavaScript-от е само во
ES5.
Ограничувања
- Контролата со еден клик бара
fetchиPromise. - Линкот е задолжителен само под профилите
ccpaиus_generic; под кој било друг профил, тој ниту се прикажува ниту се открива. - Откривањето кај клиентот зависи од колачето за регионално откривање, значи од JavaScript.
Google Consent Mode v2
Модулот е вклучен по правило (gcm_enabled).
Седумте сигнали
Се емитуваат седумте сигнали на Consent Mode v2: ad_storage, ad_user_data,
ad_personalization, analytics_storage, functionality_storage,
personalization_storage и security_storage. Шесте категории на приклучокот се поврзани
со нив од единствен извор на вистина, што гарантира дека банерот, блокирањето и
bootstrap-от не можат да се разидат. Табелата е дадена во
Категориите колачиња.
Стандардните вредности, пред каква било согласност
Повикот default се печати како статички HTML, а update се пресметува во
прелистувачот: тоа е она што ја одржува страницата кеширачка.
| Сигнал | Opt-in режим | Opt-out режим |
|---|---|---|
ad_storage | denied | granted |
analytics_storage | denied | granted |
ad_user_data | denied | granted |
ad_personalization | denied | granted |
personalization_storage | denied | granted |
functionality_storage | denied ако сајтот ја изложува категоријата functional, инаку granted | granted |
security_storage | секогаш granted | granted |
Двата комплета се печатат во истата страница. Рантајмот избира кој да го примени според колачето за регионално откривање. Без тоа, кеширана страница би ја заковала јурисдикцијата на еден американски посетител врз европски посетител.
Двете поврзани поставки
| Поставка | Стандардно | Ефект |
|---|---|---|
gcm_ads_data_redaction | true | Ги прикрива рекламните идентификатори сѐ додека ad_storage е одбиен |
gcm_url_passthrough | true | Ги пренесува gclid / dclid низ URL-адресите сѐ додека колачињата се одбиени |
Да се знае
security_storage никогаш не се допира со ажурирање: останува одобрен, како што предвидува
спецификацијата. Контролната табла прикажува картичка што покажува дали Consent Mode е
активен.
IAB TCF v2.2
Модулот TCF е исклучен по правило, и бара идентификатор што приклучокот не може да го обезбеди. Прочитајте го делот со ограничувањата пред да го вклучите.
Вклучување
| Поставка | Стандардно | Граници |
|---|---|---|
tcf_enabled | false | булева |
tcf_cmp_id | 0 | 0 до 4095 |
tcf_publisher_country | FR | ISO код од 2 букви |
tcf_publisher_purposes_li | [] | список цели |
tcf_special_features | [] | список специјални функции |
Горната граница од 4095 не е произволна: полето CmpId зафаќа 12 бита во TCF-низата.
Три случаи во кои модулот одбива да емитува што било
- Нема CMP ID (
tcf_cmp_id < 1): нема__tcfapi, нема TC-низа, нема колачеeuconsent-v2, нема REST-рута. Административно известување го објаснува тоа. CMP ID мора да ви го додели IAB Europe; приклучокот не обезбедува таков. Емитувањето низа со CmpId 0 би било полошо од да не се емитува ништо. - CMP ID поголем од 4095: истото одбивање, со посебно известување. Вредност скратена на 12 бита би означувала друг CMP — тоа е присвојување идентитет.
- Нема кеширана Global Vendor List: стубот се печати, но API-то одговара
cmpStatus: 'error'со празна низа, наместо да измисли број на верзија на списокот.
Дијагностика се запишува во опција (disabled, missing_cmp_id, no_gvl, active), и тоа
само во административен контекст или во cron, никогаш на јавна страница.
Global Vendor List
- Извор:
https://vendor-list.consensu.org/v3/vendor-list.json. - Никогаш не се презема при исцртувањето на страница. За тоа се грижи дневен cron, со прво извршување пет минути по вклучувањето; во администрацијата со ладен кеш, се закажува еднократно преземање.
- Барање: најмногу 5 секунди тајмаут, 2 пренасочувања, одговор ограничен на 4 MB. Тело што ја достигнува горната граница се смета за скратено и се одбива.
- По добавувач се чуваат само корисните полиња; купчињата се празнат. Ако серијализацијата сепак остане преголема, се применуваат два степена на скратување: прво ознаките и URL-адресите, потоа сведување само на целите.
- Чување: една недела во transient, со stale-if-error — при неуспех се задржува последната валидна копија.
- Јавна рута:
GET /owc/v1/tcf/gvl, ограничена на 10 барања на час. Таа ја сервира кешираната копија соETagиCache-Control: public, max-age=86400, и ги обработува условните барања. Ако нема ништо во кешот, одговара со 503 иRetry-After: 300— никогаш со синтетички список. Оваа рута никогаш не активира излезно барање.
Каде се пресметува TC-низата
Во прелистувачот, не во PHP. Целосно статички стуб се печати во <head> со приоритет
0: локатор iframe, имплементација на window.__tcfapi, релеј postMessage, и енкодер на
Core-сегментот во JavaScript. Објавената конфигурација не содржи никаков податок за
посетителот — тоа е она што овозможува да остане спојлива со кеш на страници.
Филтер: owc_tcf_stub_config.
Постои и PHP-огледало на енкодерот, но тоа нема ниту еден повикувач во приклучокот: тоа е резервирано за интеграции и тестови, со предупредување никогаш да не се печати во кеширачки HTML.
Што се кодира
Само сегментот Core, во base64url без полнење. Делот со добавувачите се кодира или како битово поле или како распони: двете големини се мерат и помалата победува. Индексот на добавувачи што се пренесува до прелистувачот користи компактен домашен формат, со тврда горна граница по која индексот се празни (тогаш согласностите по добавувач се губат, а верзијата на списокот се задржува).
Пресликување категории → TCF-цели
| Категорија | Цели |
|---|---|
necessary | ниедна — надвор од опфатот на TCF, што гарантира дека „Одбиј сѐ“ не може да произведе согласност за целта 1 |
functional | 1 |
analytics | 1, 8, 9, 10 |
marketing | 1, 2, 3, 4, 7 |
preferences | 1, 5, 6, 11 |
social | 1 |
Филтер: owc_tcf_purpose_map.
Легитимен интерес на издавачот: се задржуваат само целите 2, 7, 8, 9, 10 и 11,
затоа што TCF v2.2 го забранува легитимниот интерес за целите 1, 3, 4, 5 и 6. Секоја друга
вредност на tcf_publisher_purposes_li тивко се отфрла.
Добавувач добива согласност штом е одобрена барем една од целите што ги пријавува под основот „согласност“.
Специјалните функции
Поддржани се само две ставки: 1 — употреба на прецизни податоци за геолокација
и 2 — активно скенирање на карактеристиките на уредот. Пријавете ги оние што ги
користите во tcf_special_features; списокот се сведува на овој каталог.
Тие се појавуваат како вистински полиња за штиклирање во панелот со преференции. „Прифати сѐ“ не ги штиклира: тие бараат свој сопствен изречен opt-in. „Одбиј сѐ“ и „Do Not Sell“ ги отштиклираат. Тие живеат во самата TC-низа и се рехидрираат при повторно отворање на панелот од TCF API-то.
TCF-слојот во панелот
Тој се исцртува само ако модулот е активен, односно tcf_enabled и употреблив CMP ID.
Два блока:
- Цели: само оние достижни преку незадолжителна категорија и именувани во каталогот на списокот добавувачи. Прекинувач што сам би се враќал назад би бил полош од никаков прекинувач. Префрлањето на една цел запишува во сите категории што ја пријавуваат, потоа приказот повторно се изведува.
- Пријавените специјални функции.
Ништо не се кодира во низата што претходно не било прикажано.
JavaScript API-то
window.__tcfapi( command, version, callback, parameter );
// команди: ping, getTCData, getInAppTCData,
// addEventListener, removeEventListener, getVendorList
window.__owcTcfUpdateState( tcData ); // ги заменува податоците и ги известува слушателите
window.__owcTcfRefresh(); // пресметува одново и емитува 'useractioncomplete'
window.__owcTcfUiShown(); window.__owcTcfUiHidden();
window.__owcTcfSetSpecialFeatures( [ 1, 2 ] );
Прифатени верзии: отсутна, null, 2, '2', 2.2, '2.2'. Секоја друга вредност дава
callback(null, false).
gdprApplies
Се одлучува кај клиентот. Ако регионалното откривање е исклучено, вредноста е true.
Инаку, земјата на посетителот се споредува со списокот од 31 код каде што ГДПР се применува
во смисла на TCF (27 земји од ЕУ, плус IS, LI, NO, GB и CH). Паѓа затворено: непозната
земја дава true.
Колачето euconsent-v2
Се запишува само кај клиентот, и само кога модулот е подготвен и посетителот
дејствувал. Инаку колачето се брише. Неговото траење е траењето на согласноста, ограничено
на 13 месеци (препорака на IAB / CNIL). SameSite=Lax, Secure на HTTPS.
Ограничувања на модулот TCF — задолжително прочитајте
- Ова не е CMP регистриран кај IAB Europe. Бара ваш сопствен CMP ID, а дури и со него, политиката на TCF бара регистриран CMP да понуди избор на ниво на цел и на ниво на добавувач. Тука, прекинувачите на целите ги следат категориите и не постои никаков избор на ниво на добавувач: добавувачите имаат основа да го одбијат овој сигнал. Административниот екран тоа го кажува и зборува за „CMP-компатибилен режим (неофицијален)“, прифатен од повеќето SSP при развој, но одбиен во вистинска продукција во ЕЕП. Ако рекламниот приход преку TCF ви е важен, користете сертифициран CMP.
- Само сегментот Core: нема сегменти
disclosedVendors,allowedVendorsнитуpublisherTC. - Не се емитува ниту едно ограничување на издавачот: соодветниот бројач е секогаш 0 и објектот со ограничувања е празен.
purposeOneTreatmentиuseNonStandardTextsсе секогашfalse,isServiceSpecificе секогашtrue— нема глобален домет — а екранот за согласност е секогаш 0.getVendorListго игнорира параметарот за верзија и секогаш го враќа кешираниот список.- Согласностите на издавачот ги препишуваат општите цели: нема приспособена цел.
- Само две специјални функции.
- Модулот бара функционален cron и излезен HTTPS. Без кеширан список, API-то одговара
cmpStatus: 'error', а јавната рута враќа 503.
Global Privacy Control
GPC е сигнал што го праќа прелистувачот — заглавјето Sec-GPC: 1 и својството
navigator.globalPrivacyControl. Приклучокот го почитува по правило (gpc_honor), но
неговата обработка зависи од правниот режим, и тоа е важната точка.
Под американските профили: обврзувачки
Сигналот се третира како обврзувачки универзален opt-out под профилите ccpa и
us_generic. Австралија е изречно исклучена: opt-out режим, но што не го признава GPC.
Серверскиот запис се случува само по целосен синџир проверки, во овој редослед:
gpc_honorе вклучено;- сигналот е присутен — заглавјето
Sec-GPC, со резерва наX-Sec-GPCзатоа што некои прокси-сервери и CDN го преименуваат заглавјето; важи само точната вредност1; - ефективниот профил е
ccpaилиus_generic— инаку ништо не се запишува; - станува збор за обично прегледување страница: без администрација, без cron, без AJAX,
без REST, без XML-RPC, без WP-CLI, и методот е
GET; - заглавјата сѐ уште не се испратени — колаче што не може да се постави е одлука што би се запишувала одново при секое барање;
- маркерот на сесијата
owc_gpcго нема: еднаш по сесија на прелистување; - посетителот не личи на бот (празен user-agent, или таков што содржи
bot,crawl,spider,slurp,monitor,uptime,pingdom,headless,preview,curl/,wget,python-,java/,go-http,okhttp,httpclient,libwww,facebookexternalhit); - веќе зачуваниот избор не го задоволува веќе сигналот — инаку само се обележува прелистувачот;
- се почитува заедничкото ограничување на брзината: 30 на час по IP;
- прелистувачот се обележува пред записот, за неуспехот да не стане јамка на повторни обиди.
Настанот се запишува како gpc_opt_out со извор auto. URL-то на страницата се
реконструира од URL-то на сајтот и бараната патека — никогаш од заглавјето Host,
никогаш од Referer.
Опфат: сите изборни категории одат на false; задолжителните категории остануваат
одобрени. Тоа е широко читање на поимот продажба или споделување.
Транспарентност: ако GPC пребрише изречно запишан избор, петминутно колаче активира кај клиентот известување во дното на екранот што го објаснува тоа, со копче „управувај со моите преференции“ што го отвора панелот, и копче за затворање.
Под ГДПР и сродните профили: само наговестување
Надвор од американските opt-out режими, сигналот се третира како наговестување, никогаш како согласност:
- атрибутот
data-owc-gpc="1"се поставува на<html>; - Consent Mode ги префрла
ad_storage,analytics_storage,ad_user_data,ad_personalizationиpersonalization_storageнаdenied; - сите изборни категории се ставаат на
falseсамо во меморија; givenостанува неточно, банерот останува прикажан, и ништо не се запишува.
Внатрешно знаменце го спречува рантајмот да му објави на посетителот дека е „веќе на opt-out“ иако ниту колачето ниту регистарот тоа не го тврдат. Образложението е напишано во кодот: GPC не е правно признаен сигнал под ГДПР и ePrivacy, швајцарскиот nLPD, LGPD, POPIA, PIPL, DPDP ниту Законот 25.
Двете колачиња што ги поставува овој модул
| Колаче | Траење | Улога |
|---|---|---|
owc_gpc | сесија | Обележува дека сигналот веќе е обработен за овој прелистувач |
owc_gpc_notice | 300 s | Го активира известувањето „GPC го замени вашиот избор“ |
Двете се на path=/, SameSite=Lax, Secure на HTTPS, и читливи од скрипта.
Точка на проширување
add_action( 'owc_gpc_honored', function ( array $categories ) {} );
Регионалното откривање
Регионалното откривање му го применува на секој посетител профилот на неговата јурисдикција наместо конфигурираниот профил на сајтот. Тоа е исклучено по правило.
| Поставка | Стандардно |
|---|---|
geo_enabled | false |
geo_default_profile | gdpr |
geo_mmdb_enabled | false |
Каскадата на откривање
Првиот успех победува:
- Cloudflare (
CF-IPCountry) — само ако сајтот изјавил дека е зад Cloudflare; - AWS CloudFront (
CloudFront-Viewer-Country) — истиот услов; GEOIP_COUNTRY_CODE, променливата запишана од самиот сервер (mod_geoip, ngx_http_geoip), значи неможна за фалсификување од клиентот; потоа, ако е пријавен прокси, варијантите во HTTP-заглавје;- Локална база на MaxMind, ако
geo_mmdb_enabledе вклучено; - Ништо.
Без изречна изјава во wp-config.php, ниту едно HTTP-заглавје за земја не се смета за
веродостојно: клиентот може да ги фалсификува. Видете Инсталација за
константите.
Кодот на земјата се проверува наспроти белата листа на официјално доделените ISO-3166-1
alpha-2 кодови (околу 249 кода тврдо набројани). Корисничките или резервираните кодови —
XX, ZZ, T1 на излезите од Tor — се одбиваат.
Паѓањето затворено
Без откриена земја, приклучокот го чита geo_default_profile, но секој opt-out профил го
деградира кон gdpr. Затоа geo_default_profile поставен на ccpa, us_generic или
au се игнорира за неоткриените посетители — а административниот екран во тој избирач нуди
само opt-in профили, наместо да понуди избор што тивко ќе биде игнориран.
Причината е директна: без таа заштитна ограда, сајт конфигуриран на американски англиски би го ставил секој посетител од ЕЕП во opt-out режим, со следачи означени како „одобрени“ без никаква согласност.
Нема резерва на локалот на сајтот: јазикот на еден сајт не кажува ништо за местото на неговиот посетител.
Колачето owc_geo
- Траење 24 часа,
path=/,SameSite=Lax,Secureна HTTPS, читливо од скрипта — на предниот bootstrap му треба. - Содржина: земјата, профилот, временска ознака и код за автентикација. Никогаш IP-адреса.
- При читање: ограничена големина, земја проверена наспроти ISO-списокот, временска ознака во прозорецот, код проверен во константно време. Профилот секогаш се пресметува повторно на серверот врз основа на земјата: посетителот не може да си го избере својот правен режим.
- Се кешира само вистинско откривање. Резервата „паднато затворено“ никогаш не се памети.
- Се запишува само при барање кон предниот дел, и само ако откривањето е вклучено.
Пресликувањето земја → профил
| Земја | Профил |
|---|---|
| 30-те земји од ЕЕП | gdpr |
| GB, JE, GG, IM | uk_pecr |
| CH | ch_nfadp |
| BR | lgpd |
| ZA | popia |
| CN, HK | pipl |
| IN | dpdp |
| AU, NZ | au |
| CA | quebec |
| US | ccpa |
| Сѐ останато | Резервата, деградирана во opt-in |
Хонг Конг всушност потпаѓа под својата сопствена локална уредба; тој се третира како PIPL по
строгост. Нов Зеланд се третира како Австралија. Цела Канада добива quebec — победува
најстрогиот режим. САД добиваат ccpa, што служи како профил и за другите држави.
Ограничувањето од кешот — што откривањето не прави
Геолоцираниот профил не го менува исцртаниот HTML. Препишувањето на профилот се
применува само врз двете REST-рути за посетители, /owc/v1/consent и /owc/v1/state.
Исцртувањето на страници, административните рути, wp-admin, cron и WP-CLI го задржуваат
конфигурираниот профил. Секој одговор што го користел препишувањето е означен како
некеширачки.
Предниот рантајм е тој што го избира режимот, кај клиентот, од колачето. Прифатена последица: режимот применет врз еден посетител зависи од JavaScript, а посетител чија прва страница доаѓа од кешот се третира под конфигурираниот профил на сајтот сѐ додека колачето не постои.
Вградениот читач на MaxMind
Приклучокот го вградува својот сопствен MMDB-читач, напишан во чист PHP, без Composer зависности — приклучок објавен на WordPress.org не може да го вгради официјалниот пакет.
- Само читање, само земја. Без град, без ASN.
- Ограничен влез/излез: читање во мали блокови, никогаш вчитување во меморија на датотека од повеќе мегабајти.
- Никогаш не фрла исклучок: датотека што недостига, е нечитлива, скратена, оштетена или
злонамерна дава
null, а откривањето паѓа на својот строг профил. - Внатрешни заштитни огради врз длабочината на обиколување, буџетот за декодирање и големината на товарот. Метаподатоците се кешираат во transient чиј клуч ги вклучува големината и датумот на датотеката: заменувањето на вашето месечно преземање сам по себе го поништува кешот.
registered_countryиrepresented_countryнамерно се игнорираат. Тоа е документираната форма на анонимните прокси, VPN и сателитски распони, каде што земјата на регистрација го означува местото каде што давателот го регистрирал блокот, а не посетителот. Нивното користење би ставило посетител од ЕЕП зад американски VPN во opt-out режим.- Ако друг приклучок веќе вчитува GeoIP2 читач, тој се користи како резерва по домашниот читач.
Каде да ја ставите датотеката: wp-content/uploads/ow-geoip/GeoLite2-Country.mmdb.
Патеката е филтрирачка преку owc_geo_mmdb_path, со проверка против обиколување на
директориуми.
Важно ограничување: приклучокот не ја презема базата и не нуди никаков екран за качување. Датотеката морате да ја земете од MaxMind, сами да ја поставите и сами да ја ажурирате. За возврат, ништо не се праќа до MaxMind: пребарувањето е целосно локално, IP-адресата служи само како точка за пребарување и потоа изречно се уништува — никогаш не се запишува во дневник, никогаш не се складира, никогаш не се впишува во колачето.
Ограничувања на регионалното откривање
- Исклучено по правило, а варијантата со MaxMind бара датотека што вие ја обезбедувате.
- Заглавјата за земја се игнорираат сѐ додека не го пријавите вашиот прокси.
- Нема поделба по држава во САД, ниту по покраина во Канада.
- Режимот на посетителот зависи од JavaScript и од колачето со траење од 24 часа.
- Профилот
us_genericникогаш не се доделува автоматски.
Интеграцијата со OW Forms
Точен опфат: оваа интеграција го цели сестринскиот приклучок OW Forms, и ништо друго. Не постои никаква интеграција со Contact Form 7, Gravity Forms или WPForms.
Поставка: forms_integration_enabled, вклучена по правило, но интеграцијата не прави
ништо ако OW Forms не е активен.
Што носи таа
1. Врската согласност ↔ испраќање. При секое зачувано испраќање, се запишува ред во табела посветена на OW Consent — шемата на OW Forms никогаш не се допира — што содржи:
- псевдонимниот токен на посетителот (32 хексадецимални, никогаш адресата на е-пошта);
- идентификаторот на најновата ставка во регистарот за тој токен;
- одобрените категории и важечкиот профил на усогласеност;
- целосниот отпечаток на документите објавени во тој миг;
- временската ознака на согласноста;
- состојбата на ГДПР-полето во формуларот и точната ознака што ја носело.
Последната точка е најкорисна во практика: можете да докажете не само дека полето било штиклирано, туку и што пишувало покрај него.
2. Каскадата на бришење. Потврдено барање за бришење го предава бришењето на рутината на OW Forms — која ги брише и качените датотеки — потоа ги брише редовите со врски. Интеграцијата открива дали OW Forms веќе закачил свој сопствен слушател на истата акција, во кој случај таа само ги кастри своите врски.
3. Алатките за приватност на WordPress. Регистрирани се извозник и бришач, така што Алатки → Извези / Избриши лични податоци ги опфаќа испраќањата на OW Forms — а и порталот за правата на OW Consent, бидејќи тој ги поминува истите куки. Извозот ги презема вистинските ознаки на полињата и ги додава полињата за согласност. Секоја извезена вредност е неутрализирана против внесување табеларни формули и скратена.
4. Чувањето. На дневниот cron, врските постари од
retention_form_data_days (стандардно 1095 дена, граници 1 до 3650) се бришат во серии
по 500, со поминување низ сирачињата. Се допираат само редовите на OW Consent:
чувањето на самите испраќања му припаѓа на OW Forms.
Ограничувања
- Ниту еден настан на испраќање не се запишува во синџирестиот регистар. Редот со врската упатува на постојна ставка, но не создава нова — синџирот не смее да се запишува однадвор.
- Не може да се поврзе испраќање ако OW Forms е конфигуриран да не ги складира испраќањата: нема ред на кој би се закачило.
- Нема ретроактивно опоравување: врзувањето почнува од првото испраќање по ажурирањето.
- Спарувањето се прави врз осолениот отпечаток на адресата пресметан од OW Forms, со резерва на отворената адреса што OW Forms исто така ја чува. Тоа не е шема со нулево откривање: адресата останува во отворен облик кај OW Forms, затоа што мора да може да се одговори на лицето.
- Интеграцијата никогаш не го менува приклучокот OW Forms, неговите табели ниту неговите опции.
- Ако OW Forms е активен, но е премногу стар за да ја изложи својата рутина за бришење, бришачот изречно одговара дека испраќањата не биле допрени.
Пловечкото копче
Мало трајно копче овозможува панелот со преференции да се отвори повторно во секое време. Тоа е барањето на членот 7(3) — повлекувањето мора да остане исто толку едноставно колку и согласноста — и на одлуката на CNIL 2020-091, која бара механизам достапен од секоја страница.
Услови за постоење
Тоа ги бара двете поставки: floating_button_enabled и banner_enabled. Панелот
со преференции и JavaScript API-то живеат во рантајмот на банерот; без него, копчето би
било контрола што не прави ништо.
Тоа излегува и во администрација, на канал, на robots.txt, и ако wp_head не бил
активиран.
Опции
| Поставка | Вредности | Стандардно |
|---|---|---|
floating_button_enabled | булева | true |
floating_button_position | bottom-left, bottom-right, top-left, top-right | bottom-left |
floating_button_style | pill, icon | pill |
floating_button_label | слободен текст | Cookies |
Копчето нема своја сопствена поставка за тема: го презема banner_style, за двете
површини да ја следат истата палета.
Однесување и пристапност
Тоа е вистинско <button>, значи достапно со тастатура. Носи aria-haspopup="dialog" и
aria-label што е преводлив, но не и приспособлив („Manage my cookie choices“): се
поставува само видливата ознака. Во режим icon, ознаката е визуелно скриена, но читачите
на екран сѐ уште ја читаат.
Се исцртува со атрибутот hidden; JavaScript одлучува дали да го прикаже. Тоа е
видливо во сите состојби освен кога банерот или панелот се веќе на екранот — вклучувајќи
и веднаш по направен избор на тековната страница.
Кликот го отвора панелот со преференции. Ако API-то на банерот не постои, копчето паѓа на
фрагментот #owc-preferences, повторно активирајќи го настанот рачно ако тоа е веќе
тековниот фрагмент.
z-index 99990, скриено при печатење, поддршка за режимот со засилен контраст и за
prefers-reduced-motion, поместување под административната лента во горна позиција.
Shortcodes
Приклучокот пријавува два shortcode-а, и само два. Ниту банерот ниту пловечкото копче немаат: тие се прикажуваат насекаде или никаде, водени од своите поставки.
[owc_dsar_form] — порталот за правата
[owc_dsar_form]
[owc_dsar_form types="access,erasure,portability" title="Моите права" submit_label="Испрати"]
| Атрибут | Стандардно |
|---|---|
types | access,rectification,erasure,portability,restrict,object,optout |
title | „Остварување на моите права врз личните податоци“ |
submit_label | „Испрати го моето барање“ |
Побараните типови се пресекуваат со оние што серверот ги прифаќа. Типот withdraw никогаш
не го нуди формуларот; видете Порталот за правата.
[owc_dnsmpi] — CCPA opt-out
[owc_dnsmpi]
[owc_dnsmpi label="Не ги продавајте и не ги споделувајте моите лични податоци" class="link-podnozje"]
| Атрибут | Стандардно |
|---|---|
label | „Do Not Sell or Share My Personal Information“ |
class | owc-dnsmpi |
Еден клик го извршува opt-out; видете CCPA opt-out. Ако го оставите
ccpa_inject_footer вклучено, линкот е веќе вметнат во подножјето и овој shortcode е
корисен само за да го поставите на друго место.
Повторно отворање на панелот од мени или линк
За тоа нема shortcode, затоа што атрибут за класа е доволен:
<a href="#owc-preferences" class="owc-open-preferences">Управувај со моите колачиња</a>
<button type="button" data-owc-open>Моите преференции</button>
<a href="#owc-dnsmpi" data-owc-dnsmpi="1">Не ги продавајте моите податоци</a>
Тоа е препорачаниот начин да додадете ставка „Колачиња“ во менито на вашето подножје.
REST API
Сите рути живеат под namespace-от owc/v1, на вообичаениот REST-корен
(https://primer.com/wp-json/owc/v1/…). Тринаесет рути вкупно: дванаесет регистрирани од
REST-модулот, плус рутата на списокот добавувачи регистрирана од модулот TCF.
Јавни рути
Без автентикација. Нивната безбедност почива на проверката на потеклото, на токен сопствен на приклучокот и на ограничувањата на брзината опишани подолу.
| Метод | Патека | Параметри | Улога |
|---|---|---|---|
GET | /nonce | action (стандардно wp_rest) | Враќа свеж токен. Одговор: {nonce, action, header: "X-OWC-Nonce", ttl: 43200}, со no-store и Vary: Cookie |
POST | /consent | event (стандардно save_preferences), source (стандардно banner), categories (задолжително), page_url (стандардно ''), cookie_unreadable (булев, стандардно false) | Запишува избор, го поставува колачето и го запишува редот во регистарот |
GET | /state | — | Состојбата само на повикувачот: {given, categories, profile, at}. Никогаш токенот на посетителот, никогаш IP-адресата, никогаш URL-то на страницата. no-store + Vary: Cookie |
GET | /tcf/gvl | — | Ја сервира кешираната Global Vendor List. ETag, Cache-Control: public, max-age=86400, 304 при условно барање, 503 + Retry-After: 300 ако нема ништо во кешот |
POST | /dsar | type (задолжително), email (задолжително, формат на е-пошта), message (стандардно '', најмногу 2000 знаци) | Поднесува барање за остварување на правата. Одговор {ok, mail_sent, message} — никогаш идентификаторот |
Прифатени вредности:
event:accept_all,reject_all,save_preferences,withdraw,auto,gpc_opt_outsource:banner,preferences,footer_link,api,autotype(DSAR):access,rectification,erasure,portability,restrict,object,optout,withdrawcategories: објект, најмногу 32 ставки, само скаларни вредностиaction(nonce): самоwp_rest
Административни рути
Сите бараат овластување manage_options.
| Метод | Патека | Параметри | Улога |
|---|---|---|---|
GET | /ledger | page (≥1, стандардно 1), per_page (1–200, стандардно 50), visitor_token (32 hex), from, to | Го чита регистарот. Навистина применетите филтри се враќаат во одговорот |
GET | /ledger/verify | — | Го проверува синџирот од крај до крај |
GET | /settings | — | Ефективните поставки |
POST | /settings | слободно JSON тело | Ги запишува поставките. Одговор {ok, updated, rejected, settings} |
POST | /scanner/run | — | Стартува скенирање |
POST | /scanner/ingest | JSON тело {page, findings[]} | Прием на набљудувањата на сондата |
GET | /scanner/findings | page, per_page (1–200, стандардно 50), filter (slug на категорија или unknown) | Ги наведува наодите |
POST | /policies/generate | type (задолжително), publish (булев, стандардно false) | Генерира документ |
GET | /policies/preview | type (задолжително) | Прегледува документ |
/scanner/ingest дополнително бара важечки nonce wp_rest, во заглавјето X-WP-Nonce
или како параметар _wpnonce — затоа што sendBeacon не може да постави заглавје.
/settings при запишување прифаќа само клучеви пријавени како вистински поставки: филтер
може да инјектира синтетички клучеви што тоа не се. Секоја вредност се чисти поединечно.
Ниту еден познат клуч дава 400.
/ledger го проверува овластувањето повторно во самиот handler, како одбрана во длабочина
против permission_callback филтриран на друго место.
Безбедносниот модел на јавните записи
Појдовната констатација е едноставна: nonce не може да живее во кеширачки HTML.
Затоа /consent и /dsar имаат попустлива контрола на пристап, заштитена со четири слоја во
редослед што е важен.
- Проверка на потеклото врз истиот хост. Бесплатна, детерминистичка, не троши никаков буџет.
- Токен сопствен на приклучокот во заглавјето
X-OWC-Nonce— тоа е доказ, никогаш вето. Изборот да не се користиX-WP-Nonceе намерен: јадрото на WordPress го пресретнува тоа заглавје пред секоја проверка на пристап за рутата и го одбива целото барање ако не го потврди. Затоа истечен токен сервиран од кеш би убил запис што крајната точка би го прифатила и без никаков токен. - Паѓање затворено: ниту потекло, ниту проверен токен даваат 403
owc_missing_origin. - Ограничувањето на брзината на крајот. Ако беше прво, лоша конфигурација би трошела по два токена на клик и би завршила во 429, што би ја скрило конфигурациската грешка зад ограничување на брзината.
Прифатени хостови: оние што WordPress ги пријавува (URL на сајтот, WordPress URL,
REST-корен) заедно со нивниот близнак www./apex, плус хостот од заглавјето Host на
тековното барање и неговиот близнак. „Исто потекло“ значи „потеклото одговара на хостот на
кој прелистувачот се поврзал“, не „одговара на тоа што WordPress го има во базата“ — инаку
секој сајт достигнат преку домен за преглед, алијас, staging име, мапиран домен во multisite
или зад прокси што го препишува Host би бил тивко одбиен, без можност за самопоправка.
Филтер: owc_allowed_request_hosts.
CORS му е препуштен на јадрото на WordPress, намерно.
/nonce изречно ја одбива JSONP-формата: без тоа одбивање, туѓа страница би можела со едно
<script src> да го собере живиот токен на администратор што минува, бидејќи тоа не подлежи
на проверка на потеклото.
Ограничувањата на брзината
| Кофа | Буџет | Прозорец | Клуч |
|---|---|---|---|
nonce | 120 | 5 минути | IP-адреса |
consent | 30 | 5 минути | IP-адреса |
dsar | 3 | 1 час | IP-адреса |
dsar_email | 3 | 24 часа | целна адреса на е-пошта |
dsar_global | 30 | 1 час | целиот сајт |
gpc | 30 | 1 час | IP-адреса |
tcf_gvl | 10 | 1 час | IP-адреса |
- Фиксен прозорец, не лизгачки: кофа што прима сообраќај секогаш на крајот истекува.
- Зачуваниот клуч е осолен отпечаток: ниту една IP-адреса ниту адреса на е-пошта во отворен облик не се наоѓа во опциите или во кешот на објекти.
- Нормализација на IP: IPv4 се чува, IPv6 се скратува на /64 — клиентот контролира секој бит од идентификаторот на интерфејсот, па затоа целосен клуч би овозможил нов буџет при секое барање.
- Заеднички идентитет: зад CDN или прокси непријавен преку
OWC_TRUSTED_PROXY, сите посетители пристигнуваат со иста адреса. Тогаш буџетот се дели по посетител, со проширен бројач врз заедничката адреса. Тоа е погруба граница: пријавете го вашиот прокси. - Филтер
owc_throttle_max( $max, $bucket, $window )— враќање на0го исклучува ограничувањето. - Ограничувачот паѓа отворено ако кешот на објекти е недостапен: подобро е да не се ограничува отколку да се спречи некој да ги оствари своите права.
Рутата /consent во детали
headers_sent()се чита прво од сѐ. Ако излезот веќе почнал, серверското колаче не може да се постави: редот сепак се запишува и одговорот останува 200, соcookie_set: falseи дескрипторcookie(name,value,ttl,path,samesite,secure) што клиентот сам го поставува.- Категориите што сајтот не ги нуди се враќаат во
dropped_categories, а не тивко се игнорираат. page_urlсе проверува наспроти хостовите на сајтот, со резерва наRefererпроверен на ист начин, инаку празна низа. Клучот е секогаш присутен, за регистарот да не оди да го бара сировиотReferer.- Ако регистарот е вклучен и записот е одбиен, колачето се поништува и одговорот е 503
owc_ledger_write_refused. Ништо не се складира, ниту еден следач не се ослободува. cookie_unreadableе чиста телеметрија: врз него не се применува никаква проверка на валидноста, токму за дијагностичко поле никогаш да не може да одбие запис на согласност. Неговиот единствен ефект е белешка во дневникот на одбивања.
Типичен одговор: {ok, state, dropped_categories, logged, cookie_set[, cookie]}. Полето
logged е null кога регистарот е исклучен.
Кодови на грешки
| Код | HTTP | Значење |
|---|---|---|
owc_bad_param | 400 | Невалиден параметар |
owc_bad_categories | 400 | Објектот categories е неисправен, преголем или нескаларен |
owc_bad_email | 400 | Невалидна адреса на е-пошта |
owc_bad_dsar | 400 | Неисправно DSAR испраќање (вклучувајќи замка за ботови) |
owc_dsar_not_attested | 400 | Недостига изјавата по чл. 12.6 |
owc_no_settings | 400 | Ниту еден познат клуч на поставка во телото |
owc_missing_origin | 403 | Ниту потекло ниту токен: паднато затворено |
owc_bad_origin | 403 | Пријавеното потекло не е хост на овој сајт — одговорот наведува до десет прифатени хостови |
owc_bad_nonce | 403 | Невалиден nonce на /scanner/ingest |
owc_jsonp_forbidden | 403 | Одбиена JSONP-форма на /nonce |
owc_forbidden | 401/403 | Недоволно овластување |
owc_dsar_disabled | 404 | Порталот за правата е исклучен на серверот |
owc_no_template | 404 | Нема шаблон за овој тип и овој профил |
owc_rate_limited | 429 | Достигнато ограничување на брзината |
owc_consent_failed | 500 | Неуспех при примена на согласноста |
owc_dsar_store_failed | 500 | Неуспех при запишување на барањето |
owc_gen_failed | променлив | Одбиено генерирање документ (полиња што недостигаат, јазична бариера) |
owc_ledger_write_refused | 503 | Регистарот одбил да запише — ништо не е запишано, ништо не е одблокирано |
Дневникот на одбивања
Последните дваесет одбивања на запис се чуваат и се прикажуваат на контролната табла — само ако дневникот не е празен. Таму се разликуваат две природи:
- ставка со HTTP-статус е вистинско одбивање: ништо не е складирано и посетителот видел грешка;
- ставка со статус 0 е предупредување: изборот навистина е запишан.
Панелот ги прикажува еден до друг хостот пријавен од потеклото и заглавјето Host на
барањето. Тоа е токму она што се разликува кога вашите посетители се движат на еден хост
додека WordPress е конфигуриран со друг — најчестата причина за согласност што „не се
зачувува“.
Ограничувања на API-то
/consentи/dsarприфаќаат анонимни записи по дизајн; заштитата е потеклото плус ограничувањето на брзината, не nonce.- Ограничувачот на брзината паѓа отворено без кеш на објекти.
- Колачето за согласност е host-only: колаче поставено за apex е нечитливо од страница
на
www., и никакво CORS-заглавје не може да го поправи тоа. Лекот е URL за запишување со исто потекло. /scanner/ingestприфаќа самоmanage_options: сондата не може да дојде од посетител./settingsнема свој сопствен nonce: тоа еmanage_optionsплус проверката на nonce преку колаче од јадрото.
Преглед на поставките
Сите поставки се сместени во една единствена опција, owc_settings, вчитана автоматски
бидејќи се чита на секоја предна страница.
Читање и запишување во PHP
$postavki = OWC_Core::settings(); // ефективни поставки (стандардни + зачувани + филтри)
$profil = OWC_Core::setting( 'compliance_profile' );
$surovo = OWC_Core::stored_setting( 'compliance_profile' ); // го игнорира препишувањето по посетител
OWC_Core::update_settings( array(
'consent_renewal_months' => 6,
'compliance_strict' => true,
) );
update_settings() спојува само поднесените клучеви врз постојното, никогаш целиот
сет стандардни вредности. Тоа е она што му овозможува на редот со опцијата да остане празен
сѐ додека ништо не сте приспособиле, а со тоа и на текстовите да го следат јазикот на сајтот.
Резултатот од settings() е мемоизиран, со клуч заснован на целиот сет callback-и на
филтерот owc_settings: модул што го регистрира својот филтер по првото читање го поништува
мемото наместо да биде игнориран. Мемото се празни при секое запишување на опцијата.
Стандардни вредности
[
// Банер
'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, // крстче = премолчено одбивање
'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',
// Пловечко копче
'floating_button_enabled' => true,
'floating_button_position' => 'bottom-left',
'floating_button_style' => 'pill',
'floating_button_label' => 'Cookies',
// Согласност
'consent_renewal_months' => 12, // 0 се претвора во 13, не во „никогаш“
'consent_policy_hash_check' => true,
// Усогласеност
'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,
// Категории
'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.',
// Регистар
'ledger_enabled' => true,
'ledger_retention_days' => 1825, // 5 години; 0 = неограничено
'ledger_hash_algo' => 'sha256',
// Скенер
'scanner_enabled' => false,
'scanner_frequency' => 'weekly',
'scanner_alert_email' => '',
'scanner_max_urls' => 25,
'scanner_timeout' => 8,
'scanner_probe_mode' => 'admins',
// Портал за правата
'dsar_enabled' => true,
'dsar_email' => '',
'dsar_response_days' => 30,
'dsar_notify_email' => '',
'dsar_token_ttl_days' => 7,
// Блокирање
'blocker_unknown_script_policy' => 'allow',
'blocker_unknown_iframe_policy' => 'block',
'blocker_allowlist' => '', // еден хост по ред
'blocker_block_resource_hints' => true,
// Интеграција и животен циклус
'forms_integration_enabled' => true,
'auto_footer_menu_inject' => false,
'delete_data_on_uninstall' => false,
// Правен идентитет
'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' => '', // намерно празно: се изведува од земјата + профилот
'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,
// Линкови
'link_privacy_policy' => '',
'link_cookie_policy' => '',
'link_terms' => '',
'link_legal_notice' => '',
]
Затворени списоци
Вредност надвор од списокот се враќа на стандардната.
| Поставка | Прифатени вредности |
|---|---|
banner_position | bottom-bar, bottom-card, center-modal, top-bar |
banner_style | auto, light, dark |
floating_button_position | bottom-left, bottom-right, top-left, top-right |
floating_button_style | icon, pill |
compliance_profile, geo_default_profile | gdpr, ccpa, lgpd, popia, pipl, dpdp, quebec, uk_pecr, ch_nfadp, au, us_generic |
ledger_hash_algo | sha256, sha3-256 (пресечени со тоа што PHP го поддржува) |
scanner_frequency | hourly, twicedaily, daily, weekly |
scanner_probe_mode | admins, off |
legal_business_type | auto, vitrine, rental, ecommerce, services, saas, content |
blocker_unknown_script_policy, blocker_unknown_iframe_policy | allow, block |
Граници на целите броеви
| Поставка | Граници |
|---|---|
consent_renewal_months | 0 до 13 (0 се третира како 13) |
dsar_response_days | 1 до 30 |
dsar_token_ttl_days | 1 до 90 |
ledger_retention_days | 0 до 3650 (0 = неограничено) |
scanner_max_urls | 1 до 500 |
scanner_timeout | 1 до 60 |
legal_minor_age | 13 до 18 |
retention_form_data_days | 1 до 3650 |
retention_dsar_days | 1 до 3650 |
tcf_cmp_id | 0 до 4095 |
Чистење на влезот
text_messageе единственото поле со богат HTML; прифаќа HTML дозволен во WordPress-објава, а банерот на крајот исцртува само<a href target rel>.- Полиња со повеќе редови:
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, и секој клуч што завршува со_desc. - URL-адреси: секој клуч со префикс
link_или со суфикс_url, плусlegal_profession_rules. - Адреси на е-пошта: секој клуч што содржи
email. - Сѐ останато: обичен текст.
- Нескаларна вредност поднесена за скаларна поставка се игнорира, клучот не се запишува.
Каде се поставува што
| Картичка | Поставки |
|---|---|
| Banner | banner_*, text_*, floating_button_*, consent_renewal_months, consent_policy_hash_check |
| Compliance | compliance_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 identity | legal_*, retention_form_data_days, retention_dsar_days, policy_disclaimer |
| Categories | cat_*_available, cat_*_label, cat_*_desc |
| Audit ledger | ledger_enabled, ledger_retention_days (алгоритмот е прикажан, но не и изменлив) |
| Scanner | scanner_* |
| DSAR requests | dsar_* |
Табели
| Табела | Содржина |
|---|---|
{prefix}owc_ledger | Синџирест регистар на согласности |
{prefix}owc_dsar | Барања за остварување на правата |
{prefix}owc_scanner | Наоди на скенерот |
{prefix}owc_scripts | Каталог со потписи за блокирањето |
{prefix}owc_form_links | Врски согласност ↔ испраќање во OW Forms |
PHP-помошникот owc_table( 'ledger' | 'dsar' | 'scanner' | 'scripts' ) го пресметува името
одново од тековниот префикс: користете го во switch_to_blog(), бидејќи константите се
замрзнати за времетраењето на барањето.
Други опции и transient-и
Опции: 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, плус знаменцата за миграција
(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-и: owc_catalog_<version>, owc_invalid_patterns, owc_gvl_cache,
owc_gvl_stub, owc_gvl_etag, owc_gvl_retry, owc_mmdb_<отпечаток>,
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, и бројачите за ограничување на брзината.
Константи препознаени во wp-config.php
| Константа | Ефект |
|---|---|
OWC_LEDGER_KEY | HMAC клуч на регистарот, и изведен клуч на колачето за регионално откривање |
OWC_TRUSTED_PROXY / OWC_TRUSTED_PROXIES | CIDR распони на доверливите прокси-сервери; без нив, заглавјата со IP на клиентот се игнорираат |
OWC_GEO_TRUSTED_HEADERS | cloudflare, cloudfront, proxy или all |
OWC_BEHIND_CLOUDFLARE | Кратенка за заглавјето за земја на Cloudflare |
OWC_BEHIND_CLOUDFRONT | Кратенка за заглавјето за земја на CloudFront |
Куките за програмери
Филтри
| Филтер | Улога |
|---|---|
owc_settings | Ефективните поставки. Одговорот мора да зависи од нешто стабилно за целото барање |
owc_banner_texts | Текстовите на банерот |
owc_bootstrap_config | Статичката конфигурација отпечатена во <head> — никогаш податок по посетител |
owc_scripts_catalog | Редовите на каталогот пред валидација |
owc_blocker_allowlist | Хостови што никогаш не се блокираат |
owc_scanner_urls | URL-адреси за скенирање (потоа повторно ограничени на хостот на сајтот) |
owc_throttle_max | Буџетот на едно ограничување на брзината; 0 го исклучува |
owc_allowed_request_hosts | Хостови прифатени за јавен запис |
owc_allow_headerless_write | Го подига паѓањето затворено кај записите без потекло (стандардно false) |
owc_geo_mmdb_path | Патека до базата на MaxMind |
owc_tcf_purpose_map | Пресликување категории → TCF-цели |
owc_tcf_stub_config | Статичка конфигурација на TCF-стубот |
owc_policy_template | Сирово тело на шаблон — ја исклучува бравата за јазик |
owc_policy_vars | Променливите на еден документ |
owc_policy_html | Финалниот HTML на еден документ |
owc_dsar_types | Типови барања што се нудат и прифаќаат |
owc_dsar_form_notice | Информативната белешка под формуларот |
owc_dsar_export_bundle | Содржината на пакетот за преносливост |
owc_dsar_show_fulfilment_panel | Прикажување на панелот за извршување |
Акции
| Акција | Потпис |
|---|---|
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-задачи: owc_daily_maintenance, owc_ledger_retention, owc_scanner_run,
owc_scanner_run_batch, owc_tcf_refresh_gvl, owc_run_upgrade.
Интернационализација
Преводниот домен е ow-consent, патеката /languages. Изворниот јазик е англискиот.
Пакетот го испорачува шаблонот ow-consent.pot и целосен француски превод.
Потсетување на механизмот опишан погоре: сѐ додека една ознака или текст на банерот не е приспособен во поставките, тој го следи јазикот на сајтот. Штом ќе внесете своја сопствена вредност, таа се сервира таква каква што е, без оглед на јазикот на посетителот.
Телата на правните документи не поминуваат низ тој механизам: нивниот јазик ја следи јурисдикцијата, никогаш локалот на администраторот.
Решавање проблеми
Банерот не се прикажува
Поминете го списокот по редослед:
- Дали
banner_enabledе вклучено? Ознаката на врвот од административниот екран го кажува тоа. - Дали вашата тема ги повикува
wp_head()иwp_footer()? Без нив, банерот одбива да се отпечати наместо да произведе инертен HTML. - Дали посетителот веќе направил избор? Банерот се прикажува само на
<html data-owc="none">. Тестирајте во приватно прелистување или соwindow.OWCBanner.reset(). - Дали посетителот има JavaScript? Без него, банерот останува скриен — намерно — и
блокот
<noscript>презема. - Дали некој кеш на страници сервира верзија постара од активацијата? Испразнете го.
Банерот се враќа на секоја страница иако изборот е зачуван
Три причини, по редослед на честота.
- Посетениот хост се разликува од хостот конфигуриран во WordPress (
www.наспроти apex, алијас, staging домен). Тогаш прелистувачот одбива да го зачува колачето додека WordPress одговара со 200. Отворете ја контролната табла: дневникот на одбивања ги прикажува еден до друг потеклото и заглавјетоHost. Лекот е сајтот да се сервира на еден единствен канонски хост. consent_policy_hash_checkе вклучено и вашите документи се сменија — тоа е саканото однесување, посетителот се прашува одново по измена на политиката.- Сте на верзија постара од 1.4.3. Тогаш колачето беше кодирано двапати и прелистувачот не успеваше да го прочита, иако серверот го читаше сосема добро. Ажурирајте: колачињата запишани пред поправката остануваат читливи.
„Вашиот избор не можеше да се зачува“ — грешка refused или 403
Погледнете го data-owc-code на елементот со пораката, или дневникот на одбивања на
контролната табла.
owc_bad_origin: пријавеното потекло не е препознаен хост. Одговорот ги наведува прифатените хостови. Ако вашиот сајт легитимно се достигнува преку повеќе имиња, додајте ги со филтеротowc_allowed_request_hosts.owc_missing_origin: ниту потекло, ниту токен. Тоа е типично приклучок за приватност што ги брише заглавјата, или прокси што ги препишува.owc_bad_nonce: се однесува само на сондата на скенерот, не на записот на согласноста — nonce никогаш не е вето на/consent.
Грешка ratelimit — 429
Ограничувањата се намерно ниски кај јавните записи. Две причини:
- Непријавен CDN или прокси: сите ваши посетители пристигнуваат со иста адреса и делат
ист буџет. Пријавете го со
OWC_TRUSTED_PROXYвоwp-config.php. - Автоматизиран тест што праќа повеќе од 30 записи за 5 минути од иста адреса.
503 owc_ledger_write_refused
Регистарот одбил да запише, значи ништо не е зачувано и ниту еден следач не е ослободен. Тоа е саканото однесување: согласност што не може да се докаже не смее да се тврди.
- Проверете дали табелата
{prefix}owc_ledgerпостои. Картичката Audit ledger прикажува читлива порака „сѐ уште не е инсталирано“ наместо бел екран. - Проверете ги правата на запишување на MySQL корисникот.
- Како последно средство, привремено исклучете го
ledger_enabledза да ја вратите услугата — знаејќи дека во тоа време го губите доказот.
Следачи сѐ уште се вчитуваат пред согласноста
- Дали
compliance_strictе вклучено? Без него, се обработуваат само скриптите ставени во редица од WordPress. - Дали следачот е во каталогот? Непозната скрипта од трета страна е дозволена по правило. Стартувајте скенирање и класифицирајте го наодот: тоа го запишува правилото за блокирање.
- Дали е внесен од JavaScript од прва страна? Динамичката заштита покрива само дваесет хостови. Додајте каталошко правило врз доменот на следачот.
- Дали е тоа колаче поставено преку заглавје
Set-Cookie? Никакво блокирање кај клиентот не може да го задржи. Мора да се реши на изворот, на серверот. - Ставете го
blocker_unknown_script_policyнаblock— потоа внимателно тестирајте го сајтот, затоа што таа поставка блокира секоја непрепознаена трета страна.
Легитимна интеграција е блокирана
Додајте го нејзиниот хост во blocker_allowlist, по еден на ред, или преку филтерот
owc_blocker_allowlist. Проверете го и blocker_unknown_iframe_policy: непознатите
iframe-ови се блокирани по правило, тоа е најчестиот случај.
Ако интеграцијата треба да остане условена од согласноста, подобро класифицирајте ја во вистинската категорија: визуелната замена носи копче „Прифати …“ што ја одблокира со еден клик.
Скенерот не наоѓа ништо
- Дали е вклучен? Исклучен е по правило.
- Дали WP-Cron работи? Со
DISABLE_WP_CRONи без системски cron, закажаното скенирање никогаш не тргнува. Стартувајте едно рачно за да проверите. - Дали е можен HTTP loopback? HTTP-автентикација на staging или огнен ѕид го блокира скенирањето. Панелот за покриеност ја прикажува првата грешка.
- Серверското скенирање не извршува никаков JavaScript. Посетете страница од сајтот како најавен администратор за сондата да пријави што внесува менаџерот на ознаки.
Во секој случај, прочитајте го панелот „што навистина опфаќа ова скенирање“ пред да заклучите: тој го разликува „ништо не е најдено“ од „ништо не е прочитано“.
Генерирањето на документ е одбиено
Две можни причини, и пораката тоа го кажува:
- Задолжителни полиња се празни — прикажан е список на клучевите што недостигаат. Дополнете ја картичката Legal identity.
- Јазична бариера — барате правни информации или општи услови за јурисдикција во која не
се зборува француски. Копчето е скриено во тој случај. Единствениот пат е да го обезбедите
вашето сопствено тело преку филтерот
owc_policy_template.
Е-пораката за потврда на DSAR не пристигнува
Речиси секогаш е испорачливоста, не приклучокот.
- Одговорот на API-то носи
mail_sent: falseкога испраќањето не успеало, а формуларот тогаш прикажува посебна порака што упатува кон адресата за контакт. - Инсталирајте SMTP приклучок. PHP-функцијата
mail()ја одбиваат повеќето приемни сервери. - Проверете ги SPF, DKIM и DMARC на вашиот домен. Приклучокот никогаш не ја препишува
адресата на испраќачот — тоа е она што би го скршило SPF — туку само поставува
Reply-To. - Проверете дали
dsar_emailе валидна адреса.
Сѐ додека е-пораката не е примена и потврдена, барањето останува pending и законскиот рок
не почнува да тече.
Модулот TCF не се вклучува
Отворете ја картичката Compliance: административно известување ја именува причината.
missing_cmp_id:tcf_cmp_idе 0. Мора да добиете CMP ID од IAB Europe; приклучокот не обезбедува таков и одбива да емитува низа со идентификатор 0.- CMP ID поголем од 4095: вредноста не се собира во полето од 12 бита на низата и би означувала друг CMP.
no_gvl: Global Vendor List сѐ уште не е преземена. Таа доаѓа преку дневен cron; проверете дали WP-Cron работи и дали вашиот сервер може да го достигнеvendor-list.consensu.orgпреку излезен HTTPS.
Сите посетители го добиваат конфигурираниот профил, и покрај регионалното откривање
- Дали
geo_enabledе вклучено? Исклучено е по правило. - Дали го пријавивте вашиот прокси? Без
OWC_BEHIND_CLOUDFLARE,OWC_BEHIND_CLOUDFRONTилиOWC_GEO_TRUSTED_HEADERSвоwp-config.php, заглавјата за земја се игнорираат, затоа што може да се фалсификуваат. - Дали датотеката на MaxMind е на место? Приклучокот не ја презема и не нуди екран за качување.
- Можеби е сосема нормално: првото прикажување кај посетител сервиран од кешот го користи конфигурираниот профил сѐ додека колачето со траење од 24 часа не постои. Контролната табла прикажува дијагностички блок со откриената земја, применетиот профил и изворот.
Администрацијата пријавува дека клучот на регистарот живее во базата
Тоа е известувањето notice_ledger_key. Значи дека AUTH_KEY и AUTH_SALT не се во
wp-config.php — WordPress тогаш ги чува во базата — и дека ниту OWC_LEDGER_KEY не е
дефинирана. Синџирот продолжува да се гради, но секој што има пристап до базата може да го
препотпише: тврдењето за неизменливост повеќе не стои.
Лекот е да додадете OWC_LEDGER_KEY (и, кога веќе сте таму, AUTH_KEY и
AUTH_SALT) во wp-config.php. Проверката потоа разликува ротација на клуч од препишување,
па таа промена не ја поништува вашата историја.
Приклучокот не прави баш ништо, со црвено известување
Вашиот WordPress е постар од 6.2. Приклучокот одбива да стартува, а известувањето изречно вели дека ништо не е блокирано и дека ниедна согласност не се запишува. Ажурирајте го WordPress, или исклучете го приклучокот и во меѓувреме тргнете го банерот од вашите страници.
Каталошки правила што „не можат да се активираат“
Административно известување ги пријавува, а картичката Tracker catalogue има посветен филтер. Четири можни причини: празен образец или образец составен само од невидливи знаци, регуларен израз што не се компајлира или што катастрофално се враќа наназад, преоткус образец без точка за да цели URL, или категорија што повеќе не постои на сајтот. Поправете ги или избришете ги тие редови: тие даваат лажен впечаток за покриеност.
Најчести прашања
Дали приклучокот работи зад кеш на страници? Да, и целата негова архитектура е изградена околу тоа ограничување. Произведениот HTML е идентичен за сите посетители; согласноста се чита во прелистувачот и се применува пред првото исцртување. Ниту еден nonce не се печати во кеширачки HTML. Само вистински личните одговори се означени како некеширачки.
Дали заменува платен CMP? На повеќето сајтови, го покрива истиот терен: банер, блокирање, дневник за ревизија, барања за остварување на правата, географско рутирање и генерирани документи. Две работи што не ги прави: тоа не е CMP регистриран кај IAB Europe, и не дава правен совет ниту прегледани документи — генераторот произведува нацрти што вие мора да ги дадете на потврда.
Дали регистарот е неизменлив?
Тој е отпорен на неоткриена измена, под еден услов. Секој ред е потпишан со HMAC врз
отпечатокот на претходниот: изменет или избришан ред го крши синџирот, а проверката кажува
каде. Гаранцијата почива на тоа дека клучот за потпишување живее надвор од базата. Тоа е
случај ако AUTH_KEY и AUTH_SALT се во wp-config.php, или ако дефинирате
OWC_LEDGER_KEY. Инаку, WordPress ги чува salts во базата и напаѓач што ќе стигне до неа би
можел да го препотпише синџирот — приклучокот ја открива таа состојба и ве предупредува.
Дали скенерот го забавува сајтот? Не. Исклучен е по правило, а откако ќе го вклучите работи на WP-Cron со фреквенцијата што вие ја избирате, преземајќи примерок од вашите сопствени страници на серверот. Никогаш не се извршува додека посетителот прегледува.
Дали скенерот ги наоѓа колачињата?
Делумно, и тоа е важно да се разбере. Серверското скенирање ги чита заглавјата
Set-Cookie на вашите страници: значи ги наоѓа колачињата поставени од серверот,
вклучувајќи ги и HttpOnly. Не извршува никаков JavaScript, па затоа колачињата запишани од
скрипти во прелистувачот не му се видливи; нив ги собира сонда што работи само за најавен
администратор. Третирајте го резултатот како попис на тоа што е видено, не како исцрпен
список — двата екрана го кажуваат тоа наместо да ве остават да претпоставите обратно.
Како се извршува барање за остварување на правата? Лицето го испраќа формуларот и добива е-порака за потврда. Потврдувањето на барањето на поврзаната страница го стартува рокот од членот 12.3 и отвора изворно WordPress-барање. Од екранот DSAR, преземате JSON-извоз произведен од сите извозници регистрирани на сајтот, ги стартувате сите бришачи, и затворате со писмен одговор што останува прикачен на барањето. Затоа што опфаќа извозот зависи од инсталираните приклучоци; оние што не регистрираат ниту една од тие куки мора да се обработат рачно.
Може ли да го користам модулот TCF за AdSense или Ad Manager? Само со ваш сопствен CMP ID издаден од IAB Europe, и дури и тогаш со резерва. Без CMP ID, модулот воопшто не се вчитува. Со CMP ID, тој емитува правилно кодирана TC-низа и панелот ја прикажува секоја цел и секоја специјална функција што таа низа може да ја тврди — но политиката на TCF бара од регистриран CMP избор на ниво на цел и на ниво на добавувач. Тука прекинувачите на целите ги следат категориите и нема никаков избор по добавувач: тоа не е регистриран CMP, и добавувачите имаат основа да го одбијат неговиот сигнал. Ако рекламниот приход преку TCF му е важен на вашиот сајт, користете сертифициран CMP.
На кој јазик се генерираат документите? Политиката за приватност и политиката за колачиња постојат за сите единаесет профили, на јазикот на јурисдикцијата: англиски, француски за Франција, Белгија, Луксембург и Квебек, португалски за Бразил. Правните информации и општите услови постојат само на француски; за секоја друга јурисдикција, генераторот одбива да ги произведе наместо да објави неприлагоден документ.
Што можам да сменам на банерот?
Четири позиции, светла, темна или автоматска тема, изборно лого, ознаките, и пловечко копче
за повторно отворање. Секој елемент со класата owc-open-preferences го отвора панелот
одново. „Одбиј сѐ“ се исцртува со иста истакнатост како „Прифати сѐ“. Крстчето за
затворање е исклучено по правило; ако е вклучено, тоа запишува целосно одбивање, никогаш
тивко затворање. Панелот е употреблив со тастатура, неговите прекинувачи носат видлива
состојба, а модалниот прозорец го заробува па го враќа фокусот. Текстовите се преводливи и
заменливи преку филтерот owc_banner_texts.
Што точно блокира автоматското блокирање? Скриптите од трети страни, вградените фрагменти за следење, iframe-овите, мерните пиксели, analytics и marketing стилските листови и изворите на медиуми од трети страни се препишуваат пред согласноста, а потоа се ослободуваат по редоследот на документот. Наговестувањата за ресурси кон каталогизирана трета страна се бришат наместо да се одложуваат, бидејќи наговестувањето отвора врска и нема што да се враќа. Стилските листови и фонтовите сервирани од хост класифициран како функционален се оставаат недопрени. Атрибутите за мрзливо вчитување на приклучоците за кеш се неутрализираат за вчитувач да не врати блокирано URL. Приклучокот испорачува 175 потписи, уредливи од екранот Tracker catalogue и проширливи преку филтер.
Што се впишува во регистарот? Секое дејство околу согласноста — прифаќање, одбивање, делумно зачувување, GPC opt-out, обновување, повлекување — се додава во синџирестата табела. Еден ред содржи псевдонимизирана IP-адреса, отпечаток на user-agent, URL-то на страницата, профилот на усогласеност, отпечаток на важечките документи, отпечаток на банерот што бил навистина прикажан и верзијата на приклучокот — елементите што овозможуваат да се реконструира што видел посетителот.
Какви заштити има на формуларот за правата? Замка за ботови, минимално време на пополнување, задолжителна изјава проверена на серверот, три различни ограничувања на брзината, еднократен токен зачуван само како отпечаток, и потврда што бара изречно дејство на страницата — така што скенер на линкови во е-пошта не може да потврди идентитет наместо самото лице. Барање чиј автор никогаш не го потврдил својот идентитет не може ниту да се извезе, ниту да се избрише, ниту да се запише како исполнето, и таа проверка се применува на серверот, не само со криење копчиња.
Кои сигнали на Google Consent Mode v2 се емитуваат?
Сите седум: ad_storage, ad_user_data, ad_personalization, analytics_storage,
functionality_storage, personalization_storage и security_storage. Шесте категории се
поврзани со нив од единствен извор на вистина, така што банерот, блокирањето и bootstrap-от
не можат да се разидат.
Како се управуваат CCPA opt-out и GPC? Контрола „Do Not Sell or Share“ се вметнува во подножјето или се поставува преку shortcode. Првиот клик го запишува opt-out, како што бараат калифорниските прописи, наместо да отвори панел. Сигналот Global Privacy Control се третира како обврзувачки opt-out под американските профили, еднаш по сесија на прелистување, а посетителот се известува ако тој заменил избор што претходно го запишал. Под профилите од фамилијата на ГДПР, GPC се третира како наговестување: изборните категории се однапред одбиени во интерфејсот, банерот останува прикажан, и ништо не се запишува — затоа што согласноста таму мора да биде позитивен чин.
Кои колачиња ги поставува самиот приклучок?
Сите се внатрешни колачиња, ниту едно не служи за следење, и сите се пријавени во
генерираната политика за колачиња: owc_consent (изборите, псевдонимниот токен на
прелистувачот и профилот; траење според поставката за обновување, 12 месеци стандардно,
ограничено на 13), owc_geo (откриени земја и профил, 24 часа, без никаква IP-адреса),
owc_gpc (маркер на сесијата), owc_gpc_notice (5 минути), и euconsent-v2 (TCF-низа,
само ако модулот е вклучен и по дејство на посетителот).
Дали работи во multisite? Да. Секој сајт од мрежата има свои сопствени табели и свои сопствени поставки. Мрежната активација ги обиколува сите сајтови само ако мрежата брои најмногу 200; над тоа, секој сајт се обезбедува при своето прво барање.
А ако го избришам приклучокот? Регистарот, наодите на скенерот, каталогот, врските со OW Forms, опциите и поставките преживуваат по правило. Две работи си одат секогаш, без оглед на вашата поставка: шесте закажани задачи, и табелата со барањата за правата — таа е единствената што содржи директно идентификувачки лични податоци за трети лица, и штом приклучокот го нема, ништо повеќе не го ограничува нивното чување и ниту еден екран не овозможува да им се одговори. Извезете ги своите барања пред да го избришете приклучокот. За целосно чистење на остатокот, вклучете „Delete all data on uninstall“ пред бришењето.
Каде да се најде поддршка?
- Портал за поддршка: https://optionweb.dev/mk/addons/support/
- Е-пошта: support@optionweb.dev
- Документација: https://optionweb.dev/mk/addons/ow-consent/