Data: 2025-02-22
- Problem:
sticky_phone_button_admin_scripts()sprawdzało$screen->id === 'toplevel_page_sticky-phone-button'. Strona jest dodawana przezadd_options_page()(podmenu Ustawienia), więc poprawny screen ID tosettings_page_sticky-phone-button. Skrypt admin-script.js nie ładował się na stronie ustawień. - Poprawka: Zmiana warunku na
settings_page_sticky-phone-button.
- Problem: Gdy
sticky_phone_button_scroll_trigger_valuenie istnieje w ustawieniach,parseInt(undefined, 10)dajeNaN;!valuejest wtedy true, więc uznawano „brak progu”. Lepiej jawnie sprawdzaćNaN. - Poprawka: Warunek zmieniony na
isNaN(value) || value <= 0.
- Problem: Dla
link_type === 'url'dohreftrafiała wartość z ustawień. Teoretycznie możliwa była wartość np.javascript:...lubdata:...(np. po ręcznej edycji w bazie). - Poprawka: W
buildHref()dla typuurlodrzucane są protokołyjavascript:idata:, dozwolone tylkohttp(s):lub względny URL z//; w razie niedozwolonej wartości ustawiane jest#.
- Cache wersji: W
wp_register_scriptiwp_register_styleużywane jesttime()jako wersja – przy każdym requestcie nowa wersja, brak cache przeglądarki. Na produkcji lepiej użyć np.STICKY_PHONE_BUTTON_VERSION(z głównego pliku wtyczki) lub hash pliku. - REST API: Endpoint
sticky-phone-button/v1/settingszwraca pełne ustawienia bez autoryzacji (permission_callback => '__return_true'). To celowe (front potrzebuje danych), ale upewnij się, że w ustawieniach nie przekazujesz wrażliwych danych. - Spójność tłumaczeń: Część opisów w adminie jest po angielsku (np. „Only on phones”), część po polsku w
esc_html__(). W razie planowanej lokalizacji warto scentralizować stringi i domenę.
- Nieużywana zmienna:
dayNameMappingw script.js jest zdefiniowane, ale nieużywane (używane sądayIndexToNameidayIndexToNamePL). Można je usunąć w ramach porządkowania. - Stałe magiczne: Wartości 100 ms (debounce scroll), 300 ms (opacity), 3000 ms (pulse) są na stałe w kodzie. Rozważ stałe na górze pliku (np.
SCROLL_DEBOUNCE_MS) dla czytelności i ewentualnej konfiguracji. - applyProfile a innerHTML: Tekst CTA jest ustawiany przez
ctaEl.innerHTML = ctaText. Treść pochodzi z serwera (sanitowana przezwp_kses). Dla pełnej ostrożności przy treściach z zewnątrz można rozważyć ustawianie tylko dozwolonych tagów lub textContent + proste formatowanie, ale przy obecnym modelu (tylko admin, wp_kses) ryzyko jest niskie.
- Testy: Brak zautomatyzowanych testów (PHP/JS). W razie rozbudowy wtyczki warto dodać np. proste testy dla
sanitize_settings,getVisibleProfileibuildHref. - Kompatybilność wsteczna: Zachowana – brak kluczy
alt_*w bazie = profil alt wyłączony, bez zmiany zachowania głównego przycisku.
- Naprawiono ładowanie admin-script.js (poprawny screen ID).
- Uodporniono checkScrollTrigger na brak/nieprawidłową wartość progu (NaN).
- Ograniczono ryzyko XSS w linku typu URL w JS (odrzucenie
javascript:/data:). - Reszta kodu jest spójna z założeniami wtyczki; powyższe zalecenia można wdrożyć stopniowo (cache wersji, stałe, usunięcie martwego kodu, testy).