# Fix: linki produktów z permutacją atrybutów w feedzie Google → strona główna ## Problem URL produktu z permutacją atrybutów wygenerowany do feedu Google miał format: ``` /slug-produktu/20-170/21-175 ``` (dwa segmenty rozdzielone `/`). Google Merchant Center indeksował taki URL z feedu, ale przy wejściu użytkownika serwer nie dopasowywał go do żadnej trasy w `pp_routes` i `index.php` ładował domyślną stronę główną. ## Przyczyna `permutation_hash` jest przechowywany w bazie jako `attr-val|attr-val` (np. `20-170|21-175`), a w generatorze feedu Google znak `|` był podmieniany na `/` przy budowaniu linku. Dodatkowo wzorzec routingu w `pp_routes` dla URL produktu z permutacją to `^slug/([0-9-]+)$` — klasa `[0-9-]+` nie obejmuje `/`, więc URL ze slashem nigdy się nie dopasuje. ## Rozwiązanie Separatorem między parami `attr-val` w URL jest teraz `_`. Przy odczycie `$_GET['permutation_hash']` w warstwie front podstawiamy `_` z powrotem na `|` przed zapytaniem do bazy. Format URL po zmianie: ``` /slug-produktu/20-170_21-175 ``` ## Pliki zmienione ### 1. `autoload/Domain/Product/ProductRepository.php` W metodzie `appendCombinationToXml` (linie ~2372 i ~2374): ```php // było str_replace( '|', '/', $combination['permutation_hash'] ) // jest str_replace( '|', '_', $combination['permutation_hash'] ) ``` Dotyczy obu gałęzi `if/else` (z `seo_link` i fallback `p-id-name`). ### 2. `autoload/Shared/Helpers/Helpers.php` W generatorze tras dla produktów z permutacją (linie ~694 i ~699) — rozszerzony wzorzec regex o `_`: ```php // było 'pattern' => '^' . ... . '/([0-9-]+)$' // jest 'pattern' => '^' . ... . '/([0-9_-]+)$' ``` Dotyczy obu wariantów (z `seo_link` i fallback `p-id-name`). ### 3. `autoload/front/LayoutEngine.php` W bloku `// PRODUKT` (linia ~196) — konwersja `_` → `|` przed przekazaniem do `findCached`: ```php // było $product = ( new \Domain\Product\ProductRepository( $GLOBALS['mdb'] ) ) ->findCached( \Shared\Helpers\Helpers::get( 'product' ), $lang_id, $_GET['permutation_hash'] ?? null ); // jest $permutation_hash = isset( $_GET['permutation_hash'] ) ? str_replace( '_', '|', $_GET['permutation_hash'] ) : null; $product = ( new \Domain\Product\ProductRepository( $GLOBALS['mdb'] ) ) ->findCached( \Shared\Helpers\Helpers::get( 'product' ), $lang_id, $permutation_hash ); ``` ### 4. `templates/shop-product/_partial/product-attribute.php` Domyślnie partial preselectuje wartości na podstawie flagi `is_default`. Po wejściu na URL z `permutation_hash` (np. z feedu Google) UI nadal pokazywał domyślną kombinację zamiast tej z URL. Dodane wymuszenie wyboru wartości na podstawie `permutation_hash` z URL — jeśli atrybut jest obecny w hashu, jego aktywna wartość pochodzi z URL; w przeciwnym razie zachowane stare zachowanie (`is_default`). ```php // na początku partiala — wyciągnięcie value_id dla bieżącego atrybutu z URL $forced_value_id = null; if ( isset( $_GET['permutation_hash'] ) && $_GET['permutation_hash'] !== '' ) { $pairs = explode( '|', str_replace( '_', '|', $_GET['permutation_hash'] ) ); foreach ( $pairs as $pair ) { $parts = explode( '-', $pair ); if ( count( $parts ) == 2 && (int)$parts[0] === (int)$this -> attribute['id'] ) { $forced_value_id = (int)$parts[1]; break; } } } // w pętli foreach po values — zamiast bezpośrednio $value['is_default']: $is_active = $forced_value_id !== null ? ( (int)$value['id'] === $forced_value_id ) : (bool)$value['is_default']; ``` `$is_active` jest następnie używane do `checked="checked"` na inpucie i do emisji bloku `