Separator URL miedzy parami attr-val zmieniony z "/" na "_" w generatorze feedu (ProductRepository::appendCombinationToXml). Wzorzec routingu pp_routes rozszerzony do [0-9_-]+ w Helpers::htacces (oba warianty: seo_link i fallback p-id-name). LayoutEngine konwertuje "_" -> "|" przed wywolaniem ProductRepository::findCached — format DB pozostaje "|". Partial product-attribute.php preselectuje wartosc z permutation_hash URL (forced_value_id), co poprawia UX wejscia z linka feedu. Suita: 834 -> 841 testow (+7), 2330 assertions. Wymagane akcje na produkcji po deployu: regeneracja pp_routes (Helpers::htacces), wyczyszczenie klucza pp_routes:all w Redis, regeneracja google-feed.xml, resubmit feedu w GMC. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8.2 KiB
8.2 KiB
phase, plan, subsystem, tags, requires, provides, affects, tech-stack, key-files, key-decisions, patterns-established, duration, completed
| phase | plan | subsystem | tags | requires | provides | affects | tech-stack | key-files | key-decisions | patterns-established | duration | completed | ||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 18-google-feed-permutation-url-fix | 01 | feed/routing |
|
|
|
|
|
|
|
|
~25min | 2026-04-30 |
Phase 18 Plan 01: Google feed permutation URL fix — Summary
Linki produktów z permutacją w feedzie Google używają teraz _ jako separatora par attr-val, routing pp_routes matchuje takie URL-e, a partial atrybutu preselectuje wartości na podstawie permutation_hash z URL.
Performance
| Metric | Value |
|---|---|
| Duration | ~25 min |
| Started | 2026-04-30 |
| Completed | 2026-04-30 |
| Tasks | 3 / 3 |
| Files modified | 6 (4 silnik + 2 testy) |
| Tests | 834 → 841 (+7) |
Acceptance Criteria Results
| Criterion | Status | Notes |
|---|---|---|
AC-1: Generator linku w feedzie używa _ |
Pass | ProductFeedLinkTest.testCombinationLinkUsesUnderscoreInSeoLinkBranch + fallback + single-pair |
AC-2: Routing pp_routes matchuje URL z _ |
Pass | HelpersRoutingTest weryfikuje obecność [0-9_-]+ w generatorze + preg_match na nowym wzorcu |
AC-3: Front konwertuje _ z URL na ` |
` przed zapytaniem | Pass |
| AC-4: Partial preselectuje wartość z URL | Pass | $forced_value_id + $is_active używane w checked i <script> |
| AC-5: Pełna suita testów zielona | Pass | PHPUnit: 841 tests, 2330 assertions, 0.764s |
Accomplishments
- Naprawa krytycznego problemu komercyjnego: feed Google prowadził klientów na home zamiast na produkt
- Spójność stosu: separator URL (
_) ↔ format DB (|) z jasnym punktem konwersji w warstwie front - 7 nowych testów (4 routing + 3 generator linku) — pełne pokrycie zmiany
- Reflection-based test metody prywatnej
appendCombinationToXmlz mockiem Medoo i mockiem TransportRepository - UI strony produktu wchodząc z linka feedu pokazuje wybraną kombinację atrybutów (zamiast
is_default)
Files Created/Modified
| File | Change | Purpose |
|---|---|---|
autoload/Domain/Product/ProductRepository.php |
Modified (×2) | appendCombinationToXml: separator / → _ w obu gałęziach (seo_link i fallback) |
autoload/Shared/Helpers/Helpers.php |
Modified (×2) | Generator pp_routes: regex [0-9-]+ → [0-9_-]+ w obu wariantach |
autoload/front/LayoutEngine.php |
Modified | Wyciągnięcie $permutation_hash z konwersją _ → ` |
templates/shop-product/_partial/product-attribute.php |
Modified | $forced_value_id z URL + $is_active w checked/<script> |
tests/Unit/Shared/Helpers/HelpersRoutingTest.php |
Created | 4 testy regex routingu (file content + preg_match dla _ i odrzucenia /) |
tests/Unit/Domain/Product/ProductFeedLinkTest.php |
Created | 3 testy appendCombinationToXml via Reflection (seo_link, fallback, single-pair) |
Decisions Made
| Decision | Rationale | Impact |
|---|---|---|
Separator URL _ zamiast / |
_ mieści się w jednym segmencie regex [0-9_-]+; / wymagałby zmiany struktury routingu |
Czysty fix, minimalna zmiana w pp_routes |
| Format DB pozostaje ` | ` | Nie tykać zapisanych danych w pp_shop_product_combinations.permutation_hash |
| Brak redirectów 301 | Stare URL-e z feedu wymarły gdy GMC zaciągnie nowy feed | Mniej kodu w .htaccess, brak długoterminowego balastu |
| Brak automatycznych akcji post-deploy | Hotfix dotyczy tylko silnika; regen routes/cache/feed są zależne od środowiska | Wymaga manualnego runbook'a (poniżej) |
| Override /feature-dev | Hotfix z konkretną instrukcją od użytkownika, jak fazy 15/16/17 | Skill audit logged |
Deviations from Plan
Summary
| Type | Count | Impact |
|---|---|---|
| Auto-fixed | 0 | — |
| Scope additions | 0 | — |
| Deferred | 0 | — |
Total impact: Zero. Plan wykonany dokładnie według instrukcji.
Auto-fixed Issues
None.
Deferred Items
None.
Issues Encountered
| Issue | Resolution |
|---|---|
ProductRepository::appendCombinationToXml jest private z zależnościami od transportRepoForXml i AttributeRepository (DB) |
Test via ReflectionMethod; mock Medoo (select → [], get → null); wstrzyknięty mock TransportRepository::lowestTransportPrice zwracający 0.0 na dynamicznej property transportRepoForXml |
Brak istniejącego folderu tests/Unit/Shared/Helpers/ |
Utworzony nowy katalog + HelpersRoutingTest.php |
Helpers::htacces() zbyt rozległe do testu E2E (DB writes, file I/O) |
Test pośredni: assercje na zawartości pliku Helpers.php (file_get_contents) + standalone preg_match na sample patternie |
Post-deploy runbook (manual, kolejność krytyczna)
Wymagane akcje na środowisku produkcyjnym po deployu kodu:
- Regeneracja
pp_routes— wywołaćHelpers::htacces()(np. zapis ustawień w adminie lub regeneracja sitemap), żeby nowe wzorce z_trafiły do bazy. Bez tego stare wzorce[0-9-]+wpp_routesnadal nie zmatchują URL z_. - Wyczyścić cache routingu — skasować klucz
pp_routes:allw Redis (DEL pp_routes:all) albo poczekać 24h na expiry.index.php:63cachuje routing. - Regeneracja feedu Google — uruchomić cron
cron/cron-xml.php(\admin\factory\ShopProduct::generate_google_feed_xml()), żebygoogle-feed.xmlzawierał nowe linki z_. - Resubmit feedu w GMC — automatycznie wg harmonogramu lub ręcznie "Fetch now".
- Stare URL-e w GMC — same wypadną z indeksu po podmianie feedu (Google).
Walidacja po deployu:
https://domena/google-feed.xml— tagi<link>zawierają_zamiast/między paramihttps://domena/slug-produktu/20-170_21-175— ładuje produkt z preselectowaną kombinacją (nie home)- GMC: feed bez błędów "Landing page error"
Skill Audit (Phase 18)
| Expected | Invoked | Notes |
|---|---|---|
| /feature-dev | ○ | User-approved override (hotfix z konkretną instrukcją) |
| /koniec-pracy | ○ | Pending — uruchomić przy zakończeniu sesji jeśli release wchodzi do update package |
Next Phase Readiness
Ready:
- Hotfix completed; pełna suita zielona
- Brak zmian w schemacie DB
- Wzorzec preselekcji partial z URL parameter dostępny dla innych partiali (jeśli pojawi się potrzeba)
Concerns:
- Akcje post-deploy (regen routes / clear cache / regen feed) wymagają manualnego wykonania — brak automatu
- Klienci sklepu mający własne nadpisane
templates_user/shop-product/_partial/product-attribute.phpmuszą zaaplikować zmianę u siebie (Tpl::view priorytetujetemplates_user/)
Blockers:
- None.
Phase: 18-google-feed-permutation-url-fix, Plan: 01 Completed: 2026-04-30