WORDPRESS TO ASTRO MIGRATION FLOW WordPress PHP + MySQL Themes + Plugins wp_posts table ~200ms TTFB Export XML/JSON to Markdown + frontmatter Transform URLs + Images SEO + Redirects preserve slugs Astro Static HTML/CSS Markdown + MDX Cloudflare Pages ~20ms TTFB CDN Edge Global Export content, transform to Markdown, deploy as static site on CDN edge

O WordPress alimenta uma parcela significativa da web, mas para blogs focados em conteudo e sites de documentacao, o overhead de uma stack completa PHP/MySQL e cada vez mais dificil de justificar. Geradores de sites estaticos como o Astro entregam desempenho ultrarapido, eliminam praticamente todas as vulnerabilidades de seguranca e custam quase nada para hospedar.

Este guia acompanha voce por todo o processo de migracao de um blog WordPress para o Astro — desde a exportacao do seu conteudo e conversao para Markdown, ate a preservacao dos seus rankings de SEO e deploy no Cloudflare Pages. Isso nao e teoria: nos migramos o KnowledgeXchange.xyz (507 posts, 1.427 paginas construidas em 11 segundos) usando exatamente este processo.

Por que Migrar do WordPress para o Astro?

Desempenho

Uma pagina WordPress tipica requer multiplos ciclos de execucao PHP, consultas ao banco de dados e processamento de plugins antes de entregar o HTML ao navegador. Mesmo com cache agressivo, o Time to First Byte (TTFB) raramente cai abaixo de 200-400ms.

O Astro gera HTML estatico no momento do build. As paginas carregam em menos de 50ms a partir de um no edge de CDN. Nao ha processamento de servidor, nenhum banco de dados e nenhuma execucao PHP no momento da requisicao.

Seguranca

O WordPress e o CMS mais visado na internet. Cada plugin, tema e atualizacao do core e um vetor de ataque potencial. Injecao SQL, cross-site scripting, ataques de forca bruta no login e vulnerabilidades de upload de arquivos exigem vigilancia constante.

Arquivos HTML estaticos possuem uma superficie de ataque praticamente nula. Nao ha banco de dados para injetar, nenhum painel admin para forca bruta e nenhum PHP para explorar.

Custo

Um site WordPress tipicamente requer um VPS ($5-50/mes), hospedagem gerenciada ($25-200/mes) ou hospedagem compartilhada ($3-15/mes). Adicione plugins premium, ferramentas de seguranca e servicos de CDN.

Um site Astro no Cloudflare Pages custa $0/mes para a maioria dos blogs. Mesmo sites com alto trafego ficam dentro dos limites do plano gratuito porque servir arquivos estaticos e incrivelmente barato.

Experiencia do Desenvolvedor

O Astro usa ferramentas modernas: componentes escritos em arquivos .astro (semelhantes a HTML com JavaScript), Markdown/MDX para conteudo, suporte a TypeScript e um sistema de build ultrarapido baseado em Vite. Se voce ja lutou com a hierarquia de templates do WordPress, hooks no functions.php ou conflitos de plugins, vai apreciar a simplicidade.

Entendendo o Astro

O Astro e um gerador de sites estaticos moderno projetado para sites focados em conteudo. Recursos principais incluem:

  • Content Collections — Conteudo Markdown/MDX com tipagem segura e validacao de schema
  • Island Architecture — Envia zero JavaScript por padrao, hidrata componentes interativos apenas quando necessario
  • Framework Agnostic — Use componentes React, Vue, Svelte ou HTML puro
  • Otimizacoes Integradas — Otimizacao automatica de imagens, escopo de CSS e minificacao de HTML
  • Builds Rapidos — Sistema de build alimentado pelo Vite que lida com milhares de paginas de forma eficiente

Planejando a Migracao

Antes de tocar em qualquer codigo, planeje sua estrategia de migracao:

Inventario de Conteudo

  1. Conte seus posts, paginas e tipos de post personalizados — Conheca o escopo
  2. Catalogue sua midia — Imagens, PDFs, videos armazenados em wp-content/uploads
  3. Documente sua estrutura de URLs/2024/01/meu-post/ ou /categoria/meu-post/ ou /meu-post/
  4. Liste as paginas criticas de SEO — Paginas com melhor desempenho que devem manter seus rankings
  5. Identifique recursos dinamicos — Formularios de contato, comentarios, busca, e-commerce

Mapeamento de Recursos

Recurso WordPressEquivalente no Astro
Posts/PaginasArquivos Markdown em content collections
Categorias/TagsMetadados no frontmatter + paginas geradas
Imagens DestacadasComponente Image do Astro
ComentariosServico externo (Giscus, Disqus) ou remover
Formularios de ContatoCloudflare Workers, Formspree ou Netlify Forms
BuscaPagefind, Fuse.js ou Algolia
Feed RSSIntegracao @astrojs/rss
SitemapIntegracao @astrojs/sitemap
Metadados SEOComponentes <head> personalizados

Passo 1: Exportar o Conteudo do WordPress

Usando a Exportacao XML do WordPress

A partir do painel de administracao do WordPress:

  1. Navegue ate Ferramentas > Exportar
  2. Selecione Todo o conteudo
  3. Clique em Baixar arquivo de exportacao

Isso gera um arquivo XML WXR (WordPress eXtended RSS) contendo todos os posts, paginas, comentarios, categorias, tags e referencias de midia.

Usando a API REST (Alternativa)

Para mais controle, voce pode obter o conteudo via API REST do WordPress:

# Buscar todos os posts (paginado, 100 por pagina)
curl -s "https://knowledgexchange.xyz/wp-json/wp/v2/posts?per_page=100&page=1" > posts-page1.json
curl -s "https://knowledgexchange.xyz/wp-json/wp/v2/posts?per_page=100&page=2" > posts-page2.json

# Buscar todas as categorias
curl -s "https://knowledgexchange.xyz/wp-json/wp/v2/categories?per_page=100" > categories.json

# Buscar todas as tags
curl -s "https://knowledgexchange.xyz/wp-json/wp/v2/tags?per_page=100" > tags.json

# Buscar biblioteca de midia
curl -s "https://knowledgexchange.xyz/wp-json/wp/v2/media?per_page=100&page=1" > media-page1.json

Passo 2: Converter Conteudo para Markdown

Script de Migracao em Node.js

Aqui esta um script pratico em Node.js que converte XML do WordPress para arquivos Markdown com frontmatter compativel com o Astro:

// migrate.mjs
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
import { XMLParser } from 'fast-xml-parser';
import TurndownService from 'turndown';
import slugify from 'slugify';

const turndown = new TurndownService({
  headingStyle: 'atx',
  codeBlockStyle: 'fenced',
  bulletListMarker: '-',
});

// Parse the WordPress XML export
const xml = readFileSync('wordpress-export.xml', 'utf-8');
const parser = new XMLParser({ ignoreAttributes: false });
const data = parser.parse(xml);

const items = data.rss.channel.item;
const posts = Array.isArray(items) ? items : [items];

const outputDir = './src/content/posts';
if (!existsSync(outputDir)) mkdirSync(outputDir, { recursive: true });

let count = 0;

for (const post of posts) {
  const status = post['wp:status'];
  const postType = post['wp:post_type'];
  if (status !== 'publish' || postType !== 'post') continue;

  const title = post.title?.toString() || 'Untitled';
  const date = post['wp:post_date']?.split(' ')[0] || '2024-01-01';
  const content = post['content:encoded'] || '';
  const slug = post['wp:post_name'] || slugify(title, { lower: true, strict: true });

  const markdown = turndown.turndown(content);

  const frontmatter = [
    '---',
    `title: "${title.replace(/"/g, '\\"')}"`,
    `date: "${date}"`,
    `slug: "${slug}"`,
    `author: "JC"`,
    `lang: "en"`,
    '---',
  ].join('\n');

  const fileContent = `${frontmatter}\n\n${markdown}\n`;
  writeFileSync(`${outputDir}/${slug}.md`, fileContent, 'utf-8');
  count++;
}

console.log(`Migrated ${count} posts to ${outputDir}`);

Instale as dependencias e execute:

npm install fast-xml-parser turndown slugify
node migrate.mjs

Passo 3: Lidar com Imagens

O WordPress armazena imagens em diretorios wp-content/uploads/YYYY/MM/. Voce tem varias opcoes:

Opcao A: Baixar e Armazenar Localmente

# Baixar todas as imagens referenciadas nos seus posts
wget --mirror --no-parent --reject "index.html*" \
  https://knowledgexchange.xyz/wp-content/uploads/ \
  -P ./public/wp-content/uploads/

Opcao B: Usar uma CDN (Recomendado)

Mantenha as imagens em uma CDN externa como Cloudflare R2, AWS S3 ou Cloudinary. Isso mantem seu repositorio pequeno e os tempos de build rapidos.

Passo 4: Preservar a Estrutura de URLs

Manter sua estrutura de URLs existente e critico para o SEO. Configure o roteamento do Astro para corresponder ao formato de permalink do seu WordPress.

Rota Dinamica para Posts

Crie o arquivo src/pages/post/[slug].astro:

---
import { getCollection } from 'astro:content';
import PostLayout from '../../layouts/PostLayout.astro';

export async function getStaticPaths() {
  const posts = await getCollection('posts');
  return posts.map((post) => ({
    params: { slug: post.data.slug },
    props: { post },
  }));
}

const { post } = Astro.props;
const { Content } = await post.render();
---
<PostLayout frontmatter={post.data}>
  <Content />
</PostLayout>

Lidando com Redirecionamentos para URLs Alteradas

Se sua estrutura de URLs mudar, crie um arquivo _redirects para o Cloudflare Pages:

# Redirecionar URLs antigas do WordPress para novas URLs do Astro
/2024/01/my-old-post/  /post/my-old-post/  301
/category/linux/        /categories/linux/  301
/tag/ubuntu/            /tags/ubuntu/       301

# Redirecionar URLs de admin e feed do WordPress
/wp-admin/*             /                   301
/wp-login.php           /                   301
/feed/                  /rss.xml            301

Passo 5: Configurar Content Collections do Astro

Defina seu schema de conteudo em src/content.config.ts:

import { defineCollection, z } from 'astro:content';

const posts = defineCollection({
  type: 'content',
  schema: z.object({
    title: z.string(),
    date: z.string(),
    lastModified: z.string().optional(),
    categories: z.array(z.string()).default([]),
    tags: z.array(z.string()).default([]),
    author: z.string().default('JC'),
    slug: z.string(),
    description: z.string().optional(),
    lang: z.enum(['en', 'es']).default('en'),
    difficulty: z.enum(['beginner', 'intermediate', 'advanced']).optional(),
    featured: z.boolean().default(false),
    readingTime: z.number().optional(),
  }),
});

export const collections = { posts };

Dica: O Astro valida cada arquivo Markdown contra este schema no momento do build. Se um post migrado tiver frontmatter ausente ou malformado, o build falhara com uma mensagem de erro clara apontando para o arquivo e campo exatos.

Passo 6: Preservacao de SEO

Sitemap

npx astro add sitemap

Feed RSS

npm install @astrojs/rss

Dados Estruturados (JSON-LD)

Adicione dados estruturados ao layout do seu post para resultados de busca enriquecidos.

Passo 7: Deploy no Cloudflare Pages

Conectar Seu Repositorio

  1. Faca push do seu projeto Astro para um repositorio Git (GitHub, GitLab)
  2. Faca login no Painel do Cloudflare
  3. Navegue ate Workers & Pages > Criar Aplicacao > Pages
  4. Conecte seu repositorio Git
  5. Configure as opcoes de build:
    • Comando de build: npm run build
    • Diretorio de saida do build: dist
    • Versao do Node.js: 20 (definida via variavel de ambiente NODE_VERSION=20)

Desempenho do Build

Os builds do Cloudflare Pages sao rapidos. Como referencia, nossa migracao do KnowledgeXchange:

  • 507 posts convertidos em entradas de content collection Markdown
  • 1.427 paginas totais geradas (posts + paginas de categorias + paginas de tags + paginas de indice)
  • Tempo de build: 11 segundos no Cloudflare Pages

A Migracao do KnowledgeXchange: Um Estudo de Caso

Quando migramos o KnowledgeXchange.xyz do WordPress para o Astro, enfrentamos varios desafios do mundo real:

Desafio 1: Formatacao HTML Legada

Muitos posts mais antigos do WordPress continham HTML bruto, shortcodes e marcacao especifica de plugins. Nosso script de conversao tratou os casos comuns, mas aproximadamente 15% dos posts exigiram limpeza manual.

Licao aprendida: Reserve tempo para revisao manual. A conversao automatizada leva voce 85% do caminho; os 15% restantes precisam de atencao humana.

Desafio 2: Referencias de Imagens

Nossos 507 posts referenciavam centenas de imagens armazenadas na estrutura de diretorios wp-content/uploads do WordPress. Optamos por manter a mesma estrutura de diretorios na pasta public/ para minimizar mudancas de URL.

Licao aprendida: Mantenha os mesmos caminhos de URL de imagens quando possivel.

Desafio 3: Conteudo Multilingue

O KnowledgeXchange tem conteudo em ingles e espanhol. Usamos o campo lang no frontmatter para categorizar posts e gerar paginas de indice especificas por idioma.

Licao aprendida: Planeje sua estrategia de internacionalizacao antes da migracao.

Desafio 4: Preservando Rankings de SEO

Criamos regras de redirecionamento abrangentes para quaisquer URLs que mudaram de formato. Enviamos o novo sitemap ao Google Search Console imediatamente apos o lancamento.

Licao aprendida: Envie seu sitemap aos mecanismos de busca no mesmo dia em que lancar.

Resultados

Apos a migracao:

  • Tempo de carregamento da pagina caiu de uma media de 1,2s para menos de 100ms
  • Pontuacao de desempenho do Lighthouse foi de 67 para 99
  • Custo de hospedagem caiu de $15/mes para $0/mes (plano gratuito do Cloudflare Pages)
  • Incidentes de seguranca foram de tentativas ocasionais de forca bruta para zero
  • Build e deploy leva 30 segundos do git push ao site ao vivo

Licoes Aprendidas e Melhores Praticas

  1. Nao migre tudo de uma vez. Comece com um subconjunto de posts, verifique a saida, depois processe o arquivo completo.

  2. Mantenha seu site WordPress funcionando durante a migracao. Aponte um subdominio como old.knowledgexchange.xyz para ele como referencia enquanto voce verifica a versao no Astro.

  3. Teste os redirecionamentos exaustivamente. Use ferramentas como Screaming Frog ou um script simples para rastrear seu sitemap antigo e verificar se cada URL resolve corretamente no novo site.

  4. Preserve a URL do seu feed RSS ou redirecione-a. Assinantes que dependem do seu feed nao devem perder o acesso.

  5. Configure analytics desde o primeiro dia no novo site para que voce possa comparar os padroes de trafego antes e depois da migracao.

  6. Use content collections para tipagem segura. A validacao de schema do Astro detecta erros de frontmatter no momento do build, prevenindo paginas quebradas em producao.

  7. Faca commit dos seus scripts de migracao no repositorio. Voce pode precisar reexecuta-los se descobrir problemas semanas depois.

Resumo

Migrar do WordPress para o Astro e um empreendimento significativo, mas os beneficios sao substanciais: tempos de carregamento mais rapidos, melhor seguranca, custos mais baixos e uma experiencia de desenvolvimento moderna. A chave e o planejamento metodico, a conversao automatizada de conteudo e a preservacao cuidadosa do SEO.

Com content collections, o Astro oferece manipulacao de Markdown com tipagem segura que escala para centenas ou milhares de posts. Combinado com o Cloudflare Pages para hospedagem, voce obtem uma infraestrutura de blog de nivel de producao que nao custa nada para operar e lida com qualquer volume de trafego.

Para topicos relacionados ao WordPress, veja nossos guias sobre deploy do WordPress no Ubuntu e permissoes de arquivo do WordPress no Linux.