StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Konsultacje

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Konsultacje

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Konsultacje

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

RealizacjeO mnieBlog
Porozmawiajmy
PL
EN

Nowoczesne strony internetowe dla firm, które myślą odważnie.

Przewiń do góry

Nazwa

StriveLab Maciej Sala

NIP

6772218995

REGON

524008527

E-mail

contact@strivelab.pl

Usługi główne
  • Tworzenie stron internetowych
  • Strony internetowe Next.js
  • Strony internetowe Astro
  • Strony internetowe React
Inne usługi
  • Usługi
  • Audyt SEO i Performance
  • Testy automatyczne i QA
  • Konsultacje Produktowe
  • Automatyzacja Procesów AI
  • Aplikacje webowe Next.js
  • Współpraca ciągła
Strony
  • O mnie
  • Usługi
  • Realizacje
  • Blog

© 2026 StriveLab.pl

Polityka prywatności
AstroWordPressSEO

Migracja bloga z WordPress na Astro — eksport treści, przekierowania 301 i zachowanie pozycji w Google

Migracja bloga z WordPress na Astro bez utraty pozycji w Google — jak wyeksportować treść, zmapować URL-e i nie zepsuć 301-ek?

OpublikujLinkedInFacebookWyślij
Autor
Maciej Sala
Opublikowano
24 kwietnia 2026 00:00
Czytanie
9 min czytania
Aktualizacja
25 maja 2026 12:48

WordPress to CMS, który wygrywa prostotą startu i przegrywa jednocześnie kosztem utrzymania. Wtyczki spowalniają stronę i zarazem są potencjalnie niebezpieczne ze względu na włamania, wymagają głębokiej optymalizacji, a każda aktualizacja to potencjalne ryzyko regresji. Migracja na Astro powinna być szybką inwestycją z mierzalnym ROI. Przeprowadzam Cię przez każdy etap.

w skrócie

  • Migracja bloga to przemyślany projekt , a nie tylko przeniesienie plików z WordPressa do MDX.
  • Najważniejsze: mapowanie URL-i, , obrazy, metadane i monitoring po przełączeniu produkcji.
  • Eksport przez daje kontrolę, a bywa lepszy przy pełnym archiwum treści.
  • Nie migruj bez środowiska testowego, planu wycofania zmian i listy URL-i, które generują ruch organiczny.

Migracja przy rozsądnym planie zamyka się w 2–3 tygodniach i zwraca się w wydajności, stabilności SEO oraz niższych kosztach hostingu. Poniżej proces, który wielokrotnie przechodziłem przy projektach klientów StriveLab.

Jeśli zamiast Astro rozważasz Next.js jako cel migracji, zajrzyj do mojego równoległego artykułu o migracji WordPress → Next.js. Proces jest podobny, ale wiele szczegółów różni się przez architekturę frameworków.

Co realnie wygrywasz na Astro

Migracja dla samej migracji to marnotrawstwo czasu, dlatego zanim zaczniesz, zdefiniuj mierzalne cele.

Wydajność. Typowy WordPress z cache osiąga 2–4 s, podczas gdy Astro naturalnie schodzi do 0,5–1,5 s bez dodatkowej wtyczki. To konsekwencja przemyślanej architektury: mało JavaScriptu, statyczny HTML i obrazy optymalizowane podczas budowania.

Koszty. WordPress wymaga hostingu zarządzanego (15-100 dolarów miesięcznie) albo VPS-a z własną obsługą, aktualizacjami i zabezpieczeniami. Astro na Cloudflare Workers może zaczynać od zera — darmowy plan wystarcza dla większości małych i średnich blogów.

Bezpieczeństwo. WordPress to jedno z najczęściej atakowanych narzędzi w sieci, szczególnie polem do popisu są wtyczki. Astro jako statyczny build ma znacznie mniejszą powierzchnię ataku: nie ma PHP, nie ma bazy danych w runtime i nie ma panelu admina wystawionego publicznie.

Komfort pracy programistycznej. Edycja treści w MDX w VS Code, autouzupełnianie, własne komponenty i wersjonowanie w Git — to wszystko dla osób technicznych to duży skok jakościowy.

Ograniczenie dla zespołu bez programisty: jeśli treści edytuje nietechniczny copywriter bez dostępu do repozytorium, Astro + pliki MDX nie wystarczą. Wtedy lepszą opcją jest Astro + headless (Storyblok, Sanity, Contentful) albo pozostawienie WordPressa w roli źródła treści, z Astro jako frontendem.

Plan migracji — etapy

Cały proces dzielę na sześć etapów:

  1. Eksport treści z WordPressa.
  2. Transformacja i import do Content Collections.
  3. Migracja obrazów do astro:assets.
  4. Mapowanie URL-i i generowanie przekierowań 301.
  5. Wdrożenie na środowisko testowe i weryfikacja.
  6. Przełączenie produkcji i monitoring.

Każdy z tych etapów rozbijam niżej.

1. Eksport treści z WordPressa

Masz dwie główne opcje — albo .

WP REST API

REST API jest dostępne domyślnie w każdym WordPressie i możesz pobrać wszystkie posty:

Code
curl "https://twojastrona.pl/wp-json/wp/v2/posts?per_page=100&page=1" > posts-page-1.json
curl "https://twojastrona.pl/wp-json/wp/v2/posts?per_page=100&page=2" > posts-page-2.json
# itd. dla każdej strony wyników

Można też — lepsza opcja — użyć skryptu Node do masowego eksportu:

Code
// export-posts.mjs
import fs from 'node:fs/promises'
 
const BASE_URL = 'https://twojastrona.pl/wp-json/wp/v2'
 
async function exportAll() {
  const posts = []
  let page = 1
 
  while (true) {
    const res = await fetch(`${BASE_URL}/posts?per_page=100&page=${page}`)
    if (res.status === 400) break // no more pages
 
    const batch = await res.json()
    if (batch.length === 0) break
 
    posts.push(...batch)
    console.log(`Fetched page ${page}, total: ${posts.length}`)
    page++
  }
 
  await fs.writeFile('wp-posts.json', JSON.stringify(posts, null, 2))
  console.log(`Saved ${posts.length} posts`)
}
 
exportAll()

Po wyrenderowaniu przez WP REST API zwraca treść w HTML. Jest to z jednej strony zaleta, ponieważ dostajesz finalną zawartość, a z drugiej wada — musisz ją potem skonwertować na Markdown.

WXR export

Klasyczny export.xml z panelu WP (Narzędzia → Eksport) zawiera wszystko w jednym pliku XML. Format starszy, ale zupełny i ma wszystko: kategorie, tagi, komentarze, autorów, meta pola.

Do parsowania WXR w Node rekomenduję wordpress-export-to-markdown albo własny skrypt z xml2js.

Osobiście dla 95% migracji używam REST API — jest prostszy, dostarcza lepiej wyrenderowaną treść, łatwiej ją wziąć do przetworzenia.

2. Transformacja do MDX i import do Content Collections

Mając JSON z WordPressa, konwertujesz każdy post do pliku MDX i jeśli chcesz przenieść tagi jako slugi, wyeksportuj też /wp-json/wp/v2/tags?per_page=100 do wp-tags.json, ponieważ standardowe pole post.tags zawiera ID, nie nazwy ani slugi. Kluczowy krok — konwersja HTML → Markdown. Dla tego używam turndown:

Code
npm install turndown turndown-plugin-gfm

Skrypt transformujący:

Code
// transform-to-mdx.mjs
import fs from 'node:fs/promises'
import path from 'node:path'
import TurndownService from 'turndown'
import { gfm } from 'turndown-plugin-gfm'
 
const td = new TurndownService({
  headingStyle: 'atx',
  codeBlockStyle: 'fenced',
  bulletListMarker: '-',
})
td.use(gfm)
 
// Usuwa klasy WP, które nie mają sensu w Astro
td.addRule('stripWPClasses', {
  filter: (node) =>
    node.hasAttribute?.('class') &&
    node.getAttribute('class').startsWith('wp-'),
  replacement: (content) => content,
})
 
const posts = JSON.parse(await fs.readFile('wp-posts.json', 'utf8'))
const tags = JSON.parse(await fs.readFile('wp-tags.json', 'utf8'))
const tagMap = new Map(tags.map((tag) => [tag.id, tag.slug]))
 
for (const post of posts) {
  const slug = post.slug
  const title = decodeEntities(post.title.rendered)
  const excerpt = stripHtml(post.excerpt.rendered).slice(0, 160)
  const date = post.date.split('T')[0]
  const contentMd = td.turndown(post.content.rendered)
 
  // WordPress REST API zwraca tagi jako ID. Slugi pobierz osobno z /wp/v2/tags
  // albo przez _embed/custom field i zbuduj mapę id -> slug przed transformacją.
  const tagSlugs = (post.tags ?? []).map((id) => tagMap.get(id)).filter(Boolean)
 
  const frontmatter = `---
title: "${escapeQuotes(title)}"
description: "${escapeQuotes(excerpt)}"
date: ${date}
author: "Maciej Sala"
tags: ${JSON.stringify(tagSlugs)}
---
 
${contentMd}
`
 
  const outputPath = path.join('src/content/blog', `${slug}.mdx`)
  await fs.mkdir(path.dirname(outputPath), { recursive: true })
  await fs.writeFile(outputPath, frontmatter)
  console.log(`Wrote ${outputPath}`)
}
 
function stripHtml(html) {
  return html.replace(/<[^>]+>/g, '').trim()
}
 
function escapeQuotes(str) {
  return str.replace(/"/g, '\\"')
}
 
function decodeEntities(str) {
  // Prosty decoder dla najczęstszych entities
  return str
    .replace(/&amp;/g, '&')
    .replace(/&#8211;/g, '–')
    .replace(/&#8217;/g, "'")
}

Po uruchomieniu — masz folder src/content/blog/ wypełniony plikami MDX i teraz potrzebujesz Content Collections, żeby Astro je rozumiało:

Code
// src/content.config.ts
import { defineCollection } from 'astro:content'
import { glob } from 'astro/loaders'
import { z } from 'astro/zod'
 
const blog = defineCollection({
  loader: glob({ pattern: '**/*.mdx', base: './src/content/blog' }),
  schema: z.object({
    title: z.string(),
    description: z.string(),
    date: z.coerce.date(),
    author: z.string().default('Maciej Sala'),
    tags: z.array(z.string()).default([]),
    image: z.string().optional(),
    legacyWpId: z.number().optional(), // pomocne do debugowania
  }),
})
 
export const collections = { blog }

Szczegóły konfiguracji Content Collections opisuję w osobnym artykule.

Najczęstsze problemy przy transformacji

Shortcode'y WP (np. [gallery], [caption]) wychodzą jako tekst i trzeba je albo usunąć, albo przetłumaczyć na komponenty MDX. Prosty regex do usunięcia:

Code
contentMd = contentMd.replace(/\[caption[^\]]*\](.*?)\[\/caption\]/g, '$1')
contentMd = contentMd.replace(/\[gallery[^\]]*\]/g, '')

Tabele z <table> zwykle konwertują się poprawnie przez gfm. Problemy zaczynają się przy nietypowych strukturach, np. scalonych komórkach albo kolorowaniu. Takie fragmenty trzeba odtworzyć ręcznie albo zostawić jako bloki HTML w MDX.

Bloki kodu — jeśli masz wtyczkę typu SyntaxHighlighter, pliki po transformacji będą miały dziwne klasy. Turndown z gfm w większości ogarnia, ale sprawdź po ręcznym przeglądzie.

Linki wewnętrzne — posty często linkują do innych postów. Po migracji linki wciąż wskazują na stare URL WordPress. O tym za chwilę.

3. Migracja obrazów

WordPress trzyma obrazy w wp-content/uploads/rok/miesiąc/. Dwa podejścia:

A: Pobranie lokalne i użycie

Najlepsze dla SEO i wydajności. Skrypt pobierający wszystkie obrazy z treści:

Code
// download-images.mjs
import fs from 'node:fs/promises'
import path from 'node:path'
import fetch from 'node-fetch'
 
async function processFile(mdxPath) {
  let content = await fs.readFile(mdxPath, 'utf8')
  const images = [
    ...content.matchAll(
      /!\[([^\]]*)\]\((https:\/\/twojastrona\.pl\/wp-content\/uploads\/[^\)]+)\)/g,
    ),
  ]
 
  for (const [match, alt, url] of images) {
    const filename = path.basename(new URL(url).pathname)
    const localPath = `../../assets/blog/${filename}`
 
    // Download
    const res = await fetch(url)
    if (!res.ok) continue
    const buffer = await res.arrayBuffer()
    await fs.writeFile(`src/assets/blog/${filename}`, Buffer.from(buffer))
 
    // Replace in MDX
    content = content.replace(match, `![${alt}](${localPath})`)
  }
 
  await fs.writeFile(mdxPath, content)
}
 
const files = await fs.readdir('src/content/blog')
for (const file of files.filter((f) => f.endsWith('.mdx'))) {
  await processFile(path.join('src/content/blog', file))
}

W MDX dodajesz importy na górze każdego pliku (można to zautomatyzować skryptem) albo używasz wtyczki remark do automatycznej konwersji ![](...) na <Image src="...">.

B: Pozostawienie na starym serwerze

Szybsze, ale gorsze dla SEO — tracisz automatyczną optymalizację Astro, a może cierpieć. Rozważ tylko, jeśli masz gigabajty zdjęć i krótki deadline na migrację.

4. Mapowanie URL-i i przekierowania 301

To najbardziej krytyczny etap dla zachowania pozycji w Google. Każdy stary URL musi:

  • Zwracać odpowiedź (trwałe przekierowanie).
  • Wskazywać na równoważną stronę na nowej platformie.
  • Być obsłużony przez nowy serwer, zanim Google przecrawluje stronę.

WordPress domyślnie używa /2023/04/tytul-posta/ albo /category/slug/. Astro zwykle /blog/slug/. Mapowanie może wyglądać tak:

Code
/2023/04/jak-wybrac-framework/ → /blog/jak-wybrac-framework/
/category/astro/ → /blog/tag/astro/
/author/maciej/ → /o-mnie/

Generowanie mapy przekierowań

Jeśli masz jednolity wzorzec, np. wszystkie stare URL-e mają format /rok/miesiąc/slug/, a nowe mają mieć /blog/slug/, generujesz przekierowania automatycznie:

Code
// generate-redirects.mjs
import fs from 'node:fs/promises'
 
const posts = JSON.parse(await fs.readFile('wp-posts.json', 'utf8'))
 
const redirects = posts
  .map((post) => {
    const oldUrl = new URL(post.link).pathname // np. /2023/04/jak-wybrac-framework/
    const newUrl = `/blog/${post.slug}/`
    return `${oldUrl} ${newUrl} 301`
  })
  .join('\n')
 
await fs.writeFile('public/_redirects', redirects)

Format _redirects dla Cloudflare / Netlify

Code
/2023/04/jak-wybrac-framework/ /blog/jak-wybrac-framework/ 301
/2023/04/dlaczego-astro/ /blog/dlaczego-astro/ 301
/category/astro/ /blog/tag/astro/ 301
/category/nextjs/ /blog/tag/nextjs/ 301
/author/maciej/ /o-mnie/ 301

Plik public/_redirects Astro kopiuje do buildu. Netlify i Cloudflare potrafią zastosować taki plik na poziomie hostingu, ale szczegóły zależą od trybu wdrożenia. Dla migracji SEO najważniejsze jest, żeby przekierowanie było serwerowe i zwracało HTTP 301, a nie tylko klientowski meta refresh.

Alternatywnie — przekierowania w kodzie

Na adapterze Node lub Cloudflare Workers możesz zdefiniować przekierowania w astro.config.mjs:

Code
export default defineConfig({
  redirects: {
    '/2023/04/[slug]': '/blog/[slug]/',
    '/category/[slug]': '/blog/tag/[slug]/',
  },
})

W trybie serwerowym (output: 'server' lub trasa z prerender = false) Astro bez problemu zwróci prawidłowy status HTTP 301. Pułapka czai się w czysto statycznym buildzie, gdzie domyślnie generowane są pliki HTML z meta refresh. Dla użytkownika strona się przekieruje, ale dla Google to sygnał o niższej randze, który osłabia transfer autorytetu. Przy migracji serwisu z ruchem organicznym nie ma miejsca na kompromisy: jedynym słusznym rozwiązaniem są przekierowania na poziomie hostingu — przez plik _redirects, reguły Cloudflare, Netlify redirects albo konfigurację serwera.

Weryfikacja przekierowań

Po wdrożeniu sprawdź każde przekierowanie komendą:

Code
curl -I https://twojastrona.pl/2023/04/jak-wybrac-framework/

Oczekiwana odpowiedź:

Code
HTTP/2 301
location: https://twojastrona.pl/blog/jak-wybrac-framework/

Dla wielu URL-i użyj skryptu, który przechodzi po liście i loguje te, które nie zwracają 301.

5. Wdrożenie testowe i weryfikacja

Przed zmianą DNS rekomenduję pełny test na domenie testowej, np. staging.twojastrona.pl, albo na adresie podglądu z Cloudflare/Vercel.

Checklist:

  • Wszystkie posty wyświetlają się poprawnie (kod, obrazy, linki).
  • Sitemap generuje się i zawiera wszystkie strony.
  • Metadane (title, description, OG) są poprawne na każdej stronie.
  • Structured data (BlogPosting, FAQPage) walidują się w Rich Results Test.
  • Core Web Vitals na przynajmniej 5 losowych stronach są w zieleni.
  • Wszystkie przekierowania 301 działają i wskazują na właściwe strony.
  • robots.txt nie blokuje /blog/.
  • 404 error page wyświetla się dla nieistniejących URL (nie reloaduje do homepage).
  • Analytics (GA, Plausible) są zainstalowane i zbierają dane.

Szczerzej o tym, co sprawdzać pod kątem SEO, piszę w osobnym artykule.

6. Przełączenie produkcji i monitoring

Dzień D oznacza zmianę DNS i przekierowanie ruchu na nową wersję strony. Rekomenduję:

1. Obniż w DNS przed przełączeniem. Na 24 h przed migracją zmień TTL rekordów A/AAAA/CNAME na 300 s (5 min), a po przełączeniu propagacja zamiast 24-48 h zajmie kilka minut.

2. Zrób kopię zapasową WordPressa. Pełny backup plików i bazy przed wyłączeniem daje realną drogę powrotu.

3. Zaktualizuj DNS. CNAME na nowy hosting (Cloudflare / Vercel / Netlify).

4. Obserwuj Search Console. Sekcja Strony → Zaindeksowane pokaże, jak Google przetwarza przekierowania. Nowe URL-e zaczną się pojawiać zwykle w ciągu 1-14 dni.

5. Sprawdzaj błędy 4xx/5xx. Analytics i Search Console pokażą URL-e, które dostają 404 — to znak, że jakieś przekierowanie się zgubiło.

Plan wycofania zmian

Jeśli coś pójdzie krytycznie źle, cofasz DNS do starego serwera i uruchamiasz WordPressa z kopii zapasowej. W praktyce, jeśli środowisko testowe przeszło pełną weryfikację, ryzyko katastrofy jest niskie.

Monitoring po przełączeniu: pierwsze 14 dni

Największe ryzyko migracji nie kończy się w momencie podmiany DNS. Przez pierwsze dwa tygodnie trzeba aktywnie obserwować, czy Google i użytkownicy trafiają w te same odpowiedniki treści.

  • Codziennie sprawdzaj raport Strony w Google Search Console: 404, soft 404, Crawled - currently not indexed, błędy przekierowań.
  • Przetestuj próbkę najważniejszych starych URL-i przez curl -I i potwierdź status 301 oraz poprawny location.
  • Porównaj najważniejsze strony wejścia z GA/Plausible sprzed migracji z nowymi adresami po migracji.
  • Monitoruj logi 404 z hostingu i dopisuj brakujące przekierowania, zanim Google utrwali błąd.
  • Wyślij nową sitemapę w Search Console dopiero wtedy, gdy przekierowania i canonicale są już poprawne.
  • Nie zmieniaj jednocześnie slugów, struktury H1 i treści kluczowych sekcji, jeśli nie musisz. Jedna duża zmiana naraz jest łatwiejsza do zdiagnozowania.
Uwaga

Najgorszy scenariusz SEO to migracja URL-i połączona z masową zmianą treści. Jeśli celem jest zachowanie pozycji, najpierw przenieś strukturę i przekierowania, a dopiero później rozwijaj artykuły.

Co się dzieje z rankingami?

Realistyczne oczekiwania:

Tydzień 1-2: możliwe wahania widoczności. Skala zależy od wielkości serwisu, liczby URL-i, częstotliwości crawlowania, jakości przekierowań i tego, czy przy okazji zmieniłeś treść.

Kolejne tygodnie: Google stopniowo crawluje stare i nowe URL-e, przepisuje sygnały i stabilizuje indeks. Średni serwis często domyka większość migracji w kilka tygodni, ale większe lub bardziej złożone strony mogą potrzebować dłużej.

Miesiąc 2-3: jeśli przekierowania, canonicale i treść są poprawne, widoczność powinna się stabilizować. Lepsze Core Web Vitals mogą pomóc, ale nie kompensują utraty treści, złego mapowania URL-i ani błędów indeksacji.

Warunek: przekierowania 301 muszą działać niezawodnie, struktura informacyjna strony musi być zachowana, a treść nie może zostać zdegradowana podczas konwersji. Jeśli te warunki są spełnione, migracja jest neutralna dla SEO albo dodatnia.

Kiedy NIE migrować

Uczciwie — migracja nie dla każdego.

  • Jeśli treści edytuje zespół copywriterów bez dostępu do repo, a nie chcesz wprowadzać headless CMS — zostań na WordPressie.
  • Jeśli strona ma ciężko zależne od WP wtyczki (zaawansowany e-commerce, multi-vendor marketplace, kompleksowy forum), migracja oznacza przepisanie tych funkcji od zera.
  • Jeśli koszt migracji, czas programisty i ryzyko przekraczają potencjalne korzyści — zostań, gdzie jesteś. Nie każda strona potrzebuje Astro.

Werdykt Labu

Migracja WordPress → Astro to projekt z mierzalnym : 2–3 tygodnie pracy, wymierne zyski w wydajności ( 2–4 s → 0,5–1,5 s), SEO i kosztach hostingu. Kluczem do sukcesu są cztery filary: pełny eksport treści, staranne mapowanie URL-i z przekierowaniami 301, migracja obrazów do astro:assets i kompletne testy na środowisku staging przed przełączeniem produkcji.

Nie migruj na raty. Nie skracaj etapu testów. Monitoring przez pierwsze 14 dni jest nieodzowny.

Przeprowadziłem kilkanaście takich migracji.

Ultraszybkie projekty, łączące lekkość ze skalowalnością.
Astro
  • Co realnie wygrywasz na Astro1 min
  • Plan migracji — etapy1 min
  • 1. Eksport treści z WordPressa1 min
  • 2. Transformacja do MDX i import do Content Collections1 min
  • 3. Migracja obrazów1 min
  • 4. Mapowanie URL-i i przekierowania 3012 min
  • 5. Wdrożenie testowe i weryfikacja1 min
  • 6. Przełączenie produkcji i monitoring1 min
  • Monitoring po przełączeniu: pierwsze 14 dni1 min
  • Co się dzieje z rankingami?1 min
  • Kiedy NIE migrować1 min
  • Werdykt Labu1 min

Często zadawane pytania

Źródła i dokumentacjaZweryfikowano: 25 maja 2026

Materiały wykorzystane do weryfikacji artykułu o migracji bloga z WordPress na Astro:

Astro docs: Content Collections, Astro docs: astro:assets, Google Search Central: Site moves with URL changes, Cloudflare docs: Redirects, npm: turndown.

Seria

Astro w praktyce 2026
Część 9 / 10
  1. 1Pierwszy projekt w Astro — od npm create astro do wdrożenia w 15 minut
  2. 2Astro 6 — przewodnik po nowościach: Cloudflare Workers, Live Content Collections, Fonts API i CSP
  3. 3Architektura wysp w Astro — czym są wyspy i dlaczego zero JS domyślnie zmienia zasady gry
  4. 4Client directives w Astro — client:load, client:idle, client:visible, client:media, client:only w praktyce
  5. 5Astro Content Collections — typowany blog z walidacją Zod od podstaw
  6. 6Server Islands w Astro — dynamiczne fragmenty na statycznej stronie
  7. 7Astro View Transitions — płynne przejścia między stronami bez budowania SPA
  8. 8SEO w Astro — Core Web Vitals, dane uporządkowane i techniczny fundament rankingu w 2026
  9. Migracja bloga z WordPress na Astro — eksport treści, przekierowania 301 i zachowanie pozycji w Google
  10. 10Lighthouse 100/100 w Astro — case study optymalizacji strony usługowej
Maciej Sala

O autorze

Maciej Sala

Maciej Sala — Product Manager i Frontend Developer z bogatym doświadczeniem w marketingu internetowym oraz SEO. Na co dzień pracuje z Reactem, Next.js i TypeScriptem, a ostatnio także z Astro i narzędziami do automatyzacji procesów AI. Sprawnie łączy perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat był związany z branżą gier wideo jako project manager i game designer. Absolwent historii na Uniwersytecie Jagiellońskim oraz studiów podyplomowych z marketingu internetowego na AGH w Krakowie. Po godzinach trenuje na siłowni, maluje figurki i rozwija własne projekty side-projecty.

Moje artykułyWięcej o mnie

Pomagam przekładać takie tematy na konkretne wdrożenia w frontendzie, SEO, analityce i procesie produktowym.

Skontaktuj się ze mną

Biblioteka wiedzy

Czytaj dalej

Zobacz więcej wpisów
Migracja z WordPress do Next.js — redirecty 301 i pozycje SEO
Migracja z WordPress do Next.js — redirecty 301 i pozycje SEO

Migracja z WordPress do Next.js bez utraty widoczności w Google — jak zaplanować redirecty 301, zanim wyłączysz stary serwis.

Maciej Sala

Maciej Sala

Founder Strivelab

11 kwietnia 2026
Koszty utrzymania Astro i Cloudflare: kiedy statyczna strona jest tańsza niż WordPress
Koszty utrzymania Astro i Cloudflare: kiedy statyczna strona jest tańsza niż WordPress

Astro na Cloudflare: kilkanaście złotych zamiast kilkuset za WordPress. Kiedy naprawdę się to opłaca — konkretne liczby, nie obietnice.

Maciej Sala

Maciej Sala

Founder Strivelab

18 maja 2026
WordPress, Astro czy Next.js? Matryca decyzyjna, zanim ruszysz z migracją
WordPress, Astro czy Next.js? Matryca decyzyjna, zanim ruszysz z migracją

WordPress, Astro czy Next.js? Pięć zmiennych, które rozstrzygną to za Ciebie, zanim przepiszesz jedną linię kodu.

Maciej Sala

Maciej Sala

Founder Strivelab

29 maja 2026

Poprzedni wpis

React 19 Actions — formularz bez onSubmit, useOptimistic i useActionState w praktyce
React 19 Actions — formularz bez onSubmit, useOptimistic i useActionState w praktyce

Koniec z onSubmit i ręcznym stanem ładowania — React 19 Actions przepisują formularze od fundamentów. Migracja bez bólu głowy.

Maciej Sala

Maciej Sala

Founder Strivelab

24 kwietnia 2026

Następny wpis

Architektura wysp w Astro — czym są wyspy i dlaczego zero JS domyślnie zmienia zasady gry
Architektura wysp w Astro — czym są wyspy i dlaczego zero JS domyślnie zmienia zasady gry

Zero JS domyślnie to fundament Astro. Czym są wyspy, jak działa selektywna hydratacja i kiedy naprawdę ma to wpływ na wydajność?

Maciej Sala

Maciej Sala

Founder Strivelab

24 kwietnia 2026