Dokumentacja
M Cookie Consent
M Cookie Consent to baner zgód RODO dla WordPressa. Wtyczka całkowicie blokuje Google Analytics 4, Google Tag Manager, Meta Pixel oraz twoje własne skrypty w sekcji head, dopóki odwiedzający nie zgodzi się na odpowiednią kategorię. Google Consent Mode v2 działa tu bez usług zewnętrznych, bez konta i bez klucza API: decyzję podejmuje przeglądarka odwiedzającego, a wynik mieści się w jednym własnym ciasteczku (first-party), więc cache całych stron pozostaje nietknięty. Instrukcja jest napisana dla dwóch osób: administratora, który właśnie aktywował wtyczkę, i tego, kto musi odkręcić nieudaną zmianę. Każde zdanie sprawdzono w kodzie wersji 1.0.1.
Instalacja i co naprawdę robi aktywacja
Aktywacja tworzy dwie opcje: mcc_settings z ustawieniami domyślnymi oraz pusty mcc_consent_log, w którym od razu pojawia się jeden wpis „activated”. Użyta jest funkcja add_option, więc ponowna aktywacja witryny, która ma już zapisane ustawienia, niczego nie nadpisze. Odwiedzający nie widzą jeszcze niczego: dopóki nie ma żadnego identyfikatora śledzenia, na stronie publicznej nie pojawia się ani baner, ani inicjalizacja Consent Mode, ani pliki CSS i JavaScript. Wtyczka nie zakłada zadania cron, nie tworzy tabeli w bazie, nie rejestruje trasy REST i w żaden sposób nie dotyka wysyłki poczty.
- Zainstaluj plik ZIP przez Wtyczki → Dodaj nową wtyczkę → Wyślij wtyczkę na serwer albo skopiuj katalog m-cookie-consent do /wp-content/plugins/.
- Aktywuj wtyczkę. Nagłówek deklaruje minimum: WordPress 6.5 i PHP 7.4.
- Otwórz M Consent w bocznym menu administratora. Skrót Settings pojawia się też obok nazwy wtyczki na ekranie Wtyczki. Obie etykiety pochodzą z samej wtyczki, więc pozostaną angielskie, dopóki ktoś jej nie przetłumaczy.
- Tryb zgody: „Stay fully blocked” (pełna blokada), najbezpieczniejszy wariant, ustawiony od razu.
- Czas życia ciasteczka: 180 dni.
- Pływający przycisk ustawień: włączony.
- Wygląd: Modern, pływająca karta w lewym dolnym rogu.
- Kolor akcentu #6d5cf5, kolor tekstu #14171f.
- Kategoria własnego skryptu: Marketing.
- Wersja zgody: 1.
- W Ustawienia → Prywatność, w sekcji Policy Guide, pojawia się proponowany akapit do polityki prywatności.
- Dopóki nie wypełnisz żadnej integracji śledzącej, strona publiczna nie dostaje niczego.
Gdzie znajdują się ekrany wtyczki
Wtyczka dodaje jedną pozycję menu najwyższego poziomu, M Consent, z ikoną dashicon privacy, na pozycji 80, przez co ląduje nisko w menu, w okolicy Ustawień. Jedyna podpozycja nosi nazwę Settings i otwiera tę samą stronę, wp-admin/admin.php?page=m-cookie-consent. Menu, renderowanie strony oraz akcja ponownego pytania o zgodę wymagają uprawnienia manage_options, więc na zwykłej witrynie dociera do nich tylko administrator. Ekran dzieli się na dwie części: po lewej cztery sekcje ustawień, po prawej dwa panele, Live preview i Status & tools.
- Tracking integrations: pola GA4, Tag Manager, Meta Pixel i własnego skryptu.
- Consent behaviour: tryb zgody, czas życia ciasteczka, pływający przycisk, linki do polityk.
- Banner texts: siedemnaście opcjonalnych pól nadpisujących wbudowane teksty.
- Appearance: wygląd, układ, kolor akcentu, kolor tekstu.
- Live preview: miniatura banera odświeżana w trakcie pisania.
- Status & tools: lista aktywnych usług, bieżąca wersja zgody, „Preview on my site” i „Ask all visitors for consent again”. Panel pokazuje to, co zapisane, a nie to, co poprawne, więc nieużywalny identyfikator nadal figuruje tu jako aktywna usługa.
Integracje śledzące i co każda z nich odblokowuje
Wszystkie pola tej sekcji przychodzą puste. Wpisz tylko te usługi, z których naprawdę korzystasz: baner pokazuje dokładnie te kategorie, które wynikają z twojej konfiguracji, więc witryna z samym GA4 dostaje baner z dwiema kategoriami i niczym więcej. Każdy identyfikator jest sprawdzany przy zapisie i weryfikowany ponownie tuż przed wypisaniem na stronę.
- Google Analytics 4 ID. Domyślnie puste. Format: G- oraz od 4 do 20 liter lub cyfr; zapisywane wielkimi literami. Wypełnienie pola wstawia na baner kategorię Analytics, a tag rusza dopiero po zgodzie na nią.
- Google Tag Manager ID. Domyślnie puste. Format: GTM- oraz od 4 do 10 liter lub cyfr; zapisywane wielkimi literami. Wypełnienie tego pola wstawia na baner obie kategorie, Analytics i Marketing, bo zawartość kontenera jest nieznana. Sam znacznik kontenera dostaje obie kategorie, a skrypt ładuje go, gdy tylko jedna z nich zostanie przyznana. Odwiedzający, który zgodzi się wyłącznie na Analytics, i tak pobiera cały kontener, a znajdujące się w nim tagi reklamowe powstrzymują już tylko sygnały Consent Mode, nie ta wtyczka. Jeśli GA4 siedzi w kontenerze, pole GA4 zostaw puste.
- Meta Pixel ID. Domyślnie puste. Same cyfry, od 5 do 20. Rusza dopiero po zgodzie na Marketing. Celowo nie ma awaryjnej ramki noscript: odwiedzający bez JavaScriptu nigdy nie zobaczy banera, więc nigdy nie może wyrazić zgody.
- Custom tracking script. Domyślnie puste. Surowy kod HTML do sekcji head, razem ze znacznikami script. Zmienić go mogą wyłącznie konta z uprawnieniem unfiltered_html; dla pozostałych pole jest tylko do odczytu, a przesłana zmiana zostaje odrzucona komunikatem i wraca poprzedni skrypt. W trybie multisite to uprawnienie mają tylko super administratorzy. Zanim cokolwiek tu wkleisz, przeczytaj sekcję 8: blokada obejmuje mniej, niż sugeruje nazwa pola.
- Custom script category. Domyślnie Marketing. Do wyboru: Functional, Analytics i Marketing. Necessary celowo nie jest oferowane, żeby kod śledzący nigdy nie omijał zgody.
Nieprawidłowy identyfikator nie zostaje po prostu odrzucony, zostaje wyczyszczony: pole jest opróżniane, a u góry ekranu pojawia się błąd. Wklejony stary identyfikator UA-, identyfikator z przypadkową spacją albo Pixel ID z myślnikami po cichu wyłącza integrację, a razem z nią znika kategoria, którą wniosłaby na baner. Nic na ekranie później o tym nie przypomni, więc po każdym zapisie przeczytaj komunikaty i sprawdź, czy Status & tools nadal wymienia oczekiwaną usługę.
Zachowanie zgody (Consent behaviour)
Ta sekcja decyduje, jak ostro wstrzymywane są tagi Google, jak długo pamiętana jest decyzja i jak odwiedzający może ją wycofać. Dwa linki do polityk trafiają do stopki banera.
- Before consent, Google tags…: domyślne „Stay fully blocked (recommended)” nie wysyła do Google żadnego żądania przed zgodą. „Load with all consent signals denied (Advanced Consent Mode)” ładuje tagi Google od razu, bez ciasteczek, wysyłając anonimowe sygnały na potrzeby modelowania konwersji w Google.
- Remember the choice for: domyślnie 180 dni. Dopuszczalny zakres to od 30 do 730 dni, a wartość spoza niego jest przy zapisie sprowadzana do najbliższej granicy. Gdy zapisana decyzja jest starsza, odwiedzający zostaje zapytany ponownie.
- Floating settings button: domyślnie włączony. To wbudowany sposób, w jaki odwiedzający otwiera okno preferencji i wycofuje zgodę.
- Privacy policy link: domyślnie puste, wtedy baner korzysta ze strony ustawionej w Ustawienia → Prywatność.
- Cookie policy link: domyślnie puste. Link Cookie policy pojawia się w banerze tylko wtedy, gdy jest tu adres.
Teksty banera (Banner texts)
Wszystkie siedemnaście pól tekstowych przychodzi pustych, a puste pole oznacza, że w chwili renderowania używany jest wbudowany przetłumaczony tekst. Cokolwiek wpiszesz, zastępuje go od razu we wszystkich językach, więc na witrynie wielojęzycznej najrozsądniej nie wpisywać tu nic i przetłumaczyć samą wtyczkę. Domena tekstowa to m-cookie-consent, plik POT leży w katalogu /languages; wtyczka wielojęzyczna może też podpiąć się pod filtr mcc_get_text i przetłumaczyć zapisane przez ciebie wartości.
- Wbudowany nagłówek to „We value your privacy”. Wbudowana etykieta przycisku odmowy to „Only necessary”, mimo że samo pole ustawień nosi nazwę „Reject all” button.
- W komunikacie banera i w czterech opisach kategorii dozwolony jest ograniczony HTML: a z href, rel i target, a także br, em i strong. Pozostałe pola są sprowadzane do zwykłego tekstu.
- Liczniki znaków są wyłącznie doradcze, nic nie zostaje ucięte. Zalecane limity to 300 znaków dla komunikatu banera, 200 dla opisu kategorii, 25 dla przycisków i linków oraz 60 dla reszty pól.
- W oknie preferencji pojawiają się tylko kategorie wynikające z twoich integracji, więc teksty nieużywanych kategorii po prostu nigdy się nie wyświetlą.
Wygląd (Appearance)
Wygląd banera zależy od czterech ustawień. Oba próbniki kolorów zasilają zmienne CSS, zapisywane zarówno w bloku :root, jak i bezpośrednio na każdym elemencie banera, dzięki czemu nie usunie ich wtyczka optymalizująca CSS. Dwa jaśniejsze odcienie dla tekstu i linków są wyliczane z twojego koloru tekstu automatycznie.
- Design: domyślny jest Modern, wbudowana zaokrąglona karta z gradientem akcentu i ikoną ciasteczka. „Match my website theme” daje neutralny baner, który przejmuje font motywu i pozostaje wizualnie stonowany.
- Banner layout: domyślnie pływająca karta w lewym dolnym rogu. Pozostałe warianty to pasek na dole na całą szerokość oraz pływająca karta w prawym dolnym rogu.
- Accent colour: domyślnie #6d5cf5. Steruje przyciskiem głównym, ikoną, przełącznikami i pływającym przyciskiem.
- Text colour: domyślnie #14171f. Steruje nagłówkiem i tekstem zarówno w banerze, jak i w oknie preferencji.
Na biało wymuszona jest wyłącznie etykieta przycisku głównego, regułą #mcc-banner .mcc-btn--primary { color: #ffffff !important }. Tło banera też jest białe, więc jasny kolor akcentu czyni „Accept all” nieczytelnym. Pływający przycisk psuje się inaczej: jego biała ikona pochodzi z .mcc-reopen { color: #ffffff } bez !important, a w wyglądzie „Match my website theme” ta reguła zostaje nadpisana kolorem akcentu na białym kółku, więc jasny akcent kasuje ikonę całkowicie. Najgorzej kończy się jasny kolor tekstu: nagłówek, komunikat banera, tytuły i opisy kategorii oraz etykieta „Only necessary” są wymuszane z twojego koloru tekstu z !important, przez co naraz nieczytelny staje się cały baner i całe okno preferencji. Od wersji 1.0.1 te kolory zapisywane są także wprost na elementach, więc żaden motyw, cache ani optymalizator CSS nie naprawi złego wyboru. Sprawdź Live preview, potem prawdziwy baner przez „Preview on my site”. Drogę powrotną opisuje sekcja 9.
Pierwsza konfiguracja po kolei
Zrób to w tej kolejności, a niczego nie będziesz musiał powtarzać. Każda zmiana identyfikatora śledzenia, własnego skryptu, jego kategorii albo trybu zgody podnosi wersję zgody, więc jeden zbiorczy zapis kosztuje odwiedzających jedno pytanie zamiast pięciu.
- Wpisz tylko te identyfikatory, z których faktycznie korzystasz. Jeśli GA4 siedzi już w kontenerze Tag Managera, wpisz sam GTM ID, a pole GA4 zostaw puste.
- Jeśli wklejasz własny skrypt, wklejaj wyłącznie znaczniki script i nic więcej, a potem ustaw kategorię. Domyślne Marketing to bezpieczne założenie dla wszystkiego, co reklamowe. Co dzieje się ze wszystkim, co nie jest znacznikiem script, wyjaśnia sekcja 8.
- Zostaw „Before consent, Google tags…” na „Stay fully blocked (recommended)”.
- Ustaw link do polityki prywatności albo zostaw pole puste i skonfiguruj stronę w Ustawienia → Prywatność. Link Cookie policy dodaj tylko wtedy, gdy masz osobną stronę.
- Zostaw pływający przycisk ustawień włączony.
- Ustaw kolor akcentu i kolor tekstu, po czym sprawdź je w Live preview.
- Wszystkie pola Banner texts zostaw puste, chyba że prawnik powiedział inaczej.
- Zapisz i przeczytaj komunikaty u góry ekranu. Odrzucony identyfikator jest zgłaszany tylko tam.
- Sprawdź, czy Status & tools wymienia dokładnie te usługi, których się spodziewasz, i zapamiętaj wersję zgody.
- Wyczyść cache stron i CDN. Zrób to przed testem, nie po nim: stara strona z cache niesie starą wersję zgody i wynik testu cię okłamie.
- Otwórz „Preview on my site”, a potem przetestuj prawdziwy baner w oknie prywatnym: zaakceptuj, przeładuj, wycofaj pływającym przyciskiem, odrzuć, przeładuj. Na otwartej stronie wycofanie nie działa natychmiast: sygnał odmowy, fbq revoke i czyszczenie ciasteczek dostawców następują od razu, ale wstrzyknięte wcześniej skrypty GA4, GTM i Pixela działają dalej, dopóki nie przeładujesz strony. Oceniaj wynik po przeładowaniu.
- Umieść [m_cookie_settings] na stronie polityki prywatności lub cookies, żeby zgodę dało się wycofać spod stałego adresu.
Operacje ryzykowne i jak je odkręcić
Nic w tej wtyczce nie zablokuje ci dostępu do wp-admin, nie zatrzyma logowania, nie dotknie wp_mail ani nie utworzy zadania cron. Klasa strony publicznej powstaje wyłącznie wtedy, gdy żądanie nie jest żądaniem administracyjnym, a w całym kodzie nie ma integracji z logowaniem, pocztą, cronem ani REST. Może natomiast zepsuć publiczne strony, załadować zasoby stron trzecich, zanim ktokolwiek wyraził zgodę, uczynić baner bezużytecznym, unieważnić wszystkie zapisane zgody, nadpisać twoją konfigurację i zniszczyć dziennik rozliczalności. Przy każdym punkcie podana jest dokładna droga powrotna. Pierwsze cztery przeczytaj, zanim cokolwiek wkleisz do Custom tracking script.
- Custom tracking script: surowy kod w sekcji head każdej publicznej strony. Kod nie jest w żaden sposób sprawdzany. Błąd składni JavaScriptu niczego tu nie psuje, bo blok wypisywany jest jako type="text/plain", przed zgodą w ogóle nie jest parsowany, a po zgodzie trafia do własnego elementu script, więc wyjątek w nim nie sięgnie ani banner.js, ani twojego motywu. Prawdziwym zagrożeniem jest wadliwy HTML: niedomknięty znacznik albo niedomknięty komentarz połyka resztę sekcji head, a razem z nią całą stronę. Jak to naprawić: otwórz M Consent, wyczyść pole, zapisz i wyczyść cache. Jeśli twoje konto nie może edytować tego pola, to nie zadziała, zobacz czwarty punkt tej listy.
- Blokada obejmuje wyłącznie skrypty, obrazki i ramki iframe. Funkcja transform_gated_html() unieszkodliwia dokładnie dwie rzeczy: znaczniki script, których type jest pusty albo równy text/javascript, application/javascript lub module, oraz atrybut src w img i iframe. Cała reszta zostaje wypisana dokładnie tak, jak ją wpisałeś: link, style z zewnętrznym url(), object, embed, video, source, noscript oraz meta http-equiv="refresh". Arkusz stylów z zewnętrznego hosta fontów ładuje się więc przy pierwszym renderowaniu u każdego odwiedzającego, przed jakąkolwiek zgodą, i przekreśla cały sens wtyczki. Wklejony tu meta refresh przekierowuje każdą publiczną stronę witryny, choć wp-admin pozostaje dostępny. Jak to naprawić: wklejaj wyłącznie znaczniki script; jeśli już się stało, wyczyść pole jak wyżej albo użyj polecenia WP-CLI z sekcji 9, gdy strona publiczna już przekierowuje.
- Skrypt z nietypowym atrybutem type nie jest blokowany wcale. Mechanizm przepisywania działa tylko wtedy, gdy type jest pusty albo równy text/javascript, application/javascript lub module. Wszystko inne wraca nietknięte i bez znacznika blokady, więc wtyczka nie aktywuje takiego skryptu również po zgodzie. Jeśli przeglądarka mimo to uzna ten type za JavaScript, skrypt uruchomi się od razu i bez żadnej zgody; jeśli nie uzna, nie uruchomi się nigdy. Jak to naprawić: usuń atrybut type ze swojego fragmentu albo przenieś kod śledzący do właściwego pola integracji.
- Może się okazać, że własnego skryptu nie da się wyczyścić z ekranu ustawień w ogóle. Funkcja render_custom_script() oznacza pole jako readonly dla każdego bez uprawnienia unfiltered_html, a sanitize_custom_script() odrzuca przesłaną pustą wartość i z komunikatem przywraca poprzedni skrypt. Dotyczy to każdego administratora witryny w sieci multisite, który nie jest super administratorem, oraz każdej instalacji z define('DISALLOW_UNFILTERED_HTML', true), co wielu dostawców hostingu zarządzanego ustawia domyślnie. Zepsuty fragment zostaje wtedy w sekcji head każdej publicznej strony i nie ma z niego wyjścia przez interfejs. Jak to naprawić, w kolejności: uruchom wp option patch update mcc_settings custom_script '' (pod WP-CLI funkcja walidująca się nie ładuje); albo poproś super administratora, żeby wyczyścił pole; albo usuń stałą DISALLOW_UNFILTERED_HTML z wp-config.php i wyczyść je samodzielnie; albo dezaktywuj wtyczkę, co wycisza wyjście i zachowuje wszystkie ustawienia.
- Advanced Consent Mode wysyła dane do Google, zanim istnieje jakakolwiek zgoda. Wybór „Load with all consent signals denied” sprawia, że przeglądarka każdego odwiedzającego natychmiast pobiera tagi Google i wysyła sygnały w stanie odmowy. Kilka unijnych organów nadzorczych traktuje te sygnały jako przetwarzanie. Jak to naprawić: wróć do „Stay fully blocked (recommended)” i zapisz. To ustawienie jest powiązane ze zgodą, więc wersja zgody rośnie i wszyscy odwiedzający zostaną zapytani ponownie; wyczyść cache stron.
- Brak identyfikatora śledzenia oznacza brak banera w ogóle. Baner, inicjalizacja Consent Mode i pliki strony publicznej pojawiają się tylko wtedy, gdy w grze jest co najmniej jedna kategoria opcjonalna. Witryna, która ładuje GA4 z motywu albo Meta Pixel przez inną wtyczkę, nie pokaże banera i będzie śledzić wszystkich. Jak to naprawić: przenieś te kody do tej wtyczki. Filtr mcc_force_banner nie jest równoważnikiem: przestawia jedynie banner_enabled(), więc baner się pojawia, choć nie blokuje przy tym zupełnie niczego, bo wtyczka wstrzymuje tylko te tagi, które sama wypisuje. Wpisany w motyw gtag GA4 przytrzymują przynajmniej odmowne wartości domyślne Consent Mode, ustawiane w wp_head z priorytetem 0; Meta Pixel ładowany przez inną wtyczkę wysyła swoje PageView jeszcze przed jakąkolwiek decyzją i nie jest osłonięty niczym, bo fbq revoke uruchamia się dopiero po kliknięciu odwiedzającego. Filtru używaj tylko wtedy, gdy decyzję zbiera i ogłasza baner, a wykonuje ją twój własny kod nasłuchujący zdarzenia mcc:consent; przeniesienia kodów śledzących on nie zastąpi.
- Wyłączenie pływającego przycisku ustawień usuwa jedyny wbudowany sposób wycofania zgody, a zwykłe wyjście awaryjne może nie zadziałać. RODO wymaga, by wycofanie było tak samo łatwe jak wyrażenie zgody. Problem w tym, że [m_cookie_settings], #mcc-settings i window.mccShowSettings() opierają się na banner.js i na oknie preferencji, a żadne z nich nie jest wypisywane, dopóki w grze nie ma co najmniej jednej kategorii opcjonalnej. Na witrynie, z której narzędzia śledzące zostały później usunięte, shortcode renderuje przycisk, który nic nie robi. Jak to naprawić: włącz pływający przycisk z powrotem; a zanim go wyłączysz, upewnij się, że istnieje przynajmniej jedna integracja albo że filtr mcc_force_banner jest włączony.
- „Ask all visitors for consent again” nie da się cofnąć z ekranu ustawień. Przycisk zwiększa consent_version, co natychmiast unieważnia wszystkie ciasteczka zgody u odwiedzających. Funkcja walidująca nie pozwala tej liczby obniżyć: bierze większą z wartości zapisanej i przesłanej. Ten sam wzrost następuje automatycznie po każdej zmianie GA4 ID, GTM ID, Pixel ID, własnego skryptu, jego kategorii albo trybu zgody. Zanim odwiedzający wyrażą zgodę ponownie, w pomiarach powstanie luka. Jak to naprawić: wpisz niższą wartość consent_version wprost do opcji mcc_settings, tak jak pokazuje kolejna sekcja.
- Przefiltrowane ustawienia zapisuje do bazy na stałe każdy zapis na ekranie ustawień, a nie tylko przycisk „Ask all visitors for consent again”. Funkcja handle_force_reconsent() pobiera ustawienia przez MCC_Plugin::get_settings(), a te przeszły już przez publiczny filtr mcc_settings, i podaje tę tablicę do update_option(). Zwykłe Save Changes dochodzi do tego samego inną drogą: każde pole formularza jest wypełniane z tej samej przefiltrowanej tablicy, więc formularz odsyła wstrzyknięte wartości prosto z powrotem. Wszystko, co przez ten filtr wstrzyknie motyw, fragment kodu albo wtyczka wielojęzyczna, przechodzi przez walidację i zostaje zapisane na trwałe, po cichu zastępując twoją konfigurację: przetłumaczony w locie nagłówek banera staje się twoim stałym nagłówkiem banera, gdy tylko którykolwiek administrator cokolwiek zapisze. Jeśli wstrzyknięta wartość dotyka klucza powiązanego ze zgodą, rośnie też wersja, a przy przycisku ponownego pytania ten wzrost dochodzi do wzrostu od samego przycisku. Jak to naprawić: usuń filtr, a potem wpisz poprawne wartości na ekranie ustawień albo odtwórz mcc_settings z kopii zapasowej bazy.
- Podniesienie wersji zgody plus nieoczyszczony cache kosztuje odwiedzających dwa pytania, nie jedno. Wersja zostaje wypieczona w HTML-u trzymanym w cache, więc odwiedzający, którym podano stare strony, zapisują ciasteczka ze starą wersją. W chwili, gdy cache wreszcie zostanie wyczyszczony, ostre sprawdzenie wersji unieważnia je wszystkie i ci sami ludzie są pytani od nowa. Jak to naprawić: po fakcie nijak, więc cache stron i CDN czyść natychmiast po każdym zapisie, który podnosi wersję, a nie następnego ranka.
- Dziennik rozliczalności niszczy nie tylko Delete, ale i zwykłe używanie. Funkcja append_log() zostawia ostatnich 50 wpisów, a resztę odrzuca przy każdym zapisie. Intensywny tydzień zmian konfiguracji po cichu nadpisuje najstarsze rekordy, a w interfejsie nie ma żadnego przycisku eksportu. Jak to naprawić: nijak. Jeśli traktujesz mcc_consent_log jako dowód zgodności z RODO, kopiuj go regularnie poleceniem wp option get mcc_consent_log --format=json, a nie dopiero przed odinstalowaniem.
- Usunięcie wtyczki niszczy obie opcje. Dezaktywacja nie usuwa niczego, ale przycisk Usuń na ekranie Wtyczki uruchamia uninstall.php, który kasuje mcc_settings i mcc_consent_log. W trybie multisite skrypt przechodzi przez wszystkie witryny sieci i kasuje obie opcje w każdej z nich. Jak to naprawić: wyłącznie kopia zapasowa bazy danych.
- Jasny kolor tekstu albo akcentu czyni baner nieczytelnym dla każdego odwiedzającego. Ekran ustawień działa dalej, więc da się to naprawić, ale Live preview to jedyne miejsce, gdzie zauważysz problem wcześniej niż odwiedzający. Jak to naprawić: przywróć kolory w sekcji Appearance albo wpisz wartości fabryczne wprost do opcji, tak jak pokazuje kolejna sekcja.
Trzech rzeczy nie da się cofnąć z ekranu ustawień: podniesienia wersji zgody, wyczyszczenia własnego skryptu, którego twoje konto nie może edytować, oraz usunięcia wtyczki. Dwie niszczą dane wprost: Usuń, które w sieci multisite wymiata obie opcje ze wszystkich witryn, oraz sam limit 50 wpisów w dzienniku, który przy każdym zapisie po cichu odrzuca najstarsze rekordy. Zanim naciśniesz Usuń albo „Ask all visitors for consent again”, zrób kopię zapasową bazy. Reszta tej listy jest odwracalna, w większości z ekranu ustawień, a pozostała część z wiersza poleceń. Jeśli tylko szukasz przyczyny usterki, zamiast tego dezaktywuj wtyczkę albo zmień nazwę jej katalogu; oba warianty zostawiają wszystkie opcje nienaruszone.
Naprawa bez ekranu ustawień
Cały stan wtyczki mieści się w dwóch opcjach i jednym katalogu, więc zepsutą stronę publiczną zawsze da się naprawić z wiersza poleceń. Zanim zaczniesz pisać, zapamiętaj jedno: klasa ustawień powstaje tylko przy żądaniach administracyjnych, więc pod WP-CLI jej funkcja walidująca nigdy się nie rejestruje. Zapis przez wp option trafia do bazy dokładnie taki, jaki go wpiszesz: bez sprawdzania, bez przycinania zakresów, bez kontroli uprawnień do własnego skryptu i bez zabezpieczenia rosnącej wersji. To właśnie czyni z tego działające wyjście awaryjne. I to samo sprawia, że błędna wartość jest tu gorsza niż błędna wartość na ekranie: wpisz identyfikator, którego wtyczka nie potrafi użyć, starą własność UA- albo identyfikator ze spacją, a licznik kategorii nadal uzna usługę za czynną, Status & tools nadal ją wymieni, a etap wypisywania po cichu nie wypisze nic. Efekt: baner prosi odwiedzających o zgodę na narzędzie, którego nie ma, i na żadnym ekranie nie ma śladu błędu. Po każdej zmianie odczytaj opcję z powrotem.
- Najpierw zatrzymaj szkodę: dezaktywuj wtyczkę albo zmień nazwę jej katalogu, jeśli nawet WP-CLI jest niedostępne. Oba sposoby natychmiast wyciszają całe wyjście i niczego nie kasują.
- Jeśli winny jest tylko własny skrypt, wyczyść wyłącznie ten klucz, a resztę konfiguracji zostaw w spokoju. To także pierwsza droga, gdy twoje konto nie może edytować tego pola na ekranie ustawień; pozostałe trzy wylicza sekcja 8.
- Jeśli błędem był Advanced Consent Mode, przywróć consent_mode_style na basic.
- Jeśli wybór koloru uczynił baner nieczytelnym, wpisz z powrotem wartości fabryczne do text_color i accent_color.
- Jeśli przypadkiem podniosłeś wersję zgody, wpisz z powrotem poprzednią liczbę. Odwiedzający, których ciasteczko nadal ją zawiera, znów zostaną uznani.
- Po każdej pojedynczej zmianie odczytaj obie opcje i upewnij się, że zapisała się dokładnie tak, jak chciałeś. Nikt tych zapisów nie sprawdza i nikt nie zgłosi błędnego.
- Wyczyść cache stron i CDN, potem przeładuj publiczną witrynę w oknie prywatnym.
- Aktywuj wtyczkę ponownie albo przywróć nazwę katalogu. Zapisane ustawienia nadal tam są.
# Stop all plugin output, keep every setting
wp plugin deactivate m-cookie-consent
# No WP-CLI? Renaming the folder deactivates it just as well
mv wp-content/plugins/m-cookie-consent wp-content/plugins/m-cookie-consent.off
# Clear only the custom tracking script.
# This works even when the settings screen refuses: the readonly textarea and
# the unfiltered_html check live in the admin sanitizer, which is not loaded here.
wp option patch update mcc_settings custom_script ''
# Return to full prior blocking
wp option patch update mcc_settings consent_mode_style basic
# Put the shipped colours back when the banner became unreadable
wp option patch update mcc_settings text_color '#14171f'
wp option patch update mcc_settings accent_color '#6d5cf5'
# Put the consent version back down (bypasses the monotonic guard)
wp option patch update mcc_settings consent_version 3
# Read back what is stored, after EVERY patch above.
# Nothing here is validated, so this is the only place a mistake shows up.
wp option get mcc_settings --format=json
wp option get mcc_consent_log --format=json
Rozwiązywanie problemów
Najpierw zajrzyj do Status & tools: znajdziesz tam listę aktywnych usług i bieżącą wersję zgody, a te dwie rzeczy wyjaśniają większość niespodzianek. Pamiętaj, że panel pokazuje to, co zapisane, a nie to, co nadaje się do użytku, więc wymieniona tam usługa nie dowodzi jeszcze, że cokolwiek trafia na stronę.
- Na stronie publicznej nie ma banera, a Status & tools pokazuje „Active services: none”. Albo identyfikator został odrzucony przy zapisie, albo w ogóle go nie wpisano. Wpisz go ponownie i przeczytaj komunikat u góry ekranu.
- Status & tools wymienia usługę, ale w źródle strony nie ma po niej śladu. Zapisany identyfikator nie przechodzi walidacji, co zdarza się, gdy trafił tam przez WP-CLI albo został wstrzyknięty filtrem. Baner nadal prosi o zgodę na tę kategorię. Popraw identyfikator na ekranie ustawień.
- Baner się pokazuje, ale GA4 nigdy nie startuje. Sprawdź, czy zgoda na Analytics faktycznie została wyrażona, a potem poszukaj w źródle strony znacznika o id mcc-ga4-loader. W trybie pełnej blokady wychodzi on jako type="text/plain", a po zgodzie skrypt podmienia go na prawdziwy znacznik script.
- Załadował się cały kontener GTM, choć odwiedzający zgodził się tylko na Analytics. Tak to zaprojektowano: znacznik kontenera ma przypisane obie kategorie, analytics i marketing, a skrypt aktywuje element, gdy tylko jedna z wymienionych kategorii zostanie przyznana. Tagi reklamowe wewnątrz kontenera powstrzymują już tylko sygnały Consent Mode.
- Zaraz po wycofaniu zgody narzędzia śledzące nadal działają. To również działanie zamierzone i tylko do następnego załadowania strony: sygnał odmowy, fbq revoke i czyszczenie ciasteczek dostawców następują od razu, ale skryptów wstrzykniętych wcześniej do otwartej strony nikt nie usuwa. Sprawdzaj po przeładowaniu.
- Po aktualizacji widać stare teksty albo stare kolory. Oba pliki są wersjonowane przez MCC_VERSION, więc podbicie wersji je odświeża, ale cache stron albo CDN przed witryną i tak poda stary HTML. Wyczyść jedno i drugie.
- Wszyscy są pytani ponownie bez wyraźnego powodu. Każda zmiana identyfikatora śledzenia, własnego skryptu, jego kategorii albo trybu zgody podnosi wersję zgody; to samo robi przycisk ponownego pytania. Porównaj liczbę Consent version w panelu Status & tools z tym, czego się spodziewasz.
- Wszyscy są pytani dwa razy. Pierwszy raz zapytała stara strona z cache ze starą wersją, drugie pytanie wywołało czyszczenie cache, które unieważniło dopiero co zapisane ciasteczko. Następnym razem czyść cache od razu po zapisie.
- Pływający przycisk zasłania widget czatu. Jest przypięty w lewym dolnym rogu z z-index 99999. Albo go wyłącz i użyj [m_cookie_settings] lub linku do #mcc-settings, albo przestyluj .mcc-reopen w swoim motywie.
- Przycisk [m_cookie_settings] renderuje się, ale nic nie robi. banner.js i okno preferencji trafiają na stronę tylko wtedy, gdy w grze jest co najmniej jedna kategoria opcjonalna, więc na witrynie bez integracji shortcode jest martwy. Przywróć integrację albo włącz filtr mcc_force_banner.
- Własny skrypt nie uruchamia się nawet po zgodzie. Sprawdź jego atrybut type: wszystko poza pustym, text/javascript, application/javascript i module mechanizm blokujący całkowicie pomija, więc taki skrypt nigdy nie zostaje aktywowany.
Prywatność i dane
Wtyczka sama nie wysyła żadnych żądań na zewnątrz. Nie ma w niej sprawdzania licencji, statystyk użycia, pingu aktualizacji ani odpytywania GeoIP, a wszystkie jej pliki serwowane są z twojej własnej domeny. Jedyne żądania do stron trzecich to te, które sam skonfigurowałeś, i uruchamiają się dopiero po zgodzie, z wyjątkiem opisanym w sekcji 8: cokolwiek innego niż skrypt, obrazek albo iframe, wklejone do pola własnego skryptu, nie jest blokowane wcale.
- Na urządzeniu odwiedzającego powstaje jedno ciasteczko, mcc_consent. Zawiera obiekt JSON z wersją zgody, znacznikiem czasu w milisekundach i wybranymi kategoriami. Żadnego identyfikatora.
- Czas życia zależy od twojej wartości „Remember the choice for” w dniach. Ciasteczko jest ograniczone do ścieżki adresu witryny, oznaczone SameSite=Lax, a przy HTTPS także Secure.
- W bazie przechowywane są dwie opcje. mcc_settings trzyma twoją konfigurację. mcc_consent_log trzyma ostatnich 50 zdarzeń konfiguracyjnych, każde ze znacznikiem czasu UTC, wersją zgody i listą usług aktywnych w tamtym momencie. Żadna z nich nie zawiera niczego o konkretnym odwiedzającym. Limit 50 wpisów obowiązuje przy każdym zapisie, więc starsze zdarzenia przepadają bezpowrotnie.
- Po wycofaniu zgody na Analytics skrypt wygasza ciasteczka _ga, nazwy zaczynające się od _ga_, a także _gid i _gat. Wycofanie zgody Marketing robi to samo z _fbp i _fbc.
- Czyszczenie obejmuje zarówno sam host, jak i wszystkie domeny nadrzędne, więc odwiedzający, który kliknie „Only necessary” na shop.example.com, niszczy również ciasteczka _ga i _ga_ należące do www.example.com. Prawnie jest to nieszkodliwe, ale bywa niemiłą niespodzianką, gdy witryna nadrzędna należy do kogoś innego. Przewidź to, zanim wdrożysz baner na subdomenie wspólnej domeny.
- W Ustawienia → Prywatność, w sekcji Policy Guide, pojawia się opisujący to wszystko proponowany akapit, gotowy do przeklejenia do własnej polityki.
Shortcode, linki i haki dla programistów
Okno zgody można otworzyć z dowolnego miejsca w kodzie strony, a całe zachowanie wtyczki daje się filtrować. Przydaje się, gdy baner musi zmieścić się we własnej stopce albo gdy witryna korzysta z narzędzi śledzących, którymi ta wtyczka nie zarządza. Dwa z tych haków mają skutki, których nazwy nie zdradzają, więc przed użyciem przeczytaj dwa ostatnie punkty.
- [m_cookie_settings] renderuje przycisk otwierający okno preferencji. Przyjmuje opcjonalny atrybut text; bez niego użyje twojej etykiety „Choose individually”. Przycisk działa tylko dopóki w grze jest co najmniej jedna kategoria opcjonalna, bo inaczej banner.js i okno preferencji w ogóle nie trafiają na stronę.
- To samo okno otwiera każdy link z href="#mcc-settings" oraz każdy element z klasą mcc-open-settings. Działa też wywołanie window.mccShowSettings() z własnego kodu. Obowiązuje ten sam warunek.
- Dodanie ?mcc_preview=1 do dowolnego publicznego adresu wymusza pokazanie banera nawet przy ważnej zapisanej zgodzie. Nie ma tu żadnej kontroli uprawnień, więc z takiego linku skorzysta każdy, a pokazany baner jest w pełni żywy: każdy przycisk w nim przechodzi zwykłą ścieżkę decyzji i nadpisuje ciasteczko mcc_consent. Traktuj link podglądu jako sposób zmiany czyjejś zgody, a nie jako podgląd tylko do odczytu, i nikomu go nie rozdawaj. Strona PHP reaguje na dowolny parametr mcc_preview i włącza wyjście wtyczki; strona JavaScript sprawdza location.search niezakotwiczonym wzorcem /[?&]mcc_preview=1/, więc wymusza otwarcie banera dla każdej wartości mcc_preview zaczynającej się od 1, także dla 10, 1x i 1abc. Przycisk „Preview on my site” buduje link ze zwykłą wartością 1.
- Filtry PHP: mcc_settings, mcc_categories, mcc_active_categories, mcc_get_text, mcc_should_load, mcc_force_banner, mcc_template_path.
- Najostrożniej obchodź się z mcc_settings. Uruchamia się przy każdym odczycie ustawień: także w środku przycisku „Ask all visitors for consent again”, który zapisuje wynik z powrotem przez update_option, oraz przy odczytach wypełniających każde pole ekranu ustawień, więc zwykłe Save Changes odsyła wstrzyknięte wartości do opcji dokładnie tak samo. Wszystko, co wstrzyknie twój filtr, staje się więc trwałe, gdy tylko administrator cokolwiek zapisze, a nie dopiero po naciśnięciu tego przycisku. Jeśli musisz zmienić zapisany tekst w locie, użyj mcc_get_text: jego wynik nigdy nie wraca do bazy.
- JavaScript: po każdej decyzji na obiekcie document wywoływane jest zdarzenie mcc:consent typu CustomEvent z mapą kategorii w detail.consent, a do dataLayer trafia zdarzenie mcc_consent_update.
Odinstalowanie
Dezaktywacja zmienia wyłącznie to, co trafia na stronę: baner znika, fragmenty śledzące przestają być wypisywane, a wszystkie opcje zostają w bazie, więc ponowna aktywacja przywraca dokładnie tę samą konfigurację. Usunięcie wtyczki na ekranie Wtyczki to zupełnie inna operacja, bo uruchamia uninstall.php.
- Usuwane przy kasowaniu: opcja mcc_settings z całą twoją konfiguracją.
- Usuwane przy kasowaniu: opcja mcc_consent_log z zapisem rozliczalności.
- W trybie multisite uninstall.php przechodzi przez wszystkie witryny sieci i kasuje obie opcje w każdej z nich, nie tylko w tej, na którą patrzyłeś.
- Zostaje: ciasteczko mcc_consent, które jest już na urządzeniach odwiedzających. Serwer nie skasuje ciasteczka, którego przed chwilą sam nie ustawił, więc wygaśnie ono we własnym terminie.
- Zostaje: akapit przeniesiony z Policy Guide do twojej polityki prywatności.
- Zostaje: zapomniany w treści [m_cookie_settings], który od tej chwili wyświetli się jako zwykły tekst, oraz każdy kod motywu podpięty pod filtry wtyczki.
W interfejsie nie ma żadnego przycisku eksportu mcc_consent_log, a niszczy go nie tylko Usuń: dziennik trzyma wyłącznie ostatnich 50 wpisów i przy każdym zapisie odrzuca resztę, więc intensywny miesiąc kasuje własny początek. Jeśli traktujesz go jako dowód rozliczalności RODO, kopiuj go regularnie poleceniem wp option get mcc_consent_log --format=json, i jeszcze raz tuż przed naciśnięciem Usuń. Po uruchomieniu uninstall.php przywróci go już tylko kopia zapasowa bazy.
Automatyczne aktualizacje
Wtyczka sprawdza majevski.com pod kątem nowych wydań i proponuje je przez zwykły ekran aktualizacji WordPressa — ten sam komunikat, lista zmian i instalacja jednym kliknięciem jak przy każdej innej wtyczce. Sprawdzenia są buforowane, nigdy nie spowalniają strony i są odporne na awarie: jeśli majevski.com jest nieosiągalny, witryna po prostu działa dalej i próbuje później. Pakiet aktualizacji jest przyjmowany wyłącznie z majevski.com przez HTTPS, a starsza wersja nigdy nie jest proponowana. Wersje starsze niż 1.1.0 nie znają jeszcze kanału aktualizacji, więc nie widzą nowych wydań — zainstaluj raz ręcznie 1.1.0 lub nowszą, a każde kolejne wydanie przyjdzie samo.
Potrzebujesz czegoś podobnego?
Wszystko na tej stronie zaprojektowała, zbudowała i utrzymuje jedna osoba. Jeśli potrzebujesz tego samego dla swojej firmy, napisz, co masz na myśli.
Umów rozmowę otwiera się w nowej karcie