This commit is contained in:
2026-05-19 20:05:59 +02:00
parent 82fb5ad653
commit e90c251d0b
28 changed files with 777 additions and 2158 deletions

View File

@@ -0,0 +1,164 @@
---
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
---
<objective>
## 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 `<body>`, więc konfiguracja widgetu nie trafia do HTML przed uruchomieniem `woocommerceizi.js`.
## Output
Jedna zmiana w `wp-content/themes/betheme/header.php`: dodanie `<?php wp_body_open(); ?>` bezpośrednio po `<body <?php body_class(); ?>>`.
</objective>
<context>
## 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
</context>
<clarifications>
- 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.
</clarifications>
<impact_scan>
## 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 `<body <?php body_class(); ?>>`, 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ę.
</impact_scan>
<acceptance_criteria>
## 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 `<body>`
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
```
</acceptance_criteria>
<tasks>
<task type="auto">
<name>Task 1: Dodać wp_body_open do header.php</name>
<files>wp-content/themes/betheme/header.php</files>
<action>
Wstawić `<?php wp_body_open(); ?>` bezpośrednio po linii `<body <?php body_class(); ?>>`.
Zachować istniejący układ HTML/PHP i nie zmieniać pozostałych hooków Betheme.
</action>
<verify>`rg -n "wp_body_open|<body|body_class" wp-content/themes/betheme/header.php`</verify>
<done>Spełnia AC-1 i AC-3.</done>
</task>
<task type="auto">
<name>Task 2: Sprawdzić składnię PHP zmienionego pliku</name>
<files>wp-content/themes/betheme/header.php</files>
<action>
Uruchomić lint PHP dla zmienionego pliku, jeśli `php` jest dostępny w PATH.
</action>
<verify>`php -l wp-content/themes/betheme/header.php` albo udokumentowany brak PHP CLI</verify>
<done>Spełnia AC-1 i AC-3.</done>
</task>
<task type="checkpoint:human-verify" gate="blocking">
<name>Task 3: Zweryfikować frontend z aktywnym InPost Pay</name>
<files>wp-content/themes/betheme/header.php, wp-content/plugins/inpost-pay/src/hooks/front/FrontWidgetV2.php</files>
<action>
Na środowisku z aktywną wtyczką `inpost-pay` odświeżyć stronę koszyka/checkoutu i sprawdzić, czy w HTML po `<body>` pojawia się skrypt z `IPPWidgetOptions`.
</action>
<verify>DevTools Console: brak `ReferenceError: IPPWidgetOptions is not defined`; Source/Elements: obecny skrypt `IPPWidgetOptions`.</verify>
<done>Spełnia AC-2.</done>
</task>
</tasks>
<boundaries>
## 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.
</boundaries>
<verification>
- [ ] `rg -n "wp_body_open|<body|body_class" wp-content/themes/betheme/header.php`
- [ ] `php -l wp-content/themes/betheme/header.php` albo zanotowany brak PHP CLI
- [ ] Frontend manualnie: brak błędu `IPPWidgetOptions is not defined`
- [ ] Quality Radar relevant risks handled or deferred.
</verification>
<success_criteria>
- [ ] `wp_body_open()` jest w `wp-content/themes/betheme/header.php` bezpośrednio po `<body <?php body_class(); ?>>`.
- [ ] 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`.
</success_criteria>
<output>
SUMMARY.md path: `.paul/plans/20260519-1532-naprawa-inpost-pay-wp-body-open/SUMMARY.md`
</output>