Duplikacja treści w Shopify: /collections/ vs /products/
Table of Contents
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.
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?
Tak, Shopify domyślnie generuje tag canonical wskazujący na /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.
Czy usunięcie filtra “within: collection” zepsuje breadcrumbs?
Tak, breadcrumbs stracą kontekst kolekcji i nie będą pokazywać, z której kolekcji użytkownik przeszedł do produktu. Zamiast “Home > Koszulki > Produkt” zobaczysz “Home > Produkt” lub inny domyślny wariant zależny od motywu. Z perspektywy SEO to korzystna zmiana, ponieważ eliminuje generowanie zduplikowanych ścieżek. Z perspektywy UX to kompromis, który musisz świadomie zaakceptować.
Czy mogę zablokować URL-e /collections//products/ w robots.txt?
Technicznie tak, ale to nie jest dobre rozwiązanie. Zablokowanie tych ścieżek w robots.txt uniemożliwi Googlebotowi crawlowanie tych URL-i, ale nie usunie ich z indeksu, jeśli zostały wcześniej zaindeksowane. Co więcej, zablokowanie crawlowania uniemożliwi Googlebotowi odczytanie tagu canonical na tych stronach, więc robot nie będzie wiedział, że powinien skonsolidować sygnały. Lepszym podejściem jest naprawa linków wewnętrznych i poleganie na tagu canonical.
Ile czasu zajmie usunięcie zduplikowanych URL-i z indeksu Google po wdrożeniu poprawek?
Zależy od rozmiaru sklepu i częstotliwości crawlowania. Dla małych sklepów (do kilkuset produktów) widoczna poprawa w raporcie pokrycia GSC pojawia się zwykle po 2-4 tygodniach. Dla dużych sklepów z tysiącami produktów proces może zająć 1-3 miesiące, bo Googlebot musi ponownie przeskanować wszystkie zduplikowane URL-e i przetworzyć informację o canonicalu. Możesz przyspieszyć ten proces, wysyłając zaktualizowaną sitemap w GSC.