Во живо · статус OK
Документација · OW Consent v1.4.3

OW Consent
Документација

Согласност за WordPress што ги блокира следачите пред кликот, а не по него.

v1.4.3GPL-2.0-or-laterДокументација

OW Consent — Документација

Целосно управување со согласноста во WordPress: банер за повеќе јурисдикции, блокирање на следачите, скенер, правни документи, регистар на докази и портал за правата. Автор: OptionWeb — Julien Daniel Страница на приклучокот: https://optionweb.dev/mk/addons/ow-consent/ Лиценца: GPL-2.0-or-later Верзија опфатена со овој документ: 1.4.3


Содржина

  1. Преглед
  2. Инсталација
  3. Брз почеток
  4. Единаесетте профили на усогласеност
  5. Категориите колачиња
  6. Банерот
  7. Автоматското блокирање
  8. Скенерот на следачи
  9. Генераторот на правни документи
  10. Регистарот на согласности
  11. Порталот за правата (DSAR)
  12. CCPA opt-out „Do Not Sell or Share“
  13. Google Consent Mode v2
  14. IAB TCF v2.2
  15. Global Privacy Control
  16. Регионалното откривање
  17. Интеграцијата со OW Forms
  18. Пловечкото копче
  19. Shortcodes
  20. REST API
  21. Преглед на поставките
  22. Решавање проблеми
  23. Најчести прашања

Преглед

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

  1. Преземете ow-consent-1.4.3.zip од https://optionweb.dev/mk/addons/ow-consent/
  2. Приклучоци → Додај нов → Качи приклучок
  3. Изберете ја датотеката, кликнете на Инсталирај, потоа на Активирај

Преку 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, кој постапува во два чекора:

  1. Секогаш, без оглед на вашата поставка: шесте cron-задачи се бришат и табелата {prefix}owc_dsar се отстранува, заедно со нејзините transient-и за ограничување на брзината. Тоа е единствената табела што содржи директно идентификувачки лични податоци за трети лица (адреса на е-пошта, име, слободен текст); штом приклучокот го нема, ништо повеќе не го ограничува нивното чување и ниту еден екран не овозможува да им се одговори, да се извезат или да се избришат. Извезете ги барањата што морате да ги зачувате пред да го избришете приклучокот.
  2. Само ако 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_pecrUK GDPR + PECR (Обединето Кралство)Opt-in
ch_nfadpШвајцарскиот nLPDOpt-in
quebecЗакон 25 (Квебек)Opt-in
lgpdLGPD (Бразил)Opt-in
popiaPOPIA (Јужна Африка)Opt-in
piplPIPL (Кина)Opt-in
dpdpDPDP Act 2023 (Индија)Opt-in
ccpaCCPA / CPRA (Калифорнија)Opt-out
us_genericГенерички американски државни закониOpt-out
auPrivacy 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
Опфат „ГДПР се применува“ за TCF27 земји од ЕУ + 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, земја FRCNIL
gdpr, земја BEAPD-GBA
gdpr, земја LUCNPD
gdpr, земја DEBfDI
gdpr, друга земја од ЕЕПОпшта формулација („надлежниот надзорен орган“)
uk_pecrICO
ch_nfadpPFPDT / FDPIC
quebecCommission d'accès à l'information
lgpdANPD
ccpaCalifornia Privacy Protection Agency
popiaInformation Regulator (South Africa)
piplCyberspace Administration of China
dpdpData Protection Board of India
auOAIC
us_genericAttorney General на вашата држава

Ако сте го изменале legal_dpa_authority, вашиот внес има предност над ова изведување.

Ограничувања на јурисдикцискиот опфат

  • Само четири земји од ЕЕП имаат именуван орган (FR, BE, LU, DE). ГДПР сајт во Шпанија, Италија или Холандија објавува општа формулација.
  • Нема поделба по држава во САД. Профилот us_generic постои и ги носи своите сопствени текстови VCDPA/CPA/CTDPA/UCPA/TDPSA, но ниту едно автоматско откривање не го доделува: се избира рачно.
  • Нема поделба по покраина во Канада.
  • Само три јазика на документите: француски, англиски, португалски. Телата не поминуваат низ механизмот за превод на WordPress — тоа е намерно: правен документ мора да биде еднојазичен, а неговиот јазик ја следи јурисдикцијата, никогаш локалот на администраторот.
  • Правни информации и општи услови: само француски шаблони. Генераторот категорично одбива за секој друг целен јазик, освен ако не го обезбедите вашето сопствено тело преку филтерот owc_policy_template.

Категориите колачиња

Канонскиот список

Шест категории, во овој редослед на прикажување, necessary секогаш прва:

SlugИспорачана ознакаИспорачан опис
necessaryNecessaryStrictly required for the site to function (cart, login, language preferences). Cannot be disabled.
functionalFunctionalEnhance the experience (chat, embedded videos, maps). Without them some features may not work.
analyticsStatisticsHelp us understand how you use the site (anonymously). No personal data is shared for commercial purposes.
marketingMarketingEnable us to show you ads and content tailored to your interests on other sites.
preferencesPreferencesRemember your interface choices (layout, saved filters).
socialSocial & embedsAllow embedded social content (YouTube, Instagram, X) to load.

Вредностите погоре се англиските стандардни вредности што можат да се зачуваат. На сајт на македонски, посетителот ја гледа преведената верзија — видете го механизмот за превод подолу.

Достапност

Поставка 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
necessarysecurity_storage, functionality_storage
functionalfunctionality_storage, personalization_storage
analyticsanalytics_storage
marketingad_storage, ad_user_data, ad_personalization
preferencespersonalization_storage
socialad_storage, ad_user_data

Важна нијанса: ако вашиот сајт ја изложува категоријата functional, functionality_storage се отстранува од списокот на necessary. Инаку би бил одобрен пред каква било согласност, иако припаѓа на изборна категорија.

Пресликување кон TCF — само описно

functionalfunctional, analyticsmeasurement, marketingadvertising, preferencespersonalization, socialsocial_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_positionbottom-bar, bottom-card, center-modal, top-barbottom-bar
banner_styleauto, light, darkauto

Само 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_alltrueПрикажува „Прифати сѐ“
banner_reject_alltrueПрикажува „Одбиј сѐ“
banner_preferencestrueПрикажува „Прилагоди“
banner_close_xfalseПрикажува крстче за затворање
banner_show_logotrueГо прикажува логото на сајтот

„Прифати сѐ“ и „Одбиј сѐ“ делат иста класа за обликување: иста позадина, иста рамка, иста дебелина, ист внатрешен простор. Тоа е одговорот на барањето на CNIL / EDPB (насоки 03/2022): одбивањето мора да биде исто толку едноставно и исто толку видливо колку и прифаќањето.

Крстчето за затворање

Тоа е исклучено по правило, затоа што крстче за затворање претставува премолчено одбивање. Три однесувања што треба да ги знаете:

  1. Кога banner_close_x е исклучено, крстчето постои во HTML-от но носи атрибут hidden, а CSS-от целосно го отстранува: ниту видливо, ниту достапно за фокус, ниту најавено кај читачите на екран.
  2. Кога е вклучено, кликот на крстчето го извршува целосниот пат „Одбиј сѐ“, никогаш тивко затворање.
  3. Тоа е откриено од рантајмот и преименувано во еден единствен случај: кога одбивањето воопшто не можело да се запише. Тогаш повеќе ништо не одбива, туку само го склонува известувањето — и тоа затворање не се смета за избор. Посетител чија одлука серверот ја одбива не се остава пред банер што не може да го затвори.

Првиот слој

  • Насловот (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_months120 до 13
consent_policy_hash_checktrue

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-и. Неговата низа на запишување вреди да се знае, затоа што таа ги објаснува повеќето пораки за грешка.

  1. Повторно всидрување на потеклото. REST URL-адресите доаѓаат од конфигурацијата на WordPress. Ако вашите посетители се движат на друг хост (www наспроти apex, алијас, домен за преглед, прокси што го препишува Host), тоа URL е cross-origin и прелистувачот одбива да го зачува Set-Cookie додека WordPress одговара со 200. Затоа рантајмот ја всидрува патеката дадена од PHP врз навистина посетеното потекло.
  2. Nonce. Се презема свеж од GET /owc/v1/nonce непосредно пред записот, никогаш не се вградува во кеширачки HTML, се праќа во заглавјето X-OWC-Nonce. Преземањето е ограничено на 4 секунди, а nonce што недостига, е празен или е недостижен никогаш не го спречува записот ниту се пријавува кај посетителот.
  3. Изречен page_url во телото на барањето, за да не зависи редот во регистарот од заглавјето Referer, кое приклучок, meta-referrer или прокси можат да го отстранат.
  4. Заштита од блокирање од 15 секунди со AbortController: барањето се откажува, не само се игнорира, за задоцнет POST да не запише втор ред.
  5. Дефиниција на успех. POST-от е успешен ако и само ако: одговорот е ok, телото е парсибилен JSON, json.ok === true, и колачето е повторно прочитано во прелистувачот. Кеш-страница, предизвик на работ на мрежата или WAF сервиран со 200 не се сметаат.
  6. Ако серверот одговори cookie_set: false, рантајмот сам го запишува колачето со вратените параметри, потоа повторно чита. Неуспехот си останува неуспех: ништо не се објавува, ништо не се одблокира.
  7. Само едно повторно праќање, и тоа само на 403 чиј код е owc_bad_nonce, rest_cookie_invalid_nonce или rest_nonce_invalid, и само ако добиениот nonce е навистина различен.
  8. Она што рантајмот го објавува е она што серверот го зачувал: категориите одбиени од серверот се одземаат од локалната состојба.

Сѐ додека 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>. Одлука, по редослед:

  1. веќе обработено → недопрено;
  2. скрипта на самиот приклучок → недопрена;
  3. type="text/plain" или тип што не е JS (ld+json, importmap, x-template) → недопрено;
  4. URL-то се бара во src, data-src, data-rocket-src, data-lazy-src, data-litespeed-src, data-cfsrc — значи, покриени се и атрибутите на приклучоците за перформанси;
  5. хост во белата листа → недопрено; ресурс од прва страна што не личи на следач → недопрено;
  6. совпаѓање со каталогот во форма хост + патека; URL од типот data: или javascript: се декодира и се суди како вградено тело;
  7. правило класифицирано како necessary никогаш не се блокира (Stripe.js, reCAPTCHA, Turnstile, cdnjs…): неговото блокирање не носи никаква усогласеност и го крши фрагментот што го повикува;
  8. никакво совпаѓање → blocker_unknown_script_policy, стандардно allow;
  9. инаку препишување во 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_stricttrueбулева
blocker_unknown_script_policyallowallow, block
blocker_unknown_iframe_policyblockallow, block
blocker_block_resource_hintstrueбулева
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 ) го применува блокирањето врз фрагмент што не поминал низ баферот за излез.

Ограничувања на блокирањето

  1. Без compliance_strict, се обработуваат само скриптите ставени во редица од WordPress.
  2. Непозната скрипта од трета страна е дозволена по правило. Вистинското блокирање почива на каталогот и на вградените потписи — проширете ги.
  3. Заштитата од скрипти внесени преку JavaScript покрива само дваесет хостови; следач надвор од списокот внесен од код од прва страна поминува.
  4. Стилските листови класифицирани како functional (веб-фонтови) намерно се пропуштаат.
  5. Следач каталогизиран во <img>, но класифициран поинаку од analytics или marketing, не се неутрализира.
  6. Медиумите (object, embed, source, video, audio) никогаш не се блокираат по правило: се обработува само трета страна што веќе е во каталогот.
  7. Документ поголем од 8 MB, откажување на PCRE или губење на повеќе од 50 % од содржината даваат страница сервирана без никакво блокирање, тивко.
  8. Повлекувањето на согласноста предизвикува целосно превчитување на страницата.

Скенерот на следачи

Скенерот попишува што вашите страници навистина вчитуваат. Тој е исклучен по правило: вклучете го во картичката 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. Исклучувањето на скенерот ги откажува двата настана.

Две различни е-пораки, никогаш и двете истовремено:

  1. Некатегоризирани следачи — се праќа само за навистина нови идентификатори, со памет ограничена на 500 ставки.
  2. „Скенирањето не можеше да го прочита овој сајт“ — ограничено на една порака неделно и по потпис на грешката. Тоа е најтешкиот режим на откажување, затоа што скенирање што не чита ништо не дава никакви наоди, значи ниту едно известување од првиот тип.

Примач: scanner_alert_email, инаку административната адреса на сајтот.

Чување: 90 дена. Наодите непрегледани 90 дена се бришат, штом барем една страница е прочитана — не само кога скенирањето ќе заврши.

Панелот за покриеност

Тоа е најважниот дел од картичката Scanner, и тој го храни и предупредувачкиот блок во генерираните документи. Секогаш одговара на овие прашања:

  • дали воопшто е стартувано скенирање?
  • дали последното заврши, или беше прекинато од својот временски буџет?
  • колку страници се навистина преземени (а не извадени од редицата)?
  • колку не можеле да бидат преземени, и која беше првата грешка?
  • дали некој прелистувач воопшто пријавил нешто, или JavaScript никогаш не бил набљудуван?
  • кој е прозорецот по кој непрегледан следач исчезнува?

Скенирање што не достигнало ниту една страница се претставува како неуспех, не како чист резултат. Токму тој панел треба да го прочитате пред да објавите политика за колачиња изградена врз тие наоди.

Картичката Scanner

Три картички со бројки (откриени следачи, некатегоризирани, последно скенирање и следно извршување), панелот за покриеност, копче „стартувај скенирање сега“, формуларот за распоред, потоа списокот наоди: филтри по категорија, текстуално пребарување, филтер по тип на елемент (script, inline_script, iframe, stylesheet, pixel, cookie, link, preconnect), филтер по состојба, извоз во CSV, страничење по 25. Класифицирање поединечно или масовно — масовниот избирач има празна прва ставка што е оневозможена, за случајно испраќање да не стане масовно декласирање.

Поставки на скенерот

ПоставкаСтандардноГраници
scanner_enabledfalseбулева
scanner_frequencyweeklyhourly, twicedaily, daily, weekly
scanner_max_urls251 до 500
scanner_timeout81 до 60
scanner_probe_modeadminsadmins, off
scanner_alert_email''адреса на е-пошта

Да се знае: scanner_probe_mode не се користи во оваа верзија. Кодот тоа изречно го кажува — условот за печатење на сондата повеќе не ја чита таа поставка и се потпира само на scanner_enabled. Зачувувањето на off ја складира вредноста без да ја исклучи сондата. За навистина да ја запрете сондата, исклучете го скенерот.

Ограничувања на скенерот

  1. Серверското скенирање не извршува никаков JavaScript. Без сондата, она што менаџерот на ознаки го внесува го нема во пописот.
  2. Сондата е резервирана за најавени администратори и не постои режим што ја извршува за обичен посетител: тоа би барало свое сопствено претходно известување.
  3. Колаче поставено преку заглавје Set-Cookie се открива, но не може да се блокира.
  4. Скенирањето никогаш не излегува од доменот и е ограничено на 25 URL-адреси по правило: голем сајт никогаш не се покрива целосно.
  5. На хост каде што HTTP loopback е блокиран (HTTP-автентикација на staging, огнен ѕид), скенирањето не чита ништо.
  6. Наод непрегледан 90 дена исчезнува, а со тоа исчезнува и од политиката за колачиња.
  7. Скенерот зависи од 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 е вклучено — а тоа е по правило — секој документ завршува со блок што вели дека тоа е автоматски генериран шаблон, дека мора да го прегледа квалификуван професионалец пред објавување, и што ги носи датумот на генерирање и верзијата на приклучокот. Исклучете го само ако знаете што правите.

Табелата со следачи — правилата на искреност

Табелата објавена во политиката за колачиња доаѓа од вашата табела на скенерот, не од некоја туѓа база. Пет правила го одредуваат тоа што таа го прикажува.

  1. Прозорец на свежина: се објавуваат само наодите прегледани во последните 90 дена. Ако колоната за последно набљудување сѐ уште не постои затоа што некоја миграција не поминала, прозорецот се игнорира наместо да се објави „нема следачи“ на сајт што ги има — недоволното објавување е единствената насока во која правен документ никогаш не смее да потфрли.
  2. Предупредувачки блок на почетокот на табелата, изведен од панелот за покриеност на скенерот: скенирање никогаш не стартувано, ниту една прочитана страница, прекинато скенирање, N URL-адреси со неуспех, ниту едно набљудување со активен JavaScript, прозорец од N дена. Непотполно скенирање се објавува како такво, а не како завршен попис.
  3. Некласифицираните следачи не се кријат: тие имаат свој сопствен дел. Тоа се оние што никој не ги прегледал.
  4. Колаче забележано во заглавје Set-Cookie носи посебен знак, со белешка што објаснува дека е поставено од серверот и дека никакво блокирање кај клиентот не може да го задржи. Затоа тоа не смее да се претстави како условено од согласноста, а клаузулата што тврди дека некласифицираните следачи се поставуваат само по согласност го носи соодветниот исклучок.
  5. Името на добавувачот и линкот до неговата политика доаѓаат од каталогот, само за правилата што целат 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/generatetype (задолжителен), publish (булев, стандардно false)manage_options
GET/owc/v1/policies/previewtype (задолжителен)manage_options

HTML-от на прегледот поминува низ wp_kses_post() пред да биде вратен.

Ограничувања на генераторот

  1. Тоа се шаблони, не правен совет. Дајте ги на преглед.
  2. Правните информации и општите услови постојат само на француски. Секоја друга јурисдикција удира во бравата за јазик, освен ако не го обезбедите вашето сопствено тело.
  3. Само три јазика: француски, англиски, португалски.
  4. Четири земји од ЕЕП имаат именуван орган; на друго место — општа формулација.
  5. Табелата со следачи вреди онолку колку што вреди вашето скенирање — и документот тоа го кажува.
  6. Класата на генераторот тежи околу 440 KB правни шаблони: се вчитува лениво, само кога некоја од трите влезни точки навистина се повика.

Регистарот на согласности

Регистарот е одговорот на членот 7.1 од ГДПР: да може да се докаже дека лицето дало согласност. Тој е вклучен по правило.

Табелата

{prefix}owc_ledger, сите датуми во UTC:

КолонаТипСодржина
idbigintПримарен клуч
created_atdatetimeUTC временска ознака
visitor_tokenchar(32)Псевдонимен токен на прелистувачот, 32 хексадецимални знаци
eventvarchar(20)accept_all, reject_all, save_preferences, withdraw, auto, gpc_opt_out
categoriesvarchar(255)Список на одобрените категории
profilevarchar(20)Профилот на усогласеност важечки во моментот на дејството
sourcevarchar(60)banner, preferences, footer_link, api, auto
ip_pseudonymousvarchar(45)Скратена IP-адреса
ua_hashchar(64)Осолен отпечаток на user-agent
page_urlvarchar(500)Страницата на која се случило дејството
prev_hashvarchar(128)Отпечаток на претходниот ред
row_hashvarchar(128)Отпечаток на овој ред
policies_hashchar(64)Отпечаток на важечките документи
banner_revisionvarchar(40)Отпечаток на банерот што бил навистина прикажан
plugin_versionvarchar(20)Верзија на приклучокот во моментот на записот

Последните три колони овозможуваат да се реконструира што видел посетителот, не само што штиклирал.

Синџирот

Секој ред е потпишан со HMAC врз канонска серијализација со префикс на должина од неговата содржина и од отпечатокот на претходниот ред. Генезата е низа од 64 нули. Записот се прави во трансакција, со брава на редот врз последната ставка: таа брава е тоа што навистина ги серијализира истовремените записи и го спречува гранењето на синџирот. Именувана MySQL брава се зема како втор бедем, во најдобар случај: ако биде одбиена, додавањето продолжува и се активира акција за да можете да го проследите тоа.

Вредностите се скратуваат пред потпишување, за потпишаната вредност да биде точно зачуваната вредност.

Искреноста околу неизменливоста

Приклучокот сам го одредува потеклото на својот клуч за потпишување:

ПотеклоУсловПресуда
constantOWC_LEDGER_KEY е дефиниранаНеизменливо
wp-configAUTH_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. Редовите постари од 1.2.0 носат отпечаток без клуч: тие никогаш не се потпишуваат повторно — повторното потпишување би му дозволило на напаѓач да натера фалсификувана историја да биде препотпишана — и ја спречуваат пресудата „непрекинат синџир“ сѐ додека постојат.
  3. Чувањето е ограничено на 20 000 реда по дневно извршување.
  4. Регистарот не се брише од бришачот на лични податоци на WordPress: тоа е синџир од хешови, неговото отстранување би го уништило доказот што тој постои да го носи, а содржи само псевдонимен токен и скратена IP-адреса. Порака му го објаснува тој избор на субјектот на податоците.

Порталот за правата (DSAR)

Порталот му овозможува на едно лице да ги оствари своите права од страница на вашиот сајт. Тој е вклучен по правило, но се појавува само таму каде што ќе го ставите shortcode-от.

Формуларот

[owc_dsar_form]

Атрибути:

АтрибутСтандардноУлога
typesaccess,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, со две групи: барањата за остварување на правата и регистарот на согласности.
  • Бришач:
    1. испраќањата што никогаш не биле потврдени се бришат — немаат никаква доказна вредност, само лични податоци;
    2. на затворените барања им се брише слободниот текст и името, а минималниот ред (датум, тип, статус) се чува како доказ (чл. 5.2) до retention_dsar_days;
    3. барање што е сѐ уште отворено се задржува, со порака што објаснува дека мора да се одговори пред да се избрише;
    4. регистарот на согласности не се брише, од причината објаснета погоре.
  • Приклучокот го храни и нацртот на политиката за приватност на WordPress.

Информативната белешка под формуларот

Под формуларот, расклоплив блок ја носи белешката од членот 13: идентитет и адреса на контролорот, контакт за приватност, цел и правен основ (чл. 6.1.в), собрани податоци, примачи и рок на чување, рок за одговор и можност за продолжување, надлежен надзорен орган, линк до политиката. Филтер: owc_dsar_form_notice( $html, $context ).

Прикажаниот орган доаѓа од изведувањето опишано во Единаесетте профили на усогласеност, и се задржува само ако почнува со голема буква: читањето на сировата поставка би го именувало францускиот орган на јужноафрикански, индиски, австралиски или калифорниски сајт.

Без JavaScript, копчето за испраќање е скриено и порака ја нуди адресата за контакт — за прелистувачот никогаш да не направи изворно испраќање што би ја ставило адресата на подносителот во URL-то, а со тоа и во дневниците на сите поминати сервери и прокси-сервери.

DSAR поставки

ПоставкаСтандардноГраници
dsar_enabledtrueбулева
dsar_email''јавен контакт и примач на известувањата
dsar_notify_email''дополнителен примач
dsar_response_days301 до 30 — никогаш повеќе од еден месец
dsar_token_ttl_days71 до 90
retention_dsar_days1095 (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 );

Ограничувања на порталот

  1. Идентитетот почива на еден единствен фактор: размената преку е-пошта. Секој дополнителен доказ по чл. 12.6 се внесува рачно во белешките на барањето.
  2. Неуспешно испраќање на е-пошта го блокира циклусот: одговорот изложува mail_sent: false и формуларот прикажува порака што упатува кон адресата за контакт, но барањето останува pending и законскиот рок не почнува да тече.
  3. Потсетниците за роковите и чистењето зависат од WP-Cron.
  4. Табелата со барањата секогаш се брише при деинсталација на приклучокот, без оглед на вашата поставка. Извезете пред да го избришете.

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“
classowc-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.

Ограничувања

  1. Контролата со еден клик бара fetch и Promise.
  2. Линкот е задолжителен само под профилите ccpa и us_generic; под кој било друг профил, тој ниту се прикажува ниту се открива.
  3. Откривањето кај клиентот зависи од колачето за регионално откривање, значи од 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_storagedeniedgranted
analytics_storagedeniedgranted
ad_user_datadeniedgranted
ad_personalizationdeniedgranted
personalization_storagedeniedgranted
functionality_storagedenied ако сајтот ја изложува категоријата functional, инаку grantedgranted
security_storageсекогаш grantedgranted

Двата комплета се печатат во истата страница. Рантајмот избира кој да го примени според колачето за регионално откривање. Без тоа, кеширана страница би ја заковала јурисдикцијата на еден американски посетител врз европски посетител.

Двете поврзани поставки

ПоставкаСтандардноЕфект
gcm_ads_data_redactiontrueГи прикрива рекламните идентификатори сѐ додека ad_storage е одбиен
gcm_url_passthroughtrueГи пренесува gclid / dclid низ URL-адресите сѐ додека колачињата се одбиени

Да се знае

security_storage никогаш не се допира со ажурирање: останува одобрен, како што предвидува спецификацијата. Контролната табла прикажува картичка што покажува дали Consent Mode е активен.


IAB TCF v2.2

Модулот TCF е исклучен по правило, и бара идентификатор што приклучокот не може да го обезбеди. Прочитајте го делот со ограничувањата пред да го вклучите.

Вклучување

ПоставкаСтандардноГраници
tcf_enabledfalseбулева
tcf_cmp_id00 до 4095
tcf_publisher_countryFRISO код од 2 букви
tcf_publisher_purposes_li[]список цели
tcf_special_features[]список специјални функции

Горната граница од 4095 не е произволна: полето CmpId зафаќа 12 бита во TCF-низата.

Три случаи во кои модулот одбива да емитува што било

  1. Нема CMP ID (tcf_cmp_id < 1): нема __tcfapi, нема TC-низа, нема колаче euconsent-v2, нема REST-рута. Административно известување го објаснува тоа. CMP ID мора да ви го додели IAB Europe; приклучокот не обезбедува таков. Емитувањето низа со CmpId 0 би било полошо од да не се емитува ништо.
  2. CMP ID поголем од 4095: истото одбивање, со посебно известување. Вредност скратена на 12 бита би означувала друг CMP — тоа е присвојување идентитет.
  3. Нема кеширана 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
functional1
analytics1, 8, 9, 10
marketing1, 2, 3, 4, 7
preferences1, 5, 6, 11
social1

Филтер: 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 — задолжително прочитајте

  1. Ова не е CMP регистриран кај IAB Europe. Бара ваш сопствен CMP ID, а дури и со него, политиката на TCF бара регистриран CMP да понуди избор на ниво на цел и на ниво на добавувач. Тука, прекинувачите на целите ги следат категориите и не постои никаков избор на ниво на добавувач: добавувачите имаат основа да го одбијат овој сигнал. Административниот екран тоа го кажува и зборува за „CMP-компатибилен режим (неофицијален)“, прифатен од повеќето SSP при развој, но одбиен во вистинска продукција во ЕЕП. Ако рекламниот приход преку TCF ви е важен, користете сертифициран CMP.
  2. Само сегментот Core: нема сегменти disclosedVendors, allowedVendors ниту publisherTC.
  3. Не се емитува ниту едно ограничување на издавачот: соодветниот бројач е секогаш 0 и објектот со ограничувања е празен.
  4. purposeOneTreatment и useNonStandardTexts се секогаш false, isServiceSpecific е секогаш true — нема глобален домет — а екранот за согласност е секогаш 0.
  5. getVendorList го игнорира параметарот за верзија и секогаш го враќа кешираниот список.
  6. Согласностите на издавачот ги препишуваат општите цели: нема приспособена цел.
  7. Само две специјални функции.
  8. Модулот бара функционален 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.

Серверскиот запис се случува само по целосен синџир проверки, во овој редослед:

  1. gpc_honor е вклучено;
  2. сигналот е присутен — заглавјето Sec-GPC, со резерва на X-Sec-GPC затоа што некои прокси-сервери и CDN го преименуваат заглавјето; важи само точната вредност 1;
  3. ефективниот профил е ccpa или us_genericинаку ништо не се запишува;
  4. станува збор за обично прегледување страница: без администрација, без cron, без AJAX, без REST, без XML-RPC, без WP-CLI, и методот е GET;
  5. заглавјата сѐ уште не се испратени — колаче што не може да се постави е одлука што би се запишувала одново при секое барање;
  6. маркерот на сесијата owc_gpc го нема: еднаш по сесија на прелистување;
  7. посетителот не личи на бот (празен user-agent, или таков што содржи bot, crawl, spider, slurp, monitor, uptime, pingdom, headless, preview, curl/, wget, python-, java/, go-http, okhttp, httpclient, libwww, facebookexternalhit);
  8. веќе зачуваниот избор не го задоволува веќе сигналот — инаку само се обележува прелистувачот;
  9. се почитува заедничкото ограничување на брзината: 30 на час по IP;
  10. прелистувачот се обележува пред записот, за неуспехот да не стане јамка на повторни обиди.

Настанот се запишува како 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_notice300 sГо активира известувањето „GPC го замени вашиот избор“

Двете се на path=/, SameSite=Lax, Secure на HTTPS, и читливи од скрипта.

Точка на проширување

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

Регионалното откривање

Регионалното откривање му го применува на секој посетител профилот на неговата јурисдикција наместо конфигурираниот профил на сајтот. Тоа е исклучено по правило.

ПоставкаСтандардно
geo_enabledfalse
geo_default_profilegdpr
geo_mmdb_enabledfalse

Каскадата на откривање

Првиот успех победува:

  1. Cloudflare (CF-IPCountry) — само ако сајтот изјавил дека е зад Cloudflare;
  2. AWS CloudFront (CloudFront-Viewer-Country) — истиот услов;
  3. GEOIP_COUNTRY_CODE, променливата запишана од самиот сервер (mod_geoip, ngx_http_geoip), значи неможна за фалсификување од клиентот; потоа, ако е пријавен прокси, варијантите во HTTP-заглавје;
  4. Локална база на MaxMind, ако geo_mmdb_enabled е вклучено;
  5. Ништо.

Без изречна изјава во 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, IMuk_pecr
CHch_nfadp
BRlgpd
ZApopia
CN, HKpipl
INdpdp
AU, NZau
CAquebec
USccpa
Сѐ останатоРезервата, деградирана во 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-адресата служи само како точка за пребарување и потоа изречно се уништува — никогаш не се запишува во дневник, никогаш не се складира, никогаш не се впишува во колачето.

Ограничувања на регионалното откривање

  1. Исклучено по правило, а варијантата со MaxMind бара датотека што вие ја обезбедувате.
  2. Заглавјата за земја се игнорираат сѐ додека не го пријавите вашиот прокси.
  3. Нема поделба по држава во САД, ниту по покраина во Канада.
  4. Режимот на посетителот зависи од JavaScript и од колачето со траење од 24 часа.
  5. Профилот 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.

Ограничувања

  1. Ниту еден настан на испраќање не се запишува во синџирестиот регистар. Редот со врската упатува на постојна ставка, но не создава нова — синџирот не смее да се запишува однадвор.
  2. Не може да се поврзе испраќање ако OW Forms е конфигуриран да не ги складира испраќањата: нема ред на кој би се закачило.
  3. Нема ретроактивно опоравување: врзувањето почнува од првото испраќање по ажурирањето.
  4. Спарувањето се прави врз осолениот отпечаток на адресата пресметан од OW Forms, со резерва на отворената адреса што OW Forms исто така ја чува. Тоа не е шема со нулево откривање: адресата останува во отворен облик кај OW Forms, затоа што мора да може да се одговори на лицето.
  5. Интеграцијата никогаш не го менува приклучокот OW Forms, неговите табели ниту неговите опции.
  6. Ако OW Forms е активен, но е премногу стар за да ја изложи својата рутина за бришење, бришачот изречно одговара дека испраќањата не биле допрени.

Пловечкото копче

Мало трајно копче овозможува панелот со преференции да се отвори повторно во секое време. Тоа е барањето на членот 7(3) — повлекувањето мора да остане исто толку едноставно колку и согласноста — и на одлуката на CNIL 2020-091, која бара механизам достапен од секоја страница.

Услови за постоење

Тоа ги бара двете поставки: floating_button_enabled и banner_enabled. Панелот со преференции и JavaScript API-то живеат во рантајмот на банерот; без него, копчето би било контрола што не прави ништо.

Тоа излегува и во администрација, на канал, на robots.txt, и ако wp_head не бил активиран.

Опции

ПоставкаВредностиСтандардно
floating_button_enabledбулеваtrue
floating_button_positionbottom-left, bottom-right, top-left, top-rightbottom-left
floating_button_stylepill, iconpill
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="Испрати"]
АтрибутСтандардно
typesaccess,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“
classowc-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/nonceaction (стандардно wp_rest)Враќа свеж токен. Одговор: {nonce, action, header: "X-OWC-Nonce", ttl: 43200}, со no-store и Vary: Cookie
POST/consentevent (стандардно 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/dsartype (задолжително), email (задолжително, формат на е-пошта), message (стандардно '', најмногу 2000 знаци)Поднесува барање за остварување на правата. Одговор {ok, mail_sent, message}никогаш идентификаторот

Прифатени вредности:

  • event: accept_all, reject_all, save_preferences, withdraw, auto, gpc_opt_out
  • source: banner, preferences, footer_link, api, auto
  • type (DSAR): access, rectification, erasure, portability, restrict, object, optout, withdraw
  • categories: објект, најмногу 32 ставки, само скаларни вредности
  • action (nonce): само wp_rest

Административни рути

Сите бараат овластување manage_options.

МетодПатекаПараметриУлога
GET/ledgerpage (≥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/ingestJSON тело {page, findings[]}Прием на набљудувањата на сондата
GET/scanner/findingspage, per_page (1–200, стандардно 50), filter (slug на категорија или unknown)Ги наведува наодите
POST/policies/generatetype (задолжително), publish (булев, стандардно false)Генерира документ
GET/policies/previewtype (задолжително)Прегледува документ

/scanner/ingest дополнително бара важечки nonce wp_rest, во заглавјето X-WP-Nonce или како параметар _wpnonce — затоа што sendBeacon не може да постави заглавје.

/settings при запишување прифаќа само клучеви пријавени како вистински поставки: филтер може да инјектира синтетички клучеви што тоа не се. Секоја вредност се чисти поединечно. Ниту еден познат клуч дава 400.

/ledger го проверува овластувањето повторно во самиот handler, како одбрана во длабочина против permission_callback филтриран на друго место.

Безбедносниот модел на јавните записи

Појдовната констатација е едноставна: nonce не може да живее во кеширачки HTML. Затоа /consent и /dsar имаат попустлива контрола на пристап, заштитена со четири слоја во редослед што е важен.

  1. Проверка на потеклото врз истиот хост. Бесплатна, детерминистичка, не троши никаков буџет.
  2. Токен сопствен на приклучокот во заглавјето X-OWC-Nonce — тоа е доказ, никогаш вето. Изборот да не се користи X-WP-Nonce е намерен: јадрото на WordPress го пресретнува тоа заглавје пред секоја проверка на пристап за рутата и го одбива целото барање ако не го потврди. Затоа истечен токен сервиран од кеш би убил запис што крајната точка би го прифатила и без никаков токен.
  3. Паѓање затворено: ниту потекло, ниту проверен токен даваат 403 owc_missing_origin.
  4. Ограничувањето на брзината на крајот. Ако беше прво, лоша конфигурација би трошела по два токена на клик и би завршила во 429, што би ја скрило конфигурациската грешка зад ограничување на брзината.

Прифатени хостови: оние што WordPress ги пријавува (URL на сајтот, WordPress URL, REST-корен) заедно со нивниот близнак www./apex, плус хостот од заглавјето Host на тековното барање и неговиот близнак. „Исто потекло“ значи „потеклото одговара на хостот на кој прелистувачот се поврзал“, не „одговара на тоа што WordPress го има во базата“ — инаку секој сајт достигнат преку домен за преглед, алијас, staging име, мапиран домен во multisite или зад прокси што го препишува Host би бил тивко одбиен, без можност за самопоправка. Филтер: owc_allowed_request_hosts.

CORS му е препуштен на јадрото на WordPress, намерно.

/nonce изречно ја одбива JSONP-формата: без тоа одбивање, туѓа страница би можела со едно <script src> да го собере живиот токен на администратор што минува, бидејќи тоа не подлежи на проверка на потеклото.

Ограничувањата на брзината

КофаБуџетПрозорецКлуч
nonce1205 минутиIP-адреса
consent305 минутиIP-адреса
dsar31 часIP-адреса
dsar_email324 часацелна адреса на е-пошта
dsar_global301 часцелиот сајт
gpc301 часIP-адреса
tcf_gvl101 час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_param400Невалиден параметар
owc_bad_categories400Објектот categories е неисправен, преголем или нескаларен
owc_bad_email400Невалидна адреса на е-пошта
owc_bad_dsar400Неисправно DSAR испраќање (вклучувајќи замка за ботови)
owc_dsar_not_attested400Недостига изјавата по чл. 12.6
owc_no_settings400Ниту еден познат клуч на поставка во телото
owc_missing_origin403Ниту потекло ниту токен: паднато затворено
owc_bad_origin403Пријавеното потекло не е хост на овој сајт — одговорот наведува до десет прифатени хостови
owc_bad_nonce403Невалиден nonce на /scanner/ingest
owc_jsonp_forbidden403Одбиена JSONP-форма на /nonce
owc_forbidden401/403Недоволно овластување
owc_dsar_disabled404Порталот за правата е исклучен на серверот
owc_no_template404Нема шаблон за овој тип и овој профил
owc_rate_limited429Достигнато ограничување на брзината
owc_consent_failed500Неуспех при примена на согласноста
owc_dsar_store_failed500Неуспех при запишување на барањето
owc_gen_failedпроменливОдбиено генерирање документ (полиња што недостигаат, јазична бариера)
owc_ledger_write_refused503Регистарот одбил да запише — ништо не е запишано, ништо не е одблокирано

Дневникот на одбивања

Последните дваесет одбивања на запис се чуваат и се прикажуваат на контролната табла — само ако дневникот не е празен. Таму се разликуваат две природи:

  • ставка со HTTP-статус е вистинско одбивање: ништо не е складирано и посетителот видел грешка;
  • ставка со статус 0 е предупредување: изборот навистина е запишан.

Панелот ги прикажува еден до друг хостот пријавен од потеклото и заглавјето Host на барањето. Тоа е токму она што се разликува кога вашите посетители се движат на еден хост додека WordPress е конфигуриран со друг — најчестата причина за согласност што „не се зачувува“.

Ограничувања на API-то

  1. /consent и /dsar прифаќаат анонимни записи по дизајн; заштитата е потеклото плус ограничувањето на брзината, не nonce.
  2. Ограничувачот на брзината паѓа отворено без кеш на објекти.
  3. Колачето за согласност е host-only: колаче поставено за apex е нечитливо од страница на www., и никакво CORS-заглавје не може да го поправи тоа. Лекот е URL за запишување со исто потекло.
  4. /scanner/ingest прифаќа само manage_options: сондата не може да дојде од посетител.
  5. /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_positionbottom-bar, bottom-card, center-modal, top-bar
banner_styleauto, light, dark
floating_button_positionbottom-left, bottom-right, top-left, top-right
floating_button_styleicon, pill
compliance_profile, geo_default_profilegdpr, ccpa, lgpd, popia, pipl, dpdp, quebec, uk_pecr, ch_nfadp, au, us_generic
ledger_hash_algosha256, sha3-256 (пресечени со тоа што PHP го поддржува)
scanner_frequencyhourly, twicedaily, daily, weekly
scanner_probe_modeadmins, off
legal_business_typeauto, vitrine, rental, ecommerce, services, saas, content
blocker_unknown_script_policy, blocker_unknown_iframe_policyallow, block

Граници на целите броеви

ПоставкаГраници
consent_renewal_months0 до 13 (0 се третира како 13)
dsar_response_days1 до 30
dsar_token_ttl_days1 до 90
ledger_retention_days0 до 3650 (0 = неограничено)
scanner_max_urls1 до 500
scanner_timeout1 до 60
legal_minor_age13 до 18
retention_form_data_days1 до 3650
retention_dsar_days1 до 3650
tcf_cmp_id0 до 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.
  • Сѐ останато: обичен текст.
  • Нескаларна вредност поднесена за скаларна поставка се игнорира, клучот не се запишува.

Каде се поставува што

КартичкаПоставки
Bannerbanner_*, text_*, floating_button_*, consent_renewal_months, consent_policy_hash_check
Compliancecompliance_profile, compliance_strict, gcm_*, blocker_*, ccpa_inject_footer, gpc_honor, tcf_*, geo_*, auto_footer_menu_inject, forms_integration_enabled, delete_data_on_uninstall, link_*
Legal identitylegal_*, retention_form_data_days, retention_dsar_days, policy_disclaimer
Categoriescat_*_available, cat_*_label, cat_*_desc
Audit ledgerledger_enabled, ledger_retention_days (алгоритмот е прикажан, но не и изменлив)
Scannerscanner_*
DSAR requestsdsar_*

Табели

ТабелаСодржина
{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_KEYHMAC клуч на регистарот, и изведен клуч на колачето за регионално откривање
OWC_TRUSTED_PROXY / OWC_TRUSTED_PROXIESCIDR распони на доверливите прокси-сервери; без нив, заглавјата со IP на клиентот се игнорираат
OWC_GEO_TRUSTED_HEADERScloudflare, 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_urlsURL-адреси за скенирање (потоа повторно ограничени на хостот на сајтот)
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 и целосен француски превод.

Потсетување на механизмот опишан погоре: сѐ додека една ознака или текст на банерот не е приспособен во поставките, тој го следи јазикот на сајтот. Штом ќе внесете своја сопствена вредност, таа се сервира таква каква што е, без оглед на јазикот на посетителот.

Телата на правните документи не поминуваат низ тој механизам: нивниот јазик ја следи јурисдикцијата, никогаш локалот на администраторот.


Решавање проблеми

Банерот не се прикажува

Поминете го списокот по редослед:

  1. Дали banner_enabled е вклучено? Ознаката на врвот од административниот екран го кажува тоа.
  2. Дали вашата тема ги повикува wp_head() и wp_footer()? Без нив, банерот одбива да се отпечати наместо да произведе инертен HTML.
  3. Дали посетителот веќе направил избор? Банерот се прикажува само на <html data-owc="none">. Тестирајте во приватно прелистување или со window.OWCBanner.reset().
  4. Дали посетителот има JavaScript? Без него, банерот останува скриен — намерно — и блокот <noscript> презема.
  5. Дали некој кеш на страници сервира верзија постара од активацијата? Испразнете го.

Банерот се враќа на секоја страница иако изборот е зачуван

Три причини, по редослед на честота.

  1. Посетениот хост се разликува од хостот конфигуриран во WordPress (www. наспроти apex, алијас, staging домен). Тогаш прелистувачот одбива да го зачува колачето додека WordPress одговара со 200. Отворете ја контролната табла: дневникот на одбивања ги прикажува еден до друг потеклото и заглавјето Host. Лекот е сајтот да се сервира на еден единствен канонски хост.
  2. consent_policy_hash_check е вклучено и вашите документи се сменија — тоа е саканото однесување, посетителот се прашува одново по измена на политиката.
  3. Сте на верзија постара од 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

Ограничувањата се намерно ниски кај јавните записи. Две причини:

  1. Непријавен CDN или прокси: сите ваши посетители пристигнуваат со иста адреса и делат ист буџет. Пријавете го со OWC_TRUSTED_PROXY во wp-config.php.
  2. Автоматизиран тест што праќа повеќе од 30 записи за 5 минути од иста адреса.

503 owc_ledger_write_refused

Регистарот одбил да запише, значи ништо не е зачувано и ниту еден следач не е ослободен. Тоа е саканото однесување: согласност што не може да се докаже не смее да се тврди.

  1. Проверете дали табелата {prefix}owc_ledger постои. Картичката Audit ledger прикажува читлива порака „сѐ уште не е инсталирано“ наместо бел екран.
  2. Проверете ги правата на запишување на MySQL корисникот.
  3. Како последно средство, привремено исклучете го ledger_enabled за да ја вратите услугата — знаејќи дека во тоа време го губите доказот.

Следачи сѐ уште се вчитуваат пред согласноста

  1. Дали compliance_strict е вклучено? Без него, се обработуваат само скриптите ставени во редица од WordPress.
  2. Дали следачот е во каталогот? Непозната скрипта од трета страна е дозволена по правило. Стартувајте скенирање и класифицирајте го наодот: тоа го запишува правилото за блокирање.
  3. Дали е внесен од JavaScript од прва страна? Динамичката заштита покрива само дваесет хостови. Додајте каталошко правило врз доменот на следачот.
  4. Дали е тоа колаче поставено преку заглавје Set-Cookie? Никакво блокирање кај клиентот не може да го задржи. Мора да се реши на изворот, на серверот.
  5. Ставете го blocker_unknown_script_policy на block — потоа внимателно тестирајте го сајтот, затоа што таа поставка блокира секоја непрепознаена трета страна.

Легитимна интеграција е блокирана

Додајте го нејзиниот хост во blocker_allowlist, по еден на ред, или преку филтерот owc_blocker_allowlist. Проверете го и blocker_unknown_iframe_policy: непознатите iframe-ови се блокирани по правило, тоа е најчестиот случај.

Ако интеграцијата треба да остане условена од согласноста, подобро класифицирајте ја во вистинската категорија: визуелната замена носи копче „Прифати …“ што ја одблокира со еден клик.

Скенерот не наоѓа ништо

  1. Дали е вклучен? Исклучен е по правило.
  2. Дали WP-Cron работи? Со DISABLE_WP_CRON и без системски cron, закажаното скенирање никогаш не тргнува. Стартувајте едно рачно за да проверите.
  3. Дали е можен HTTP loopback? HTTP-автентикација на staging или огнен ѕид го блокира скенирањето. Панелот за покриеност ја прикажува првата грешка.
  4. Серверското скенирање не извршува никаков JavaScript. Посетете страница од сајтот како најавен администратор за сондата да пријави што внесува менаџерот на ознаки.

Во секој случај, прочитајте го панелот „што навистина опфаќа ова скенирање“ пред да заклучите: тој го разликува „ништо не е најдено“ од „ништо не е прочитано“.

Генерирањето на документ е одбиено

Две можни причини, и пораката тоа го кажува:

  • Задолжителни полиња се празни — прикажан е список на клучевите што недостигаат. Дополнете ја картичката Legal identity.
  • Јазична бариера — барате правни информации или општи услови за јурисдикција во која не се зборува француски. Копчето е скриено во тој случај. Единствениот пат е да го обезбедите вашето сопствено тело преку филтерот owc_policy_template.

Е-пораката за потврда на DSAR не пристигнува

Речиси секогаш е испорачливоста, не приклучокот.

  1. Одговорот на API-то носи mail_sent: false кога испраќањето не успеало, а формуларот тогаш прикажува посебна порака што упатува кон адресата за контакт.
  2. Инсталирајте SMTP приклучок. PHP-функцијата mail() ја одбиваат повеќето приемни сервери.
  3. Проверете ги SPF, DKIM и DMARC на вашиот домен. Приклучокот никогаш не ја препишува адресата на испраќачот — тоа е она што би го скршило SPF — туку само поставува Reply-To.
  4. Проверете дали 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.

Сите посетители го добиваат конфигурираниот профил, и покрај регионалното откривање

  1. Дали geo_enabled е вклучено? Исклучено е по правило.
  2. Дали го пријавивте вашиот прокси? Без OWC_BEHIND_CLOUDFLARE, OWC_BEHIND_CLOUDFRONT или OWC_GEO_TRUSTED_HEADERS во wp-config.php, заглавјата за земја се игнорираат, затоа што може да се фалсификуваат.
  3. Дали датотеката на MaxMind е на место? Приклучокот не ја презема и не нуди екран за качување.
  4. Можеби е сосема нормално: првото прикажување кај посетител сервиран од кешот го користи конфигурираниот профил сѐ додека колачето со траење од 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“ пред бришењето.

Каде да се најде поддршка?