=== ROADKIT Rezerwacje ===
Contributors: lukaszczechowski
Tags: rezerwacje, booking, noclegi, domki, kalendarz
Requires at least: 5.8
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 2.3.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Rezerwacje noclegów z aplikacji ROADKIT na Twojej stronie: domki ze zdjęciami, kalendarz, cena i formularz.

== Description ==

Wtyczka to bramka między Twoją stroną WordPress a aplikacją ROADKIT (potrzebne jest konto firmy w ROADKIT).

Wszystkim zarządzasz w aplikacji ROADKIT, na telefonie albo komputerze: domki, zdjęcia, opisy, udogodnienia, ceny, sezony, dodatki, rezerwacje, logo i kolory. Strona pokazuje zmiany sama, bez wklejania kodu na nowo.

* Moduł rezerwacji w dwóch krokach: najpierw zwarta lista noclegów (kafelki ze zdjęciem i ceną), potem wybrany domek z galerią, opisem i udogodnieniami oraz kalendarz wolnych terminów, wycena i formularz rezerwacji.
* Wprost na stronie (zalecane, kroje i kolory z Twojego motywu) albo w ramce (awaryjnie).
* Blok Gutenberga "ROADKIT Rezerwacje" i shortcode `[roadkit_rezerwacje]` (działa w Elementorze, Divi i edytorze klasycznym). Dawne `[roadkit]`, `[roadkit_obiekty]` i `[roadkit_obiekt]` działają dalej.
* Wyszukiwarka terminów na stronę główną: blok "ROADKIT Wyszukiwarka" i shortcode `[roadkit_szukaj]` (przyjazd, wyjazd, osoby, przycisk Sprawdź terminy). Prowadzi na stronę rezerwacji z wybranymi datami.
* Tworzenie strony rezerwacji jednym kliknięciem.
* Skrypty ładują się tylko na stronach z modułem albo wyszukiwarką.
* Zabezpieczenie: rezerwacje wyświetlają się tylko na stronach dopuszczonych kluczem połączenia. Domena jest zgłaszana sama (codziennie i po zmianie adresu strony), w obu wersjach: z www i bez.
* Klucz bramki: wtyczka używa klucza tylko do odczytu nazwy i wyglądu firmy oraz zgłaszania domeny. Nie ma dostępu do rezerwacji ani danych gości.
* Test połączenia w ustawieniach i w Narzędzia, Kondycja witryny.
* Współpraca z wtyczkami cache (LiteSpeed Cache, WP Rocket, W3 Total Cache, WP Super Cache, Autoptimize, SiteGround Optimizer, Cloudflare): krótki czas cache strony rezerwacji, czyszczenie po zmianach, skrypty wyłączone z łączenia i opóźniania.
* Aktualizacje pojawiają się w Kokpicie jak w każdej wtyczce (także automatyczne), z kontrolą sumy SHA-256 paczki. Jest też przycisk Sprawdź aktualizację.

= Parametry w adresie strony rezerwacji =

Link do strony rezerwacji może od razu ustawić daty i liczbę osób, na przykład z kampanii, maila albo wyszukiwarki:

`https://twoja-strona.pl/rezerwacja/?od=2027-07-10&do=2027-07-14&osoby=4`

* `od` i `do`: daty przyjazdu i wyjazdu w formacie RRRR-MM-DD. Przeszłe, błędne albo odwrócone daty są pomijane.
* `osoby`: liczba osób (1 do 50, ograniczana do pojemności noclegu).
* `domek`: identyfikator noclegu (`?domek=UUID` albo `#domek=UUID`), otwiera od razu jego widok.

Daty są ustawiane po wczytaniu kalendarza i tylko wtedy, gdy termin jest wolny. Gdy jest zajęty albo za krótki, gość widzi krótką informację i wybiera inne daty.

= Zdarzenia dla analityki (GA4, Google Tag Manager) =

Wtyczka nie ładuje żadnych skryptów analitycznych i nie ustawia ciasteczek. Wysyła tylko zdarzenia, które możesz odebrać własnymi narzędziami (zgodnie z polityką cookies Twojej strony):

* `CustomEvent` na `window`: `roadkit:view_item_list`, `roadkit:view_item`, `roadkit:select_dates`, `roadkit:begin_checkout`, `roadkit:submit_request`, `roadkit:purchase_request`. W `event.detail`: `currency` (PLN), `items`, `item_id`, `item_name`, `price`, `value`, `checkin`, `checkout`, `nights`, `guests`. Bez danych osobowych gościa.
* Gdy na stronie jest `window.dataLayer` (GTM albo gtag), te same zdarzenia trafiają tam w formacie e-commerce GA4: `{ event: "view_item", ecommerce: { currency, value, items: [{ item_id, item_name, price, quantity }] } }`, poprzedzone `{ ecommerce: null }`.

= Dla integratorów (GA4 i GTM) =

1. W GTM utwórz reguły typu Zdarzenie niestandardowe dla nazw: view_item_list, view_item, select_dates, begin_checkout, submit_request, purchase_request.
2. Podłącz je do tagów zdarzeń GA4 z włączoną opcją Wysyłaj dane e-commerce (źródło: warstwa danych).
3. purchase_request oznacza wysłaną prośbę albo rezerwację, a nie płatność: w GA4 najlepiej mapować ją na generate_lead albo własną konwersję.
4. Przykład bez GTM: `window.addEventListener('roadkit:purchase_request', function (e) { console.log(e.detail.value); });`

Parametry `utm_source`, `utm_medium`, `utm_campaign`, `utm_term` i `utm_content` z adresu wejścia są zapamiętywane w sessionStorage przeglądarki (bez ciasteczek) i dołączane do rezerwacji, więc w aplikacji ROADKIT widać, skąd przyszedł gość.

= Zabezpieczenie formularza =

Gdy ROADKIT włączy Cloudflare Turnstile, panel sam doładuje skrypt https://challenges.cloudflare.com/turnstile/v0/api.js dopiero przy formularzu rezerwacji. Zwykle sprawdzenie jest niewidoczne. Warto dopisać Cloudflare do polityki prywatności strony.

== Installation ==

1. Wtyczki, Dodaj nową, Wyślij wtyczkę na serwer, wskaż plik ZIP i aktywuj wtyczkę.
2. W menu ROADKIT wklej klucz połączenia (z aplikacji ROADKIT: Więcej, Firma, Klucz wtyczki WordPress) i kliknij Połącz.
3. Wybierz stronę z rezerwacjami albo kliknij Utwórz stronę rezerwacji.
4. Dodaj tę stronę do menu witryny.

== Frequently Asked Questions ==

= Gdzie zmieniam zdjęcia, ceny i opisy domków? =
W aplikacji ROADKIT. Wtyczka niczego nie przechowuje w WordPressie poza kluczem i kilkoma ustawieniami wyglądu.

= Co z domkami dodanymi w wersji 1.6? =
Zostają w bazie jako "Stare strony domków" (menu ROADKIT). Goście ich nie widzą, a stare adresy prowadzą na stronę rezerwacji. Możesz je usunąć, kiedy chcesz. Wtyczka nie usuwa ich sama.

= Czy wtyczka zbiera dane odwiedzających? =
Nie. Formularz rezerwacji wysyła dane wprost do ROADKIT, który przetwarza je w imieniu Twojej firmy. Wtyczka zapisuje tylko własne ustawienia.

= Co zrobić, gdy wtyczka do przyspieszania strony blokuje moduł? =
Wtyczka sama dodaje wykluczenia. Jeśli to nie wystarcza, wyłącz odraczanie, opóźnianie i łączenie skryptów dla roadkit-booking.js i roadkit-rezerwacje/assets/native.js albo przełącz wygląd na W ramce. Test połączenia w ustawieniach pokazuje wykryte wtyczki i podpowiedzi.

= Goście widzą "Rezerwacja online jest chwilowo niedostępna" =
Najczęściej domena strony nie jest dopuszczona w ROADKIT (np. po przeniesieniu strony albo zmianie na www). Wtyczka zgłasza domenę sama, a zalogowany redaktor widzi na stronie rezerwacji przycisk Napraw. Możesz też kliknąć Zgłoś domenę ponownie w ustawieniach.

= Czy klucz połączenia jest bezpieczny? =
Klucz jest zapisany w osobnej opcji bazy (bez automatycznego ładowania), nie trafia do kodu strony i jest zakrywany w komunikatach. Klucz bramki nie daje dostępu do rezerwacji ani danych gości. Rozłącz i usunięcie wtyczki kasują go z bazy.

== Changelog ==

= 2.3.0 =
* Daty i liczba osób w adresie strony rezerwacji (?od=RRRR-MM-DD&do=RRRR-MM-DD&osoby=N, także z #domek=): panel ustawia je po wczytaniu kalendarza, tylko gdy termin jest wolny, a gdy jest zajęty, pokazuje krótką informację.
* Wyszukiwarka na stronę główną: shortcode [roadkit_szukaj] i blok ROADKIT Wyszukiwarka (przyjazd, wyjazd, osoby, Sprawdź terminy). Prowadzi na stronę rezerwacji z datami, bez wywołań API, natywne pola daty na telefonie, czcionka 16 px.
* Przyklejony pasek na telefonie w widoku domku: nazwa, cena od i Rezerwuj (przewija do kalendarza). Znika, gdy kalendarz jest widoczny i gdy gość pisze w formularzu, uwzględnia wcięcia ekranu iPhone i ograniczony ruch.
* Zdarzenia dla analityki bez własnego śledzenia: CustomEvent na window i dataLayer w formacie GA4 (view_item_list, view_item, select_dates, begin_checkout, submit_request, purchase_request). Parametry utm z adresu dołączane do rezerwacji (sessionStorage, bez ciasteczek).
* Cloudflare Turnstile w formularzu, gdy włączy go ROADKIT (skrypt doładowywany dopiero przy formularzu). Podpisany znacznik formularza z automatycznym odświeżeniem. Czytelne komunikaty przy limitach rezerwacji z telefonem do obiektu.
* Odnośniki kafelków zachowują parametry adresu (daty, utm, język).

= 2.2.0 =
* Bezpieczeństwo aktualizacji: nagłówek Update URI (wtyczka nie zostanie pomylona z inną z wordpress.org), paczka tylko z serwera ROADKIT po https i kontrola sumy SHA-256 z manifestu. Przy niezgodności aktualizacja jest przerywana. Działa przełącznik automatycznych aktualizacji i okno Zobacz szczegóły.
* Klucz połączenia: osobna opcja bez automatycznego ładowania (przenoszona sama z 2.1), pole hasła z przyciskiem Pokaż, zakrywanie w komunikatach, kasowanie przy Rozłącz i przy usuwaniu wtyczki. Ustawienia pokazują zakres klucza i ostrzegają, gdy klucz ma pełny dostęp zamiast klucza bramki.
* Domena zgłaszana sama: codziennie, po zmianie adresu witryny, przy wejściu w ustawienia i na stronę rezerwacji, zawsze z www i bez www. Czytelny stan w ustawieniach, a dla zalogowanego redaktora informacja z przyciskiem Napraw na stronie z modułem. Gość widzi uprzejmy komunikat.
* Cache stron: dane z aplikacji odświeżane co 5 minut (z kopią awaryjną), krótki czas cache strony rezerwacji w LiteSpeed, brak zapisu do cache przy braku danych, czyszczenie cache (LiteSpeed, WP Rocket, W3 Total Cache, WP Super Cache, Autoptimize, SiteGround, Cloudflare) po Odśwież dane, zmianie ustawień i zmianach w aplikacji. Więcej wykluczeń z optymalizacji skryptów.
* Test połączenia w ustawieniach oraz test i informacje w Kondycji witryny: klucz i zakres, serwer, dane noclegów, domena, skrypt panelu, strona rezerwacji, https, wtyczki cache, wersje PHP i WordPressa.
* Panel rezerwacji 1.3.0: kolor tekstu na przyciskach zawsze z kontrastem co najmniej 4,5:1 (WCAG), także dla kolorów z color-mix; wyraźny błąd kalendarza z przyciskiem Spróbuj ponownie zamiast kalendarza bez zajętych dni; zarezerwowana wysokość przy wejściu przez ?domek=; limit czasu połączeń.
* Tłumaczenia: plik languages/roadkit-rezerwacje.pot, teksty bloku i powiększenia zdjęć przez tłumaczenia.

= 2.1.1 =
* Krótsza lista noclegów na telefonie (kafelki poziome): miniatura z lewej, nazwa, liczba osób, cena i przycisk Wybierz, bez opisu i ikon udogodnień.

= 2.1.0 =
* Krótsza strona rezerwacji: wybór noclegu w dwóch krokach. Krok 1 to zwarta siatka kafelków (1 kolumna na telefonie, 2 na tablecie, 3 na komputerze) ze zdjęciem, nazwą, liczbą osób, krótkim opisem, kilkoma udogodnieniami i ceną od. Krok 2 to wybrany domek: galeria z powiększeniem, pełny opis, udogodnienia i panel z kalendarzem, wyceną i formularzem, od razu ustawiony na ten domek.
* Przycisk Wróć do wyboru domku, działający przycisk Wstecz przeglądarki i odnośniki do konkretnego domku (?domek=UUID oraz #domek=UUID).
* Zdjęcia galerii ładują się dopiero po wyborze domku, więc nawet przy kilkudziesięciu domkach strona wczytuje się szybko.
* Jeden domek (albo domek wskazany atrybutem unit): od razu krok 2, bez listy.
* Odporność na style motywu (np. YOOtheme), dostępność: obsługa klawiaturą, widoczny fokus, cele dotykowe 44 px, ograniczony ruch.

= 2.0.0 =
* Nowy model: aplikacja ROADKIT jest jedynym miejscem zarządzania domkami, zdjęciami, cenami, sezonami, dodatkami, rezerwacjami, logo i kolorami. Wtyczka jest tylko bramką na stronę.
* Jeden ekran ustawień w menu ROADKIT: klucz połączenia z przyciskiem Połącz (nazwa firmy z aplikacji), wybór strony z rezerwacjami, Utwórz stronę rezerwacji, wygląd (wprost na stronie albo w ramce, szerokość) i krótka instrukcja w trzech krokach.
* Moduł na stronie pobiera noclegi z aplikacji: karty ze zdjęciami, opisem, udogodnieniami i ceną od, a pod nimi kalendarz, wycena i formularz. Przycisk Sprawdź terminy zaznacza nocleg w kalendarzu.
* Usunięto: obiekty w WordPressie (typ wpisu i formularze), import z ROADKIT, ustawienia noclegów, SEO i dane lokalne, logo i kolor marki we wtyczce, listę i kalendarz rezerwacji w WordPressie, e-mail o rezerwacji z WordPressa i przycisk pływający.
* Przejście z 1.6: klucz, tryb wyświetlania i wygląd zostają, strona z modułem jest wykrywana sama. Dawne strony domków zostają w bazie (ukryte przed gośćmi, stare adresy przekierowują na stronę rezerwacji), a w panelu pojawia się jednorazowy komunikat z linkiem do nich.


= 1.6.0 =
* SEO stron obiektów: tytuł "Domek Aniela dla 9 osób w Ustrzykach Dolnych | Firma", unikalny opis meta 140-160 znaków (nazwa, liczba osób, układ z opisu, cena od, udogodnienia), obraz i opis Open Graph oraz Twitter. Działa z Yoast SEO (tylko gdy pola ręczne są puste) i bez niego (własny title, meta description i og:*).
* Nowa zakładka "SEO i dane lokalne": dane firmy (adres, telefon, współrzędne, godziny, zakres cen, profile) i dane strukturalne LodgingBusiness na stronie głównej i stronie "Nasze domki" (dołączane do grafu Yoast albo osobny skrypt JSON-LD).
* Lista kontrolna SEO w ustawieniach (tylko odczyt): H1 strony głównej, opisy meta obiektów, linki z menu i treści, obrazy bez alt, Yoast, mapa strony.
* Pomocnik REST: pola Yoast (tytuł, opis, słowo kluczowe, tytuł i opis Open Graph) dla stron, wpisów i obiektów, zapis i odczyt tylko dla osób z prawem edycji.
* Tryb natywny: lista [roadkit_obiekty] z nagłówkami h2 (atrybut naglowek="h3" zmienia poziom), linki "Domek Aniela, 9 osób", teksty alt zdjęć, pierwsze zdjęcie eager, reszta lazy, wymiary obrazów.
* Zdjęcia obiektu: jedna lista, pierwsze zdjęcie jest główne, przycisk "Ustaw jako główne" i przeciąganie zdjęć.
* Logo strony WordPress (logo motywu, a potem ikona witryny) jest podpowiedzią w polu Logo (przycisk "Użyj logo mojej strony") i trafia do ROADKIT jako ikona aplikacji, logo formularza i strony statusu. Wysyłka tylko gdy w ROADKIT nie ma logo albo gdy zmienisz pole w ustawieniach wtyczki (logo wgrane w aplikacji nie jest nadpisywane). Sprawdzamy https, format PNG, JPG lub WebP (SVG pomijamy) i minimum 128 px.
* Aktualizacje: informacja o nowej wersji jest buforowana 1 godzinę (po błędzie sieci 10 minut) i czyszczona przy wymuszonym sprawdzeniu (ekran Aktualizacje, Sprawdź ponownie, aktywacja). W ustawieniach przycisk "Sprawdź aktualizację" z datą ostatniego sprawdzenia.

= 1.5.0 =
* Edycja obiektu zaczyna od aktualnych danych z ROADKIT, więc zapis ze starej kopii nie nadpisze zmian wykonanych gdzie indziej. Gdy połączenie zawiedzie, zostają dane z WordPressa i jedno zdanie komunikatu.
* Włączenie i wyłączenie obiektu w ROADKIT (np. z aplikacji na telefonie) nie jest już cofane zwykłym zapisem obiektu w WordPressie.
* Obiekty zarządzane w WordPressie są w panelu i w aplikacji ROADKIT tylko do odczytu, z linkiem "Edytuj w WordPressie". Witryna zgłasza w tym celu swój adres przy rejestracji.

= 1.4.0 =
* Ustawienia noclegów: sezon firmy (od, do, powtarzany co roku) oraz minimalna liczba dób w sezonie i poza sezonem, jedno ustawienie dla wszystkich obiektów.
* Ceny sezonowe obiektu: opcja Użyj sezonu firmy, dzięki której cennik zmienia się razem z sezonem firmy.
* Strona obiektu w trybie natywnym: w Zasadach pobytu widać minimalny pobyt w sezonie i poza sezonem.
* Kalendarz rezerwacji pokazuje minimalny pobyt zależny od dnia przyjazdu.

= 1.3.2 =
* Strona obiektu w trybie natywnym: bez dopisku motywu o autorze i dacie.

= 1.3.1 =
* Strona obiektu w trybie natywnym: motyw nie powtarza już zdjęcia wyróżniającego nad galerią.

= 1.3.0 =
* Tryb wyświetlania w ustawieniach: Osadzony (iframe, domyślny) albo Natywny (bez ramki).
* Natywnie: panel rezerwacji noclegów montowany wprost w stronie (kalendarz z cenami, wycena na żywo, dodatki, formularz ze zgodami, płatność online), bez iframe i bez wewnętrznego przewijania.
* Natywnie: shortcode [roadkit_obiekty] (lista kart: kolumny, kolejność, filtr osób) i [roadkit_obiekt], automatyczny szablon strony obiektu z galerią, udogodnieniami, cennikiem, dodatkami, zasadami pobytu i mikrodanymi schema.org.
* Atrybuty render="native" i unit w shortcode oraz pole w bloku; wykluczenia z optymalizacji (LiteSpeed, WP Rocket, Autoptimize).

= 1.2.0 =
* Edycja obiektu: cennik zależny od liczby osób, dzieci do lat N gratis, ceny sezonowe (także co roku), dodatki płatne.
* Import obiektów z ROADKIT do WordPressa (z powiązaniem bez duplikatów).
* Zakładka Ustawienia noclegów i status płatności online.
* Menu Rezerwacje ROADKIT: lista, szczegóły, decyzje, wpłaty, rezerwacje ręczne, kalendarz, blokady, powiadomienie e-mail.
* Kolor marki, logo oraz szerokość, wyrównanie, tło i minimalna wysokość formularza (ustawienia, blok i shortcode).

= 1.1.0 =
* Klucz połączenia: automatyczna rejestracja witryny jako dozwolonej strony.
* Obiekty ROADKIT: dodawanie i zmiany obiektów w WordPressie synchronizują się z ROADKIT (dane, zdjęcia, wyłączenie po usunięciu).

= 1.0.0 =
* Pierwsza wersja.
