UX

Notification Centre

Wersja v1.10.4 · 16 października 2026

Dodaje centrum powiadomien do WordPressa z integracja OneSignal. Obsluguje segmentacje uzytkownikow i personalizowane notyfikacje push.

Changelog

v1.10.4 16 października 2026

Pre-release: wdrożone i sprawdzone na wodadlafirmy.pl (16.10.2026, Playwright desktop + iPhone 13). Mechanizm aktualizacji (releases/latest) nie widzi pre-release.


Fixed

  • Wyzwalacz „Kliknięcie” otwiera popup przy każdym kliknięciu. Wcześniej działał najwyżej raz na sesję karty, a po zamknięciu popupu blokował go też czas powtórzenia (puste = na zawsze), więc przycisk typu „Pobierz poradnik” po pierwszym zamknięciu przestawał działać, także po odświeżeniu strony. Kliknięcie to jawna prośba odwiedzającego, więc czas powtórzenia, zasada „raz na wizytę” i limit wyświetleń dotyczą teraz tylko wyzwalaczy automatycznych.
  • Kliknięcie przed doczytaniem main.js nie ginie (np. pierwsze dotknięcie przycisku na telefonie). Selektory kliknięć opublikowanych popupów są w ncData.clickSelectors (opcja nc_click_selectors, przeliczana przy zapisie powiadomienia), loader zapamiętuje takie kliknięcie i popup otwiera się po załadowaniu. Gdy na danej stronie żaden popup nie pasuje, zatrzymana kotwica jest wykonywana.
  • Kliknięcie w selektor będący kotwicą na tej samej stronie (href="#sekcja") otwiera popup zamiast przewijać; bez JS link nadal przewija do sekcji.

🤖 Generated with Claude Code

v1.10.3 24 września 2026

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 z edit_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 filtr nc_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 update nie widziały nowych wersji.

Performance

  • Paczka release zawiera zminifikowane pliki (bin/build.sh, terser i csso): main.js 105 KB → 40 KB (gzip 27 KB → 13 KB), style.css 50 KB → 30 KB. Wtyczka ładuje .min., gdy istnieją; kopia z gita działa na plikach źródłowych. Paczka nie zawiera już katalogu tests.

🤖 Generated with Claude Code


https://claude.ai/code/session_011rJBiJ9CraQ5QYwMbJqGL1


v1.10.2 24 września 2026

Pre-release: najpierw wdrożenie i sprawdzenie na wodadlafirmy.pl. Mechanizm aktualizacji (releases/latest) nie widzi pre-release.


Changed

  • Ciasteczko klienta nc_customer tylko 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: pid z adresu jest brany pod uwagę tylko dla opublikowanego wpisu (boty z losowymi ID nie tworzą własnych wpisów cache). Odpowiedź dla gości ma Cache-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 zalogowanych private, no-store.
  • Wyłączenie wtyczki zatrzymuje jej zadania cron; uninstall.php czyści też nc_hourly_cache_purge i ma poprawnie escapowane LIKE.
  • Nagłówki wtyczki: Requires at least: 5.8, Requires PHP: 7.4.

🤖 Generated with Claude Code


https://claude.ai/code/session_011rJBiJ9CraQ5QYwMbJqGL1


v1.10.1 24 września 2026

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" zamiast alert.
  • Krzyżyki mają aria-label="Zamknij", popup z samym obrazkiem ma alt z pola „Tekst alternatywny” obrazka w bibliotece mediów, a gdy puste, z tytułu (WCAG F89), pasek ma role="region" zamiast drugiego banner.

🤖 Generated with Claude Code


https://claude.ai/code/session_011rJBiJ9CraQ5QYwMbJqGL1


v1.10.0 24 września 2026

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ż ciasteczko wdf_klient z mu-pluginu wdf-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.js i style.css nie 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 dane ncData, zmienne CSS i (gdy jest) pasek z serwera ze stylami w linii. Licznik w pasku odlicza bez main.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.js doczytuje je tuż przed pokazaniem popupu z formularzem.
  • GET /nc/v1/notifications cache'owalne dla gości. Front wysyła klasę urządzenia (d) i wersję (v), usuwa z adresu identyfikatory reklam (gclid, fbclid, ...). Z d odpowiedź dla gości idzie do cache LiteSpeed (TTL do 5 min albo do najbliższej granicy harmonogramu); bez d (stary main.js) zostaje no-cache.
  • Zdarzenia analityki w paczce: jeden POST /nc/v1/events na 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., F), pasek na całą stronę czyści całość. Edycja popupu, szkic i autozapis już nie czyszczą cache sklepu.
  • GET /nc/v1/user-notifications tylko 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=1 znów działa (parametr przekazywany do REST, bez transientu i bez cache).

🤖 Generated with Claude Code


https://claude.ai/code/session_011rJBiJ9CraQ5QYwMbJqGL1