Repository navigation
Releases: lukasz-slusarski/notification-centre
Release list
v1.10.3
Pre-release: najpierw wdrożenie i sprawdzenie na wodadlafirmy.pl. Mechanizm aktualizacji (releases/latest) nie widzi pre-release.
Security
- Zarządzanie powiadomieniami domyślnie tylko dla administratora (
manage_options). Wcześniej każdy zedit_posts(np. Autor, Kierownik sklepu) mógł opublikować popup widoczny dla wszystkich, w trybie raw także z własnym CSS. Wszystkie uprawnienia typu wpisu mapują się na filtrnc_manage_capability; strony, gdzie powiadomieniami zarządzają redaktorzy, mogą go rozszerzyć (np.edit_others_posts). - Token GitHub nie trafia już do cache opcji
nc_all_options. Link w ustawieniach prowadzi do tokena „fine-grained” (tylko repozytorium wtyczki, Contents: Read-only) zamiast klasycznego tokena z dostępem do wszystkich repozytoriów.
Fixed
- Aktualizacje z GitHuba działają w tle: aktualizator jest rejestrowany także w WP-Cron i WP-CLI, nie tylko po wejściu do panelu. Wcześniej automatyczne aktualizacje i
wp plugin updatenie widziały nowych wersji.
Performance
- Paczka release zawiera zminifikowane pliki (
bin/build.sh, terser i csso):main.js105 KB → 40 KB (gzip 27 KB → 13 KB),style.css50 KB → 30 KB. Wtyczka ładuje*.min.*, gdy istnieją; kopia z gita działa na plikach źródłowych. Paczka nie zawiera już katalogutests.
🤖 Generated with Claude Code
v1.10.2
Pre-release: najpierw wdrożenie i sprawdzenie na wodadlafirmy.pl. Mechanizm aktualizacji (releases/latest) nie widzi pre-release.
Changed
- Ciasteczko klienta
nc_customertylko przy zgodzie Marketing w GetTerms (wcześniej Functional albo Marketing). Znacznik służy kierowaniu promocji, więc wymaga zgody marketingowej; przy jej braku lub cofnięciu ciasteczko jest usuwane.
Performance / Security
GET /nc/v1/notifications:pidz adresu jest brany pod uwagę tylko dla opublikowanego wpisu (boty z losowymi ID nie tworzą własnych wpisów cache). Odpowiedź dla gości maCache-Control: public, max-age(do 300 s i nie dłużej niż do najbliższej granicy harmonogramu), więc działa też bez LiteSpeed i w przeglądarce; odpowiedzi dla zalogowanychprivate, no-store.- Wyłączenie wtyczki zatrzymuje jej zadania cron;
uninstall.phpczyści teżnc_hourly_cache_purgei ma poprawnie escapowaneLIKE. - Nagłówki wtyczki:
Requires at least: 5.8,Requires PHP: 7.4.
🤖 Generated with Claude Code
v1.10.1
Pre-release: najpierw wdrożenie i sprawdzenie na wodadlafirmy.pl. Mechanizm aktualizacji (releases/latest) nie widzi pre-release.
Fixed
- Rotacja: zamknięty popup blokował całą grupę. Z grupy wybierany był popup „najdawniej pokazany”, zanim sprawdzono, czy w ogóle da się go pokazać. Klient, który zamknął Q4 (zamknięty na zawsze), po pierwszym Hydro nie dostawał już nic z grupy
promo-center. Teraz w losowaniu biorą udział tylko popupy, które można pokazać (nie zamknięte, w limicie wyświetleń, nie pokazane w tej wizycie, pasujące do urządzenia, przed godziną graniczną). Wspólny limit grupy bez zmian. - Zmiana ustawień wtyczki czyści cache stron (np. „Wyłącz pasek”, kolory, sticky są w HTML strony od 1.10). Jedno czyszczenie na zapis strony ustawień, tylko gdy coś się zmieniło.
- Autoukrycie licznika w popupie blokowało kolejkę popupów (ID jako tekst).
- Niepoprawna data licznika w pasku powodowała błąd krytyczny strony (PHP 8.3); teraz licznik jest pomijany.
- Skrypt przy pasku z serwera po usunięciu zamkniętego lub wygasłego slajdu aktywuje następny (zamiast pustego paska przy kilku paskach).
- Motywy bez Bricks: pasek „pod nagłówkiem” zostaje na ścieżce JS (w 1.10.0 stawał nad nagłówkiem).
Accessibility
- Szuflada powiadomień (dialog modalny z przyciskami) jest drukowana tylko na stronach z dzwonkiem
[notification_center]; wcześniej była ukrytym dialogiem na każdej stronie. - Popup na środku to dialog modalny:
role="dialog",aria-modal, nazwa z tytułu, fokus na „Zamknij” po pokazaniu, Tab w pętli, powrót fokusu po zamknięciu. Popupy w rogach mająrole="status"zamiastalert. - Krzyżyki mają
aria-label="Zamknij", popup z samym obrazkiem maaltz pola „Tekst alternatywny” obrazka w bibliotece mediów, a gdy puste, z tytułu (WCAG F89), pasek marole="region"zamiast drugiegobanner.
🤖 Generated with Claude Code
v1.10.0
Pre-release: najpierw wdrożenie i sprawdzenie na wodadlafirmy.pl. Mechanizm aktualizacji (releases/latest) nie widzi pre-release, więc inne strony nie dostaną tej wersji automatycznie.
Added
- Odbiorcy „Tylko klienci (z zamówieniem)”. Zalogowani z co najmniej jednym zamówieniem albo przeglądarki oznaczone po zakupie ciasteczkiem
nc_customer(strona podziękowania za zamówienie i zalogowany klient, tylko po zgodzie Functional albo Marketing w banerze GetTerms; przy cofnięciu zgody ciasteczko jest usuwane). O widoczności rozstrzyga przeglądarka, więc odpowiedź REST i strony zostają w cache. Skrypt znacznika jest dołączany tylko, gdy któreś opublikowane powiadomienie używa tej opcji. Honorowane jest też ciasteczkowdf_klientz mu-pluginuwdf-nc-customers-only.php, który ta funkcja zastępuje. - Grupa rotacyjna. Powiadomienia z tą samą nazwą grupy nie pokazują się jedno po drugim: z grupy wyświetla się najwyżej jedno (to, które najdawniej było pokazane), ze wspólnym limitem 3 wyświetleń na 7 dni i przerwą 24 h (filtr
nc_rotation_limits).
Performance
- Zero kodu wtyczki przy ładowaniu strony.
main.jsistyle.cssnie są już dołączane jako znaczniki. Mały skrypt w stopce (ok. 0,5 KB) doczytuje je przy pierwszym ruchu myszy, dotknięciu, klawiszu, kółku albo przewinięciu. PageSpeed Insights i roboty wyszukiwarek nie wchodzą w interakcję ze stroną, więc nie pobierają nic z wtyczki; zapytanie do REST też idzie dopiero po interakcji. W stronie zostają tylko danencData, zmienne CSS i (gdy jest) pasek z serwera ze stylami w linii. Licznik w pasku odlicza bezmain.js. Kliknięcie w dzwonek przed doczytaniem jest odtwarzane. - Popupy automatyczne nie psują już LCP. Popup z opóźnieniem, czasem na stronie, bezczynnością albo bez wyzwalacza pokazuje się dopiero po pierwszej interakcji (dotknięcie, klik, klawisz, kółko myszy). Wcześniej obraz popupu na środku ekranu stawał się największym elementem strony: na wpisie bloga WDF LCP 13,1 s zamiast 5,5 s. Popup pojawia się 0,8 s po tej interakcji, a nie w jej trakcie, żeby nie wyskoczył pod palcem i nie przejął tego samego kliknięcia. Exit intent i klik w selektor działają bez zmian.
- Pasek górny renderowany przez serwer (paski bez podziału na urządzenia, bez „tylko klienci” i grup rotacyjnych; paski z krzyżykiem też, a zamknięte wcześniej w tej przeglądarce skrypt przy pasku usuwa przed pierwszym renderem): stoi na miejscu od pierwszego wyrenderowania, więc treść nie skacze w dół (CLS). Na Bricks trafia od razu pod nagłówek (
bricks_after_header). Style paska są wstawiane w linii tylko na stronach z paskiem. Czas życia cache strony w LiteSpeed jest skracany do najbliższej granicy harmonogramu (np. 10:00), a skrypt w linii ukrywa pasek, którego godzina graniczna już minęła. - Fluent Forms tylko wtedy, gdy potrzebny. Pliki Fluent Forms nie są już dołączane do każdej strony;
main.jsdoczytuje je tuż przed pokazaniem popupu z formularzem. GET /nc/v1/notificationscache'owalne dla gości. Front wysyła klasę urządzenia (d) i wersję (v), usuwa z adresu identyfikatory reklam (gclid, fbclid, ...). Zdodpowiedź dla gości idzie do cache LiteSpeed (TTL do 5 min albo do najbliższej granicy harmonogramu); bezd(starymain.js) zostajeno-cache.- Zdarzenia analityki w paczce: jeden
POST /nc/v1/eventsna stronę (przy ukryciu karty, wyjściu albo po 10 s) zamiast osobnego zapytania na każde zdarzenie. Stary format pojedynczego zdarzenia nadal działa. - Koniec czyszczenia całego cache LiteSpeed przy każdym zapisie powiadomienia. Cache stron jest czyszczony tylko, gdy zmienia się coś, co jest w HTML: opublikowany pasek albo lista formularzy. Pasek z regułami „pokaż na stronie o ID” / „strona główna” czyści tylko te strony (tagi
Po.<ID>,F), pasek na całą stronę czyści całość. Edycja popupu, szkic i autozapis już nie czyszczą cache sklepu. GET /nc/v1/user-notificationstylko gdy powiadomienia WooCommerce są włączone (nc_woo_enabled).
Fixed
- Baner z licznikiem dziennym i autoukrywaniem („Zamów do 10:00”) był widoczny jeszcze kilka minut po godzinie granicznej, z licznikiem ustawionym na jutro (porównanie
>zamiast>=, transient na 5 min). Teraz znika dokładnie o tej godzinie. - Autoukrycie licznika usuwało cały pasek (razem z innymi paskami) albo zostawiało pustą nakładkę popupu i blokowało kolejkę. Teraz znika tylko ten jeden element, a popup zamyka się normalnie.
- Niepoprawny selektor w wyzwalaczu „klik” rzucał wyjątek przy każdym kliknięciu na stronie.
- Formularz z reCAPTCHA w popupie nie dawał się wysłać (
grecaptcha is not defined): Fluent Forms dołącza skrypt Google podczas renderowania formularza, a treść popupu powstaje w zapytaniu REST, gdzie ten skrypt nigdy nie trafiał na stronę. REST przekazuje teraz jego adres (scripts),main.jsładuje go przed pokazaniem popupu. Na WDF dotyczyło to popupu z ebookiem (formularz 24). - Kolumna „Odbiorcy” na liście powiadomień pokazywała surowe
guests. - Podgląd
?nc_preview=1znów działa (parametr przekazywany do REST, bez transientu i bez cache).
🤖 Generated with Claude Code
v1.9.3 - Priorytet paska górnego (Top Bar)
Added
- Priorytet paska górnego (Top Bar) - nowe pole „Priorytet" w sekcji Pasek na górze.
Gdy kilka pasków jest aktywnych w tym samym czasie, wtyczka nadal rotuje je w karuzeli, ale kolejność nie zależy już od daty publikacji: pasek z wyższym priorytetem renderowany jest jako pierwszy slajd - ten, który odwiedzający widzi zaraz po wejściu na stronę. Przy równym priorytecie obowiązuje dotychczasowa kolejność (przypięte, potem najnowsze).
Domyślna wartość 0 nie zmienia zachowania istniejących pasków.
v1.9.2
v1.9.1 - Fix: device targeting ignored real viewport width
Fixed
- Device targeting ('Tylko mobile (telefony + tablety)' / 'Tylko desktop') is evaluated server-side via
wp_is_mobile(), which reads the User-Agent header only and has no idea about the actual viewport width. A desktop browser in 'Request mobile site' mode, or with DevTools device emulation active, could send a mobile UA while the window was still full desktop width (e.g. 1920px) - so a mobile-only floating popup would still be shown. - Added an independent client-side guard in
main.js: a mobile/tablet-targeted notification now also requires the realwindow.innerWidthto be below 992px (desktop-targeted requires >= 992px), checked at the moment the popup is actually displayed - not just when the API response was fetched.
Found on wodadlafirmy.pl: the 'Promo PWA' popup (mobile-only) was appearing on a desktop-width window.
v1.9.0 - Sync with production (retroactive)
Retroactive tag: production (wodadlafirmy.pl) had been deployed via manual FTP past v1.6.3 (last release published here) up through v1.9.0, without those changes being committed here. This release brings the repo's history in line with what was actually running in production, before the v1.9.1 fix. See CHANGELOG.md for the 1.6.4-1.9.0 changes that were merged in.
v1.6.3 - debug logging
Temporary diagnostic logging.
v1.6.2 - Instant cache invalidation on save
Fixes edits taking up to 5 minutes to appear — see CHANGELOG.md.