--- phase: 01-rodo-cookie-consent plan: 01 subsystem: tracking tags: [gdpr, rodo, facebook-pixel, google-consent-mode, pixelyoursite, hfcm, wordpress] requires: [] provides: - Facebook Pixel zablokowany bez zgody marketingowej (fbq noop) - Google Consent Mode v2 early update dla powracających użytkowników - PixelYourSite granularne filtry GDPR (marketing/analytics) affects: [] tech-stack: added: [] patterns: - "wp_unslash() przed json_decode($_COOKIE) w WordPress — wp_magic_quotes() stosuje addslashes na cookies" - "fbq noop pattern — window.fbq = function(){} na wp_head priority 1 blokuje wszystkie źródła pixela" key-files: created: [] modified: - wp-content/themes/Divi/functions.php key-decisions: - "fbq noop zamiast remove_action — universalne, niezależne od źródła pixela" - "wp_unslash() wymagane przy odczycie $_COOKIE w WordPress 6.x" - "Divi/functions.php zamiast body-relax/functions.php — motyw aktywnie deploywany" patterns-established: - "Odczyt cookie w WordPress: wp_unslash() + urldecode() + json_decode()" duration: ~4h started: 2026-04-26T20:00:00Z completed: 2026-04-27T00:45:00Z --- # Phase 1 Plan 01: Google Consent Mode v2 + Facebook Pixel GDPR — Summary **fbq noop + PYS filtry + early consent update wdrożone w Divi/functions.php; Facebook Pixel nie odpala bez zgody marketingowej, Consent Mode v2 działa poprawnie dla nowych i powracających użytkowników.** ## Performance | Metric | Value | |--------|-------| | Duration | ~4h | | Started | 2026-04-26 | | Completed | 2026-04-27 | | Tasks | 2 auto + 1 checkpoint | | Files modified | 1 | ## Acceptance Criteria Results | Criterion | Status | Notes | |-----------|--------|-------| | AC-1: Powracający użytkownik — brak race condition | Pass | `szkolenia_consent_early_update` na wp_head priority 1, gtag update PRZED GTM | | AC-2: Granularna blokada PixelYourSite | Pass | `pys_disable_facebook_by_gdpr` → `facebook_disabled_by_api: true` w pysOptions | | AC-3: Kategorie zgody honorowane | Pass | fbq noop gdy brak "marketing", PYS filtry per-kategoria | | AC-4: Consent Mode v2 defaults nie naruszone | Pass | cookies.php w header.php linia 4 bez zmian | ## Accomplishments - Zablokowany Facebook Pixel we wszystkich 3 źródłach: HFCM (snippet w DB), PixelYourSite, woo-product-feed-pro - `gtag('consent', 'update')` emitowany server-side przed GTM dla powracających użytkowników (eliminacja race condition) - Odkryto i naprawiono: WordPress `wp_magic_quotes()` stosuje `addslashes()` na `$_COOKIE` — wymagane `wp_unslash()` ## Files Created/Modified | File | Change | Purpose | |------|--------|---------| | `wp-content/themes/Divi/functions.php` | Modified (dodano ~70 linii po 8883) | RODO: fbq noop + consent update + PYS filtry + woosea blokada | ## Decisions Made | Decision | Rationale | Impact | |----------|-----------|--------| | fbq noop zamiast remove_action | remove_action na HFCM statyczną metodę nie działał niezawodnie | Universalna blokada niezależna od źródła pixela | | Divi/functions.php (nie body-relax) | Pliki są deployowane przez FTP — Divi jest aktywnym tematem deploywanych plików | Kod działa na serwerze produkcyjnym | | wp_unslash() przy odczycie cookies | WP 6.x `wp_magic_quotes()` stosuje addslashes na $_COOKIE; json_decode na backslash-quoted JSON zwraca null | Poprawny odczyt kategorii zgody | ## Deviations from Plan ### Summary | Type | Count | Impact | |------|-------|--------| | Auto-fixed | 3 | Istotne — bez nich pixel nadal by odpalał | | Scope additions | 1 | Niezbędne odkrycie (wp_unslash) | | Deferred | 0 | — | ### Auto-fixed Issues **1. Zły plik docelowy** - **Found during:** Task 1 - **Issue:** Kod dodany do `body-relax/functions.php` zamiast `Divi/functions.php` - **Fix:** Przeniesienie kodu do `Divi/functions.php` - **Verification:** Kod działa na serwerze **2. Dodatkowe źródło fbq — woo-product-feed-pro** - **Found during:** Checkpoint verify - **Issue:** Plugin AdTribes ma własny pixel hooked do wp_footer bez consent check - **Fix:** Dodano `szkolenia_block_woosea_facebook_pixel` na wp_footer priority 1 - **Verification:** remove_action działa prawidłowo dla tej funkcji **3. Główne źródło fbq — HFCM (nie PYS)** - **Found during:** Debugowanie - **Issue:** Pixel w snippecie HFCM (DB) ignorował remove_action; WordPress addslashes na cookies łamał json_decode - **Fix:** fbq noop na wp_head priority 1 + wp_unslash() w szkolenia_cnp_has_preference - **Verification:** Playwright — fbqIsRealOrNoop=NOOP bez cookies, REAL z pełną zgodą ## Issues Encountered | Issue | Resolution | |-------|------------| | PYS `cookie_notice_integration_enabled: false` — brak integracji z Cookie Notice Pro (niestandardowy plugin) | PHP filtry `pys_disable_*_by_gdpr` zamiast natywnej integracji | | WordPress `wp_magic_quotes()` — `addslashes()` na `$_COOKIE` | `wp_unslash()` przed `json_decode()` | | HFCM `remove_action` nieskuteczny dla statycznej metody podczas wp_head | fbq noop — definicja window.fbq = function(){} przed wszystkimi skryptami | ## Next Phase Readiness **Ready:** - RODO compliance dla Facebook Pixel, GA, Bing Ads — wdrożone - Consent Mode v2 defaults + early update działają - Wzorzec odczytu cookies z wp_unslash() udokumentowany **Concerns:** - GTM container (tagi/triggery consent-aware) — nie skonfigurowane, poza scope planu - Testy na realnym urządzeniu z prawdziwym kliknięciem banera — niezrobione (plan zakłada checkpoint human-verify) **Blockers:** - Brak --- *Phase: 01-rodo-cookie-consent, Plan: 01* *Completed: 2026-04-27*