Duplikacja treści w Shopify: /collections/ vs /products/
Problem: dwa adresy URL dla jednego produktu
Shopify ma problem z duplikacją, o którym większość właścicieli sklepów nie wie, dopóki nie zrobi audytu SEO. A kiedy się dowiedzą, zazwyczaj nie chcą wierzyć, bo brzmi to absurdalnie.
Każdy produkt w Shopify ma swój kanoniczny adres w formacie /products/nazwa-produktu. Do tego miejsca wszystko jest w porządku. Problem zaczyna się w momencie, gdy klient przegląda sklep przez kolekcje. Shopify domyślnie generuje linki do produktów w formacie uwzględniającym kontekst kolekcji:
/collections/nazwa-kolekcji/products/nazwa-produktu
To oznacza, że ten sam produkt jest dostępny pod wieloma adresami jednocześnie. Koszulka “Premium Cotton Tee” z trzech kolekcji to trzy URL-e plus jeden kanoniczny:
/products/premium-cotton-tee/collections/nowosci/products/premium-cotton-tee/collections/koszulki/products/premium-cotton-tee/collections/wyprzedaz/products/premium-cotton-tee
Każdy z tych adresów zwraca kod HTTP 200 i wyświetla identyczną treść. Dla użytkownika to nie ma znaczenia, bo widzi tę samą stronę produktu niezależnie od ścieżki. Dla Google to cztery oddzielne URL-e z tym samym contentem.
/products/.
Dlaczego Shopify tak działa
To nie jest błąd platformy. Shopify celowo tworzy te ścieżki, żeby breadcrumbs i nawigacja wsteczna mogły odzwierciedlać, z której kolekcji użytkownik przyszedł. Gdy klient klika produkt z kolekcji “Nowości”, breadcrumbs na stronie produktu pokazują: Home > Nowości > Premium Cotton Tee. To ma sens z perspektywy UX.
Mechanizm opiera się na zmiennej collection w szablonach Liquid. Gdy użytkownik trafia na produkt z kontekstu kolekcji, Shopify przekazuje informację o kolekcji do szablonu produktu. Na tej podstawie generowane są breadcrumbs, “wróć do kolekcji” i powiązane produkty.
Problem w tym, że domyślne szablony Shopify (i większość motywów) linkują do produktów właśnie w formacie /collections/*/products/*. W efekcie linki wewnętrzne w Twoim sklepie prowadzą do zduplikowanych URL-i, a nie do kanonicznych /products/*.
Wpływ na SEO
Rozproszenie sygnałów rankingowych
Gdy inne strony linkują do Twojego produktu, mogą użyć dowolnej wersji URL-a. Część linków trafi na /products/nazwa, a część na /collections/kolekcja/products/nazwa. Link equity rozkłada się między tymi adresami, zamiast koncentrować się na jednym.
I tu jest sedno sprawy. Nawet jeśli Shopify ustawia canonical na /products/, Google nie traktuje tego jako bezwzględnej dyrektywy. Canonical to wskazówka, nie polecenie. Google może ją zignorować. I robi to regularnie. Jeśli większość linków wewnętrznych prowadzi do wersji z kolekcją, Google może uznać, że to właśnie ta wersja jest istotniejsza, i zignorować sugestię canonicala.
Marnowanie crawl budgetu
Googlebot musi przeskanować każdy unikalny URL, żeby ustalić, że pod spodem jest ten sam content. W sklepie z 500 produktami i 20 kolekcjami to potencjalnie 10 000 dodatkowych URL-i do przeskanowania. Dla dużych sklepów ten problem rośnie proporcjonalnie i bezpośrednio wpływa na budżet indeksacji.
Zamieszanie w Google Search Console
W raportach pokrycia indeksu (Coverage) zobaczysz alerty “Duplicate without user-selected canonical” lub “Duplicate, Google chose different canonical than user”. To oznacza, że Google znalazł zduplikowane strony i sam zdecydował, którą wersję traktować jako kanoniczną. Nie zawsze wybiera tę, którą Ty byś chciał.
Naprawy: od najprostszej do najskuteczniejszej
Weryfikacja tagów canonical
Shopify domyślnie dodaje tag canonical do każdej strony produktu. Nawet gdy użytkownik wchodzi na /collections/koszulki/products/premium-cotton-tee, w sekcji <head> powinien znajdować się:
|
|
Zanim cokolwiek zmienisz, sprawdź, czy Twój motyw nie nadpisuje domyślnych canonicali. Otwórz plik theme.liquid w edytorze motywu i poszukaj kodu odpowiedzialnego za generowanie canonicala. Upewnij się, że używa on canonical_url, które Shopify automatycznie ustawia na wersję /products/.
Jeśli Twój motyw generuje canonical ręcznie na podstawie request.url lub request.path, to prawdopodobnie canonical wskazuje na bieżący URL (z kolekcją), zamiast na wersję kanoniczną. To trzeba naprawić.
Naprawa linków wewnętrznych w Liquid
To najważniejsza zmiana. Domyślnie wiele motywów Shopify generuje linki do produktów w kontekście kolekcji. Szablony używają konstrukcji, która uwzględnia bieżącą kolekcję w URL-u produktu. Poprawne rozwiązanie to wymuszenie linków bezpośrednio do /products/:
|
|
Zmienna {{ product.url }} w Liquid zawsze zwraca kanoniczny URL produktu w formacie /products/nazwa-produktu. Z kolei {{ product.url | within: collection }} dodaje prefix kolekcji.
Przeszukaj pliki motywu pod kątem użycia filtra within: collection lub within:collection. Najczęściej znajdziesz go w:
collection.liquidlubcollection-template.liquid(listing produktów w kolekcji)product-card.liquidlubproduct-grid-item.liquid(komponent karty produktu)search-results.liquid(wyniki wyszukiwania)featured-collection.liquid(sekcja polecanych produktów na stronie głównej)
Każde wystąpienie within: collection zamień na bezpośrednie użycie {{ product.url }}. Po zmianie linki wewnętrzne będą prowadzić do wersji kanonicznej, a breadcrumbs stracą kontekst kolekcji.
No i co z tego? To kompromis, ale z perspektywy SEO zdecydowanie opłacalny. Robiłem tę zmianę w sklepie z 3000 produktów i 25 kolekcjami. Po miesiącu liczba “Duplicate, Google chose different canonical” w Search Console spadła o 80%. Breadcrumbs straciły kontekst kolekcji, ale nikt z klientów tego nie zauważył.
Weryfikacja sitemapy
Shopify generuje sitemap automatycznie i domyślnie umieszcza w nim tylko URL-e w formacie /products/nazwa-produktu. To poprawne zachowanie. Warto jednak to zweryfikować, szczególnie jeśli używasz aplikacji, które mogą modyfikować sitemap.
Otwórz https://twojsklep.myshopify.com/sitemap.xml i sprawdź, czy:
- URL-e produktów zaczynają się od
/products/, a nie od/collections/*/products/ - nie ma zduplikowanych wpisów dla tego samego produktu
- wszystkie produkty, które powinny być indeksowane, są obecne w sitemapie
Jeśli w sitemapie pojawią się URL-e z prefiksem kolekcji, problem prawdopodobnie leży w aplikacji zewnętrznej. Shopify nie daje natywnej możliwości edycji sitemapy, ale możesz wyłączyć lub skonfigurować aplikację, która ją modyfikuje.
Breadcrumbs bez dodatkowych URL-i
Breadcrumbs to drugi mechanizm, przez który Shopify generuje linki z kontekstem kolekcji. Domyślne breadcrumbs na stronie produktu wyglądają tak:
Home > Kolekcja > Produkt
Problem polega na tym, że link “Kolekcja” prowadzi do /collections/nazwa-kolekcji, a “Produkt” to bieżący URL (który może zawierać prefix kolekcji). Z perspektywy SEO breadcrumbs powinny linkować do kanonicznego URL-a produktu.
W pliku breadcrumb.liquid (lub odpowiednim snippecie w Twoim motywie) upewnij się, że ostatni element breadcrumbs nie jest linkiem lub, jeśli jest, prowadzi do {{ product.url }} bez kontekstu kolekcji.
Dodatkowo sprawdź dane strukturalne breadcrumbs. Shopify i wiele motywów generują JSON-LD z BreadcrumbList. Upewnij się, że URL-e w tych danych strukturalnych również używają wersji kanonicznej:
|
|
Ostatni element (produkt) nie powinien zawierać pola item z URL-em, ponieważ reprezentuje bieżącą stronę. Jeśli zawiera URL, musi to być wersja kanoniczna.
Jak przeprowadzić audyt duplikacji
Screaming Frog
Uruchom crawl całego sklepu w Screaming Frog. Po zakończeniu:
- przejdź do zakładki “URL” i przefiltruj wyniki po ścieżce zawierającej
/collections/i/products/jednocześnie - sprawdź zakładkę “Canonicals” i poszukaj URL-i, gdzie canonical wskazuje na inny adres niż bieżący
- w zakładce “Duplicate” poszukaj stron oznaczonych jako duplikaty
Jeśli widzisz setki URL-i w formacie /collections/*/products/* z canonicalem wskazującym na /products/*, to potwierdzenie problemu. Następny krok to sprawdzenie, czy linki wewnętrzne prowadzą do wersji kanonicznej, czy do wersji z kolekcją.
Google Search Console
W GSC przejdź do raportu “Strony” (dawniej “Pokrycie”). Poszukaj statusów:
- “Zduplikowana strona bez kanonicznego tagu wybranego przez użytkownika” (Duplicate without user-selected canonical)
- “Zduplikowana strona, Google wybrał inny kanoniczny adres” (Duplicate, Google chose different canonical than user)
- “Strona z przekierowaniem” (jeśli jakieś URL-e kolekcyjne przekierowują)
Kliknij w każdy z tych statusów i sprawdź, jakie URL-e są dotknięte. Jeśli widzisz tam adresy w formacie /collections/*/products/*, to potwierdzenie, że Google widzi duplikaty i próbuje sobie z nimi radzić samodzielnie.
Sprawdzenie indeksu Google
Wpisz w Google: site:twojsklep.pl inurl:/collections/ inurl:/products/. Jeśli wyniki pokazują strony produktów z prefixem kolekcji, to oznacza, że Google zaindeksował zduplikowane URL-e mimo canonicali. To najpoważniejszy scenariusz i wymaga natychmiastowej naprawy linków wewnętrznych.
Podsumowanie priorytetów
Nie musisz wdrażać wszystkich poprawek jednocześnie. Kolejność priorytetów:
- sprawdź, czy canonical tagi działają poprawnie i wskazują na
/products/(szybka weryfikacja, zero ryzyka) - zamień
within: collectionnaproduct.urlw szablonach Liquid (największy wpływ, wymaga testów) - zweryfikuj sitemap (szybka kontrola)
- popraw breadcrumbs i dane strukturalne (dopracowanie)
Po wdrożeniu zmian daj Google 2-4 tygodnie na ponowne przeskanowanie sklepu. Monitoruj raport pokrycia w GSC i obserwuj, czy liczba zduplikowanych URL-i spada.
Jeśli Twój sklep na Shopify potrzebuje kompleksowego audytu technicznego SEO, sprawdź naszą usługę pozycjonowania sklepów Shopify.
FAQ
Czy Shopify automatycznie ustawia tagi canonical na produktach?
/products/nazwa-produktu niezależnie od tego, z jakiego URL-a użytkownik wchodzi na stronę. Pod warunkiem, że motyw nie nadpisuje tego zachowania własnym kodem. Warto to zweryfikować, bo niektóre motywy premium implementują canonical na podstawie bieżącego URL-a zamiast korzystać z wbudowanego mechanizmu Shopify.