Migracja sklepu z 12 000 produktami bez automatyzacji mapowania przekierowań to tygodnie ręcznej pracy i nieuchronne błędy. Poniżej metodologia, którą stosujemy — od crawla do gotowego pliku z przekierowaniami.
Krok 1: Eksport pełnej mapy URL ze starego sklepu
Screaming Frog SEO Spider → Internal → Export → All.
Interesują Cię kolumny:
Address(pełny URL)Status Code(chcesz tylko 200)Indexability(filtrujesz „Indexable”)H1-1(tytuł strony — przydatny do matchowania z nową strukturą)Meta Description 1
Eksportuj do CSV. Dla 12 000 produktów + kategorie + tagi → zwykle 15 000-20 000 wierszy.
Krok 2: Eksport nowej struktury z docelowej platformy
W Shoper: Panel → Produkty → Eksport → format CSV. Eksportujesz:
- ID produktu
- Slug URL (jeśli Shoper go generuje)
- Nazwa produktu
- Kategoria
Jeśli Shoper jeszcze nie ma URL-i (nowy sklep w trakcie konfiguracji) — generujesz je na podstawie nazwy produktu.
Krok 3: Automatyczne matchowanie — Python
import pandas as pd
from fuzzywuzzy import fuzz
old_urls = pd.read_csv('old_crawl.csv')
new_urls = pd.read_csv('new_products.csv')
def find_best_match(old_name, new_df):
scores = new_df['product_name'].apply(
lambda x: fuzz.token_sort_ratio(old_name, x)
)
best_idx = scores.idxmax()
return new_df.loc[best_idx, 'url'], scores[best_idx]
results = []
for _, row in old_urls.iterrows():
new_url, score = find_best_match(row['H1-1'], new_urls)
results.append({
'old_url': row['Address'],
'new_url': new_url,
'confidence': score
})
df_results = pd.DataFrame(results)
# Eksport do weryfikacji ręcznej
df_results[df_results['confidence'] < 85].to_csv('needs_review.csv')
df_results[df_results['confidence'] >= 85].to_csv('auto_matched.csv')
Typowe wyniki dla dobrze nazwanych produktów: 80-90% automatycznie zmatchowanych z pewnością >85%.
Krok 4: Ręczna weryfikacja niskiej pewności
needs_review.csv — to są URL-e, gdzie algorytm nie był pewny. Otwierasz w Excelu, sprawdzasz każdy wiersz i ręcznie przypisujesz właściwy nowy URL.
Dla produktów archiwalnych (nie mają odpowiednika w nowym sklepie) — mapujesz do najbliższej kategorii nadrzędnej.
Krok 5: Format końcowy i wdrożenie
Gotowy plik mapowania w formacie:
stary_url,nowy_url
https://starystore.pl/produkt/sofa-szara,https://nowystore.pl/sofy/sofa-premium-szara/
Implementacja przez Cloudflare Workers (zalecane dla Shoper)
Shoper nie daje dostępu do .htaccess. Najlepsza opcja: Cloudflare Workers jako middleware.
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
const redirects = {
'/stara-kategoria/stary-produkt/': '/nowa-kategoria/nowy-produkt/',
// ... cały mapping
}
async function handleRequest(request) {
const url = new URL(request.url)
const path = url.pathname
if (redirects[path]) {
return Response.redirect(
`${url.origin}${redirects[path]}`,
301
)
}
return fetch(request)
}
Testowanie przed migracją
Obowiązkowo przetestuj 100% przekierowań na środowisku staging:
# Skrypt bash do testowania przekierowań
while IFS=, read old new; do
status=$(curl -s -o /dev/null -w "%{http_code}" -L "$old")
final=$(curl -s -o /dev/null -w "%{url_effective}" -L "$old")
echo "$old -> $new | Status: $status | Final: $final"
done < redirects.csv | grep -v "301\|302" > errors.txt
Jeśli errors.txt jest pusty — gotowe do migracji.
Ile to zajmuje
Dla sklepu 12 000 SKU:
- Crawl starego sklepu: 2-4h
- Eksport nowych URL-i: 30min
- Automatyczne matchowanie: 15min
- Ręczna weryfikacja (20% wierszy): 4-6h
- Wdrożenie i testy: 2h
Łącznie: 1-2 dni robocze zamiast 2-3 tygodni ręcznej pracy.
Masz pytania do tego artykułu lub chcesz żebym spojrzał na Twój sklep?
Napisz do mnie →