Źródło: https://wpinplate.com/dokumentacja/informacje-techniczne/

# Informacje techniczne dla wdrożeniowców

Ten rozdział jest dla agencji, freelancerów i administratorów, którzy wdrażają WP InPlate na stronie klienta.

## Zgodność

- WordPress 6.4+, PHP 8.1+, WooCommerce 8.0+ (testowane do 11.2).
- Zgodność z **HPOS** (WooCommerce High-Performance Order Storage) jest zadeklarowana.
- Elementy na stronie to bloki Gutenberga i shortcode'y – działają w dowolnym motywie zgodnym z WordPressem.
- Niestandardowy adres logowania (np. WPS Hide Login) jest obsługiwany przez ekran startowy i aplikacje zespołu.

## Adresy aplikacji

WP InPlate rejestruje własne adresy (reguły przepisywania WordPress):

| Adres | Aplikacja |
|---|---|
| `/wp-inplate/start/` | Ekran startowy zespołu |
| `/wp-inplate/kds/` | KDS |
| `/wp-inplate/courier/` | Aplikacja kuriera |
| `/wp-inplate/radio/` | Radio |
| `/wp-inplate/tv/` | Launcher TV |
| `/wp-inplate/tv/{slug}/` | Ekran TV |
| `/wp-inplate/tv-manager/` | TV Manager |
| `/wp-inplate/table/{token}/` | Link z kodu QR stolika (przekierowanie na stronę stolikową) |

Każda instalowalna aplikacja ma manifest generowany przez wtyczkę (nazwa z nazwy strony i **Ustawienia → System → Aplikacje na telefon i tablet**) oraz service worker:

| Adres | Plik |
|---|---|
| `/wp-inplate/kds-manifest.webmanifest`, `/wp-inplate/kds-sw.js` | Manifest i service worker KDS |
| `/wp-inplate/courier-manifest.webmanifest`, `/wp-inplate/courier-sw.js` | Manifest i service worker aplikacji kuriera |
| `/wp-inplate/radio-manifest.webmanifest`, `/wp-inplate/radio-sw.js` | Manifest i service worker Radia |

Wszystkie adresy liczone są od adresu strony, więc WordPress w podkatalogu (np. `example.com/sklep/`) działa tak samo: KDS jest pod `/sklep/wp-inplate/kds/`. Serwer nie może obsługiwać rozszerzeń `.webmanifest` i `.js` w `/wp-inplate/` jako plików statycznych – te żądania muszą trafić do WordPressa.

Jeśli po instalacji adresy zwracają błąd 404, zapisz ponownie ustawienia bezpośrednich odnośników (**Ustawienia → Bezpośrednie odnośniki → Zapisz zmiany**).

REST API wtyczki działa w przestrzeni nazw `wp-inplate/v1` (`/wp-json/wp-inplate/v1/…`).

[Wstrzymanie zamówień](/dokumentacja/panel-managera/#wstrzymanie-zamówień) jest zapisane w osobnej opcji `wp_inplate_ordering_pause`, a nie w ustawieniach, więc zapis ustawień ani harmonogramu nigdy go nie cofnie. Endpoint `/wp-json/wp-inplate/v1/ordering-pause` (GET – osoby z dostępem do KDS, POST i DELETE – uprawnienie `inplate_pause_orders` albo `manage_woocommerce`). Wstrzymanie z czasem kończy się przy pierwszym odczycie po upływie czasu, bez crona.

## Cache

Wyklucz z pełnego buforowania stron (wtyczki cache, cache serwera, CDN):

- stronę menu, stronę zamówienia i stronę zamawiania do stolika,
- wszystkie adresy `/wp-inplate/…`,
- REST API `/wp-json/wp-inplate/…`.

Buforowanie tych adresów jest najczęstszą przyczyną nieaktualnego menu i problemów przy pierwszym zamówieniu testowym.

## HTTPS i serwer

- HTTPS jest wymagany do instalacji aplikacji (PWA) i powiadomień push.
- Powiadomienia push wymagają rozszerzenia PHP OpenSSL.
- Mapy i geokodowanie korzystają z OpenStreetMap (kafelki mapy i Nominatim) – serwer i przeglądarka administratora muszą mieć dostęp do `openstreetmap.org`.
- Zadania czasowe (np. włączanie dań InPlate o północy, przywracanie dań wyłączonych „tylko na dziś”) korzystają z WP-Cron. Na stronach z małym ruchem rozważ systemowy cron wywołujący `wp-cron.php`.

## Statusy zamówień

| Status KDS | Status WooCommerce |
|---|---|
| Nowe, W przygotowaniu, Gotowe | bez zmian (status ustala płatność, np. „W trakcie realizacji” albo „Wstrzymane”) |
| W drodze | `wc-in-transit` – status dodany przez WP InPlate (tylko dostawa) |
| Dostarczone | `completed` |
| Anulowane | `cancelled` |

Status kuchni, sposób realizacji, termin, stolik i przypisanie są zapisane w danych zamówienia.

## Metody płatności i wysyłki

| Identyfikator | Nazwa |
|---|---|
| `wpi_cash_pickup` | InPlate \| Zapłać przy kasie (odbiór i posiłek na miejscu) |
| `wpi_cash_delivery` | InPlate \| Zapłać kurierowi (dostawa) |
| `wpi_cash_table` | InPlate \| Zapłać przy stoliku (stolik QR) |
| `wp_inplate_shipping` | Metoda wysyłki „InPlate – Dostawa / Odbiór” (adres odbioru w e-mailu) |

Serwer odrzuca zamówienie z metodą płatności niepasującą do sposobu realizacji.

[Opłata za opakowanie](/dokumentacja/ustawienia/#opłata-za-opakowanie) to pozycja opłaty WooCommerce (`WC_Order_Item_Fee`) z metadanymi `_wpi_packaging_fee` (sposób realizacji) i `_wpi_packaging_gross` (kwota brutto). WooCommerce zapisuje opłatę netto i podatek osobno; WP InPlate ustawia podatek zawarty w kwocie brutto, więc klient płaci dokładnie kwotę z ustawień, a wiersze VAT zamówienia się zgadzają.

## Typy treści i tabele

- Ekrany TV to typ wpisu `inplate_display`, edytowany w Gutenbergu.
- Uprawnienia pracowników to uprawnienia WordPressa (capabilities) z przedrostkiem `inplate_` (np. `inplate_kds_access`), a rola pracownika to `inplate_operator`.
- WP InPlate tworzy własne tabele w bazie: dania InPlate, strefy dostawy, przypisania zamówień, historia statusów, szablony dodatków, szablony cross-sell i stoliki QR.

## Dane klientów

- **Kody logowania** – w bazie tylko ich skrót (HMAC), nigdy sam kod. Wygasają po 10 minutach, działają raz.
- **Zgody** – przy koncie (meta użytkownika `_inplate_consents`) i przy zamówieniu (meta zamówienia `_inplate_consents`): identyfikator, wersja, treść, data, źródło.
- **Adresy dostawy** – meta użytkownika `_inplate_addresses` (do 10 adresów: nazwa, miasto, ulica, numer, lokal, wskazówki dla kuriera, współrzędne) i `_inplate_default_address`. Adresy rozliczeniowy i do wysyłki WooCommerce (**Moje konto → Adresy**) nie są zmieniane – to dane klienta, np. do faktur. Każde zamówienie ma własny adres dostawy. Współrzędne są ustalane raz przy zapisie (OpenStreetMap), strefy – przy każdym zamówieniu.
- **NIP** – jedno pole dodane do adresu rozliczeniowego WooCommerce (**Moje konto → Adresy**), meta użytkownika `billing_inplate_nip`. Formularze adresów poza tym są w pełni WooCommerce – InPlate niczego w nich nie ukrywa ani nie zmienia.
- **Eksport i usuwanie** – **Narzędzia → Eksportuj dane osobowe / Usuń dane osobowe** obejmują zgody i adresy dostawy zapisane przy koncie.

## Wygląd „Mojego konta”

Gdy w **Ustawienia → Konta klientów** włączony jest **Wygląd „Mojego konta” w stylu InPlate**, strony **Mojego konta** WooCommerce dostają klasę `wpi-account` na `<body>` i arkusz `account-look.css`. Reguły działają tylko na stronach konta i wygrywają z motywem, więc wygląd jest taki sam na każdej stronie.

Kolory, zaokrąglenia i odstępy zmienisz zmiennymi CSS – bez walki o specyficzność. Wpisz je w arkuszu motywu albo w **Wygląd → Dostosuj → Dodatkowy CSS**:

```css
body.wpi-account {
	--wpi-account-accent: #e63946;      /* przyciski, aktywna pozycja menu */
	--wpi-account-accent-hover: #c1121f;
	--wpi-account-radius: 4px;
	--wpi-account-font: "Inter", sans-serif;
}
```

| Zmienna | Domyślnie | Zastosowanie |
|---|---|---|
| `--wpi-account-accent` | `--wpif-primary` | Przyciski, aktywna pozycja menu, obramowanie pola w trakcie edycji |
| `--wpi-account-accent-hover` | `--wpif-primary-hover` | Przycisk po najechaniu |
| `--wpi-account-accent-text` | biały | Tekst na przyciskach |
| `--wpi-account-accent-soft` | `--wpif-primary-light` | Tło aktywnej pozycji menu, poświata pola |
| `--wpi-account-surface` | `--wpif-surface` | Tło kart |
| `--wpi-account-soft` | `--wpif-surface-2` | Tła pomocnicze (nagłówki tabel, najechanie) |
| `--wpi-account-border` | `--wpif-border` | Obramowania |
| `--wpi-account-text` | `--wpif-text` | Tekst |
| `--wpi-account-muted` | `--wpif-text-2` | Tekst pomocniczy, ikony |
| `--wpi-account-radius` | `--wpif-radius-lg` | Zaokrąglenie kart |
| `--wpi-account-radius-sm` | `--wpif-radius` | Zaokrąglenie przycisków i pól |
| `--wpi-account-nav-width` | `250px` | Szerokość menu na komputerze |
| `--wpi-account-gap` | `28px` | Odstęp menu od treści |
| `--wpi-account-font` | `inherit` (font motywu) | Krój pisma |

Wartości domyślne pochodzą z tokenów InPlate (`--wpif-*`), więc strona, która już zmieniła kolory InPlate, ma je też w **Moim koncie**. Głębsze zmiany: wyłącz wygląd InPlate (ustawienie albo filtr `wp_inplate_account_styles`) i wystyluj konto w motywie.

## Haki dla programistów

### Filtry

| Filtr | Argumenty | Zastosowanie |
|---|---|---|
| `wp_inplate_method_label` | `$label`, `$method` | Zmiana nazwy metody realizacji widocznej dla klienta (`pickup`, `delivery`, `dine_in`) |
| `wp_inplate_account_styles` | `$on` | `false` wyłącza wygląd InPlate w **Moim koncie** (strona zostaje motywowi) |
| `wp_inplate_account_downloads` | `$show` | Czy **Moje konto** pokazuje zakładkę **Pobrania**. Domyślnie tylko wtedy, gdy sklep ma produkt do pobrania |

### Akcje

| Akcja | Argumenty | Kiedy |
|---|---|---|
| `wp_inplate_kds_status_changed` | `$order_id`, `$from`, `$to`, `$operator_id` | Zmiana statusu kuchni |
| `wp_inplate_kds_order_assigned` | `$order_id`, `$target_id`, `$kds_status` | Przypisanie zamówienia |
| `wp_inplate_kds_payment_changed` | `$order_id`, `$paid`, `$operator_id` | Zmiana statusu płatności w KDS |
| `wp_inplate_kds_delivery_problem` | `$order_id`, `$reason`, `$operator_id` | Kurier zgłosił nieudaną dostawę |
| `wp_inplate_kds_delivery_problem_cleared` | `$order_id`, `$reason`, `$operator_id` | Manager wyczyścił zwrot |
| `wp_inplate_kds_return_restored` | `$order_id`, `$reason`, `$operator_id` | Kurier przywrócił zwrot do dostawy |
| `wp_inplate_ordering_paused` | `$pause` (kanały, koniec, powód, kto, od kiedy) | Wstrzymanie zamówień albo jego zmiana |
| `wp_inplate_ordering_resumed` | – | Wznowienie zamówień (ręczne) |
| `wp_inplate_courier_order_taken_over` | `$order_id`, `$from_id`, `$to_id` | Kurier przejął zamówienie innego kuriera kodem QR |
| `wp_inplate_consent_changed` | `$user_id`, `$consent_id`, `$given` | Klient z kontem udzielił albo wycofał zgodę (przy zakładaniu konta, w zamówieniu, w Moim koncie) |

Przykład – wysłanie zamówienia do zewnętrznego systemu, gdy kuchnia oznaczy je jako gotowe:

```php
add_action( 'wp_inplate_kds_status_changed', function ( $order_id, $from, $to, $operator_id ) {
	if ( 'ready' !== $to ) {
		return;
	}
	// Twoja integracja, np. wysłanie powiadomienia SMS.
}, 10, 4 );
```

## Tłumaczenia

Domena tekstowa: `wp-inplate`. Szablon tłumaczeń: `languages/wp-inplate.pot`. Dostępne tłumaczenia: `en_US`, `uk`.
