--- plan_id: 20260519-1532-naprawa-inpost-pay-wp-body-open title: Naprawa InPost Pay przez przywrócenie wp_body_open storage: plan-first legacy_phase: null created: 2026-05-19T15:32:42+02:00 status: applied_pending_human_verify type: execute autonomous: false delegation: auto files_modified: - wp-content/themes/betheme/header.php quality_radar: degraded --- ## Goal Naprawić błąd `IPPWidgetOptions is not defined` po instalacji `inpost-pay`. ## Purpose Wtyczka `inpost-pay` rejestruje skrypt inicjalizujący `IPPWidgetOptions` na hooku `wp_body_open`. Motyw `betheme` nie wywołuje tego hooka po otwarciu ``, więc konfiguracja widgetu nie trafia do HTML przed uruchomieniem `woocommerceizi.js`. ## Output Jedna zmiana w `wp-content/themes/betheme/header.php`: dodanie `` bezpośrednio po `>`. ## Project Docs @.paul/PROJECT.md @.paul/STATE.md @.paul/codebase/architecture.md @.paul/codebase/impact_map.md @.paul/codebase/quality_risks.md ## Source Files @wp-content/themes/betheme/header.php @wp-content/plugins/inpost-pay/src/hooks/front/FrontWidgetV2.php @wp-content/plugins/inpost-pay/src/InpostPay.php - Support InPost wskazał brak `wp_body_open()` w `header.php` jako przyczynę niewstrzyknięcia skryptu z `IPPWidgetOptions`. - W repo nie widać child theme dla `betheme`, więc plan dotyka parent theme. To jest świadome odstępstwo od preferowanej reguły projektu; ryzyko nadpisania przy aktualizacji motywu jest zapisane w impact scan i granicach. ## Quality Radar **Status:** degraded **Tools:** `codebase-memory-mcp` częściowo dostępny; szerokie zapytania po repo timeoutują. Użyto zawężonego `rg` i odczytu konkretnych plików. ## Affected Areas - Motyw frontend: `wp-content/themes/betheme/header.php`. - InPost Pay widget: `wp-content/plugins/inpost-pay/src/hooks/front/FrontWidgetV2.php`. - InPost Pay JS: `wp-content/plugins/inpost-pay/src/InpostPay.php` rejestruje `assets/js/woocommerceizi.js`. ## Findings - `FrontWidgetV2::attach_hook()` podpina `add_root_script_after_body_open` do `wp_body_open`. - `FrontWidgetV2::add_root_script_after_body_open()` emituje `const IPPWidgetOptions = {...}`. - `wp-content/themes/betheme/header.php` ma `>`, ale nie ma `wp_body_open()`. - Brak child theme w `wp-content/themes/` oznacza ryzyko, że zmiana w `betheme` zostanie nadpisana podczas aktualizacji motywu. ## Duplicate / Hardcoded Risks - Nie tworzyć fallbacku `IPPWidgetOptions` w custom JS, bo byłby drugim źródłem prawdy obok `inpost-pay`. - Nie modyfikować `wp-content/plugins/inpost-pay/`, bo problem leży po stronie niewywołanego hooka motywu. ## Explicit Deferrals - Utworzenie child theme zostaje poza zakresem tej poprawki, bo użytkownik zgłasza pilny błąd produkcyjny i wsparcie InPost wskazało minimalną zmianę. ## AC-1: Hook WordPress Jest Wywoływany Po Otwarciu Body ```gherkin Given aktywny motyw renderuje `wp-content/themes/betheme/header.php` When strona frontendowa otwiera znacznik `` Then bezpośrednio po nim wywoływane jest `wp_body_open()` ``` ## AC-2: InPost Pay Może Wstrzyknąć Konfigurację Widgetu ```gherkin Given wtyczka `inpost-pay` jest aktywna When WordPress uruchamia hook `wp_body_open` Then `FrontWidgetV2::add_root_script_after_body_open()` może wypisać skrypt z `IPPWidgetOptions` ``` ## AC-3: Zakres Zmiany Jest Minimalny ```gherkin Given poprawka dotyczy kompatybilności motywu z hookiem WordPress When kod zostanie zmieniony Then nie są modyfikowane pliki `wp-content/plugins/inpost-pay/` ani inne integracje checkoutu ``` Task 1: Dodać wp_body_open do header.php wp-content/themes/betheme/header.php Wstawić `` bezpośrednio po linii `>`. Zachować istniejący układ HTML/PHP i nie zmieniać pozostałych hooków Betheme. `rg -n "wp_body_open| Spełnia AC-1 i AC-3. Task 2: Sprawdzić składnię PHP zmienionego pliku wp-content/themes/betheme/header.php Uruchomić lint PHP dla zmienionego pliku, jeśli `php` jest dostępny w PATH. `php -l wp-content/themes/betheme/header.php` albo udokumentowany brak PHP CLI Spełnia AC-1 i AC-3. Task 3: Zweryfikować frontend z aktywnym InPost Pay wp-content/themes/betheme/header.php, wp-content/plugins/inpost-pay/src/hooks/front/FrontWidgetV2.php Na środowisku z aktywną wtyczką `inpost-pay` odświeżyć stronę koszyka/checkoutu i sprawdzić, czy w HTML po `` pojawia się skrypt z `IPPWidgetOptions`. DevTools Console: brak `ReferenceError: IPPWidgetOptions is not defined`; Source/Elements: obecny skrypt `IPPWidgetOptions`. Spełnia AC-2. ## Do Not Change - Nie modyfikować `wp-content/plugins/inpost-pay/`. - Nie modyfikować `wp-content/plugins/ws-inpost-map/`. - Nie zmieniać logiki checkoutu, płatności, dostaw ani assetów Betheme. - Nie dodawać własnego globalnego `IPPWidgetOptions` poza mechanizmem `inpost-pay`. ## Scope Limits - Plan naprawia brak standardowego hooka WordPress w aktywnym headerze. - Plan nie rozwiązuje ogólnego problemu braku child theme. - Plan nie potwierdza konfiguracji merchant InPost Pay ani poprawności danych API. - [ ] `rg -n "wp_body_open| - [ ] `wp_body_open()` jest w `wp-content/themes/betheme/header.php` bezpośrednio po `>`. - [ ] Nie zmieniono plików pluginu `inpost-pay`. - [ ] PHP lint przechodzi albo brak PHP CLI jest udokumentowany. - [ ] Na środowisku z aktywnym `inpost-pay` widget nie zgłasza `IPPWidgetOptions is not defined`. SUMMARY.md path: `.paul/plans/20260519-1532-naprawa-inpost-pay-wp-body-open/SUMMARY.md`