Superou WordPress? Um Guia de Migração para Next.js + Supabase
Perdi a conta de quantas vezes ouvi isso: "WordPress funcionava bem quando começamos, mas agora..." E então vem a lista. O site leva 6 segundos para carregar. O plugin de formulário de contato quebrou após a última atualização. Há uma vulnerabilidade crítica em um plugin que não é mantido desde 2022. O desenvolvedor que construiu o tema original desapareceu. Soa familiar?
Eis o ponto -- WordPress alimenta mais de 40% da web, e com razão. É acessível, tem um ecossistema massivo, e colocou muitos negócios online rapidamente. Mas há uma diferença entre uma ferramenta que te coloca no caminho certo e uma ferramenta que cresce com você. Se você está lendo isto, provavelmente bateu nesse limite. Deixa eu te guiar pelo que é uma migração real de WordPress para uma arquitetura headless Next.js + Supabase -- não a versão de marketing, mas o playbook de engenharia real.
Índice
- Sinais de Que Você Realmente Superou WordPress
- O Imposto do WordPress: O Que Plugin Hell Realmente Custa
- Por Que Next.js + Supabase É a Stack Que Faz Sentido
- O Playbook de Migração: Fase por Fase
- Migração de Dados: Tirando Seu Conteúdo do WordPress
- Construindo o Novo Frontend com Next.js
- Configurando Supabase como Seu Backend
- Lidar com Autenticação e Dados de Usuário
- Preservação de SEO: Não Perca o Que Você Construiu
- Benchmarks de Performance: Antes e Depois
- Comparação de Custos: WordPress vs Stack Headless
- FAQ

Sinais de Que Você Realmente Superou WordPress
Nem todo mundo precisa sair do WordPress. Quero ser franco sobre isso. Se você está executando um blog pessoal ou um site de brochura para um negócio local, WordPress com um tema decente e alguns plugins provavelmente ainda é a opção certa. Mas há sinais claros de que você superou:
Conflitos de Plugin Estão Quebrando Coisas Mensalmente
Você atualiza WooCommerce e seu page builder quebra. Você atualiza seu page builder e seu plugin de SEO lança avisos. Você atualiza PHP para 8.2 porque seu host exige, e três plugins param de funcionar completamente. Isso não é um bug -- é a arquitetura. Plugins do WordPress todos compartilham o mesmo escopo global, os mesmos hooks, o mesmo banco de dados. Cada plugin é um conflito potencial com todo outro plugin.
Já auditei sites WordPress executando 30, 40, até 60+ plugins ativos. Nesse ponto, você não está mantendo um site. Você está mantendo uma torre de Jenga.
Performance Se Tornou Um Trabalho em Tempo Integral
Seu PageSpeed score está na casa dos 30. Você instalou um plugin de caching, um plugin de otimização de imagens, um plugin de minificação, e um plugin de CDN -- tudo para corrigir problemas de performance criados pelos outros 25 plugins. A ironia é espessa.
WordPress gera páginas dinamicamente em cada requisição (a menos que em cache). Cada plugin pode injetar seus próprios arquivos CSS e JavaScript. Uma página WordPress típica com plugins populares carrega 15-30 recursos separados que bloqueiam renderização. Os dados do Google 2024 Core Web Vitals mostram que sites WordPress têm uma taxa de aprovação de 33% em todas as três métricas CWV, comparado a 52% para sites construídos com frameworks JavaScript modernos.
Vulnerabilidades de Segurança Te Deixam Acordado à Noite
O banco de dados de vulnerabilidades WPScan 2024 rastreou mais de 7.000 novas vulnerabilidades do WordPress naquele ano -- a grande maioria em plugins e temas. Se você está executando um site que lida com dados de usuário, pagamentos, ou qualquer tipo de informação sensível, cada plugin é uma superfície de ataque. Patchstack informou que 97% das vulnerabilidades de segurança do WordPress em 2024 vieram de plugins.
Você está essencialmente confiando a dezenas de desenvolvedores independentes -- muitos dos quais mantêm plugins como projetos secundários -- a sua postura de segurança.
Sua Equipe de Dev Odeia Trabalhar Nele
Esse é subestimado. Bons desenvolvedores não querem mais trabalhar em WordPress. O fluxo de trabalho PHP-template-spaghetti-with-ACF-fields é doloroso comparado ao desenvolvimento moderno baseado em componentes. Se você está tentando atrair e reter talento de engenharia, sua stack de tecnologia importa.
O Imposto do WordPress: O Que Plugin Hell Realmente Custa
Deixa eu colocar alguns números nisso. Para um site WordPress de tamanho médio (digamos um site de e-commerce ou um site de marketing de SaaS com um blog, contas de usuário, e funcionalidade personalizada), aqui está o que o "imposto do WordPress" tipicamente parece anualmente:
| Categoria de Custo | Estimativa Anual |
|---|---|
| Licenças de plugins premium (15-20 plugins) | $1.500 - $4.000 |
| Hospedagem WordPress gerenciada (WP Engine, Kinsta) | $1.200 - $6.000 |
| Monitoramento de segurança + limpeza (Sucuri, Wordfence) | $300 - $500 |
| Tempo de otimização de performance (horas de desenvolvedor) | $3.000 - $8.000 |
| Debug de conflito de plugin (horas de desenvolvedor) | $2.000 - $6.000 |
| Correções de emergência de atualizações quebrando coisas | $1.000 - $4.000 |
| Imposto Anual Total do WordPress | $9.000 - $28.500 |
Isso é antes de você construir uma única nova funcionalidade. É o custo de apenas manter as luzes acesas.
Por Que Next.js + Supabase É a Stack Que Faz Sentido
Há uma dúzia de maneiras de ir headless. Você poderia usar Gatsby (embora esteja essencialmente em modo de manutenção desde que Netlify o adquiriu). Você poderia usar Remix, Astro, ou SvelteKit. Para o backend, você poderia usar Firebase, PlanetScale, ou uma API personalizada.
Mas para equipes migrando do WordPress em 2025, Next.js + Supabase atinge um ponto doce difícil de vencer. Aqui está o porquê.
Next.js: O Frontend Que Faz Tudo
Next.js 15 (estável desde outubro de 2024) te oferece componentes de servidor por padrão, o que significa que você obtém a performance de sites estáticos com a flexibilidade de dinâmicos. Você pode gerar estaticamente seus posts de blog em tempo de compilação, renderizar no servidor suas páginas dinâmicas, e renderizar no cliente componentes interativos -- tudo no mesmo app.
Para equipes vindas do WordPress, os benefícios-chave são:
- Otimização de imagem integrada -- substitui 2-3 plugins do WordPress
- Code splitting automático -- cada página carrega apenas o JS que precisa
- Edge middleware -- lidar com redirecionamentos, autenticação, e testes A/B no nível da CDN
- Incremental Static Regeneration (ISR) -- reconstruir páginas individuais sem deployments completos
- App Router com React Server Components -- reduz dramaticamente o JavaScript do lado do cliente
Construímos muitos projetos Next.js na Social Animal (confira nossas capacidades de desenvolvimento Next.js), e a diferença de performance versus WordPress é consistentemente dramática.
Supabase: O Backend Que WordPress Gostaria de Ter
Supabase é uma alternativa de código aberto ao Firebase construída sobre PostgreSQL. Te oferece:
- Um banco de dados Postgres completo com uma API REST e GraphQL auto-gerada do seu schema
- Autenticação integrada (email, OAuth, magic links, SSO)
- Políticas de segurança de nível de linha para controle de acesso granular
- Assinaturas em tempo real via WebSockets
- Edge Functions para lógica de backend sem servidor
- Armazenamento para uploads de arquivo com entrega via CDN
Para migrações do WordPress especificamente, Supabase é brilhante porque WordPress usa MySQL, e seu modelo de dados mapeia surpreendentemente bem para PostgreSQL. Tipos de post personalizados se tornam tabelas. Post meta se torna colunas JSONB. Dados de usuário mapeiam quase 1:1.
A camada gratuita do Supabase inclui 500MB de banco de dados, 1GB de armazenamento, e 50.000 usuários ativos mensais em autenticação. Seu plano Pro a $25/mês cobre a maioria dos sites em produção. Compare isso aos $30-$100/mês que você está pagando apenas por hospedagem WordPress gerenciada.

O Playbook de Migração: Fase por Fase
Aqui está a abordagem que refini ao longo de dúzias de migrações do WordPress. Não é um projeto de fim de semana -- reserve 4-12 semanas dependendo da complexidade do site -- mas é previsível e de baixo risco se você seguir as fases.
Fase 1: Auditoria e Arquitetura (Semana 1)
Antes de você escrever uma única linha de código:
- Exporte uma lista completa de plugins com
wp plugin list --status=active(WP-CLI) - Mapeie cada plugin para seu substituto na nova stack
- Exporte sua estrutura de URL completa incluindo todos os posts, páginas, taxonomias, e tipos de post personalizados
- Documente todos os formulários, integrações, e conexões de terceiros
- Identifique funcionalidade personalizada que vive no
functions.phpdo seu tema
O exercício de mapeamento de plugins é crítico. Aqui está o que substituições comuns parecem:
| Plugin do WordPress | Substituto Headless |
|---|---|
| Yoast SEO | API de metadata integrada do Next.js + generateMetadata() |
| WP Super Cache / W3 Total Cache | Não necessário (estático por padrão) |
| Wordfence / Sucuri | Supabase RLS + proteção DDoS integrada do Vercel |
| Contact Form 7 / Gravity Forms | React Hook Form + Supabase Edge Function |
| WooCommerce | Saleor, Medusa.js, ou Shopify Storefront API |
| ACF / Custom Fields | Tabelas do Supabase com schemas digitados |
| WP Migrate DB | Script de migração única do Supabase |
| Smush / ShortPixel | Componente Next.js Image (integrado) |
| Elementor / WPBakery | Componentes React (você não vai sentir falta) |
Fase 2: Configure a Nova Stack (Semana 2)
# Crie seu projeto Next.js
npx create-next-app@latest my-site --typescript --tailwind --app --src-dir
# Instale Supabase
npm install @supabase/supabase-js @supabase/ssr
# Configure variáveis de ambiente
cp .env.example .env.local
Seu .env.local:
NEXT_PUBLIC_SUPABASE_URL=https://seu-projeto.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=sua-chave-anon
SUPABASE_SERVICE_ROLE_KEY=sua-chave-service-role
Deploy para Vercel imediatamente. Sim, antes de você ter construído qualquer coisa significativa. Ter uma URL de preview ao vivo desde o dia um muda como você trabalha -- stakeholders podem ver progresso, e você pega problemas de deployment cedo.
Migração de Dados: Tirando Seu Conteúdo do WordPress
É aqui que a maioria dos guias de migração ficam imprecisos. Deixa eu ser específico.
Passo 1: Exporte Dados do WordPress
Não use a exportação XML integrada do WordPress. É incompleta e mal estruturada. Em vez disso, use WP-CLI e queries diretas de banco de dados:
# Exporte posts como JSON
wp post list --post_type=post --format=json --fields=ID,post_title,post_content,post_excerpt,post_date,post_status,post_name > posts.json
# Exporte páginas
wp post list --post_type=page --format=json --fields=ID,post_title,post_content,post_excerpt,post_date,post_status,post_name > pages.json
# Exporte tipos de post personalizados
wp post list --post_type=seu_cpt --format=json > cpt.json
# Exporte post meta (campos ACF, etc.)
wp eval 'global $wpdb; $results = $wpdb->get_results("SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE meta_key NOT LIKE \"_%\""); echo json_encode($results);' > postmeta.json
Passo 2: Transforme e Carregue no Supabase
Escreva um script de migração. Prefiro TypeScript para isso:
import { createClient } from '@supabase/supabase-js'
import posts from './exports/posts.json'
const supabase = createClient(
process.env.SUPABASE_URL!,
process.env.SUPABASE_SERVICE_ROLE_KEY!
)
async function migratePosts() {
for (const post of posts) {
const { error } = await supabase.from('posts').insert({
wp_id: post.ID,
title: post.post_title,
slug: post.post_name,
content: convertWpContentToMdx(post.post_content),
excerpt: post.post_excerpt,
published_at: post.post_date,
status: post.post_status === 'publish' ? 'published' : 'draft',
})
if (error) console.error(`Falha ao migrar post ${post.ID}:`, error)
}
}
function convertWpContentToMdx(html: string): string {
// Use turndown ou rehype para converter HTML do WordPress para MDX
// Lidar com shortcodes, embeds, e blocos Gutenberg
// É aqui que 80% da complexidade de migração vive
}
A função convertWpContentToMdx é onde você passará mais tempo. Conteúdo do WordPress é uma bagunça de HTML, shortcodes, comentários de bloco Gutenberg, e URLs oEmbed incorporadas. Bibliotecas como turndown lidam com conversão básica de HTML-para-Markdown, mas você precisará de regras personalizadas para shortcodes e blocos.
Passo 3: Migre Mídia
import { createClient } from '@supabase/supabase-js'
import fetch from 'node-fetch'
async function migrateMedia(mediaItems: any[]) {
for (const item of mediaItems) {
const response = await fetch(item.source_url)
const buffer = await response.buffer()
const { error } = await supabase.storage
.from('media')
.upload(`uploads/${item.slug}.${item.mime_type.split('/')[1]}`, buffer, {
contentType: item.mime_type,
})
if (error) console.error(`Falha ao enviar ${item.slug}:`, error)
}
}
Construindo o Novo Frontend com Next.js
Com seus dados no Supabase, construir o frontend é a parte divertida. Aqui está uma página de post de blog típica usando Next.js App Router:
// src/app/blog/[slug]/page.tsx
import { createClient } from '@/lib/supabase/server'
import { notFound } from 'next/navigation'
import { MDXRemote } from 'next-mdx-remote/rsc'
export async function generateMetadata({ params }: { params: { slug: string } }) {
const supabase = createClient()
const { data: post } = await supabase
.from('posts')
.select('title, excerpt, og_image')
.eq('slug', params.slug)
.single()
if (!post) return {}
return {
title: post.title,
description: post.excerpt,
openGraph: { images: [post.og_image] },
}
}
export default async function BlogPost({ params }: { params: { slug: string } }) {
const supabase = createClient()
const { data: post } = await supabase
.from('posts')
.select('*')
.eq('slug', params.slug)
.eq('status', 'published')
.single()
if (!post) notFound()
return (
<article className="prose lg:prose-xl mx-auto">
<h1>{post.title}</h1>
<time dateTime={post.published_at}>
{new Date(post.published_at).toLocaleDateString()}
</time>
<MDXRemote source={post.content} />
</article>
)
}
Repare que não há plugin de caching, nenhum plugin de performance, nenhum plugin de SEO. A API de metadata lida com SEO. Componentes de servidor lidam com performance. A CDN lida com caching. Está tudo integrado.
Configurando Supabase como Seu Backend
Seu schema do Supabase deve ser projetado em torno de suas necessidades de dados reais, não na estrutura genérica wp_posts / wp_postmeta do WordPress. Aqui está um schema mais limpo:
-- Tabela de Posts
create table posts (
id uuid default gen_random_uuid() primary key,
title text not null,
slug text unique not null,
content text,
excerpt text,
featured_image text,
status text default 'draft' check (status in ('draft', 'published', 'archived')),
author_id uuid references auth.users(id),
published_at timestamptz,
created_at timestamptz default now(),
updated_at timestamptz default now(),
metadata jsonb default '{}'
);
-- Categorias
create table categories (
id uuid default gen_random_uuid() primary key,
name text not null,
slug text unique not null,
description text
);
-- Row Level Security
alter table posts enable row level security;
create policy "Posts publicados são visíveis por todos"
on posts for select
using (status = 'published');
create policy "Autores podem gerenciar seus próprios posts"
on posts for all
using (auth.uid() = author_id);
A coluna metadata jsonb é sua saída de emergência. Qualquer campo personalizado que não mereça sua própria coluna pode viver lá. É indexado, consultável, e infinitamente flexível -- como campos ACF mas sem o plugin.
Lidar com Autenticação e Dados de Usuário
Se seu site WordPress tem contas de usuário, Supabase Auth lida com a migração de forma limpa. Você não pode migrar hashes de senha (WordPress usa phpass, Supabase usa bcrypt), mas você pode:
- Importar emails de usuário e perfis no Supabase
- Disparar um fluxo de "resete sua senha" para todos os usuários no primeiro login
- Ou usar autenticação de magic link para que senhas não sejam necessárias
Supabase suporta email/senha, Google, GitHub, Apple, e dezenas de outros provedores OAuth nativamente. Nenhum plugin necessário.
Preservação de SEO: Não Perca o Que Você Construiu
Isso é inegociável. Uma migração mal feita pode destruir anos de equidade de SEO durante a noite. Aqui está a checklist:
Mapeie cada URL antiga para sua nova URL. WordPress usa
/2024/01/post-title/por padrão. Seu novo site poderia usar/blog/post-title. Cada URL antiga precisa de um redirecionamento 301.Implemente redirecionamentos no Next.js:
// next.config.js
module.exports = {
async redirects() {
return [
// URLs WordPress baseadas em data para slugs limpos
{
source: '/:year(\\d{4})/:month(\\d{2})/:slug',
destination: '/blog/:slug',
permanent: true,
},
// Páginas de categoria
{
source: '/category/:slug',
destination: '/blog/category/:slug',
permanent: true,
},
]
},
}
- Preserve todos os meta titles, descrições, e dados estruturados. Exporte-os do Yoast antes da migração.
- Envie o novo sitemap para Google Search Console imediatamente após o lançamento.
- Mantenha o site antigo rodando em um subdomínio (old.yoursite.com) por 30 dias como fallback.
Benchmarks de Performance: Antes e Depois
Aqui estão números reais de migrações que fizemos na Social Animal (estas são médias através de 12 projetos de migração em 2024-2025):
| Métrica | WordPress (Antes) | Next.js + Supabase (Depois) | Melhoria |
|---|---|---|---|
| Lighthouse Performance Score | 38 | 94 | +147% |
| Largest Contentful Paint (LCP) | 4.2s | 0.9s | -79% |
| First Input Delay (FID) | 180ms | 12ms | -93% |
| Cumulative Layout Shift (CLS) | 0.25 | 0.02 | -92% |
| Time to First Byte (TTFB) | 1.8s | 0.15s | -92% |
| Peso Total da Página | 3.2MB | 420KB | -87% |
| Requisições HTTP | 47 | 8 | -83% |
Estes não são cherry-picked. São consistentes. Quando você elimina 30+ plugins, cada um injetando seu próprio CSS e JS, e substitui renderização PHP dinâmica por componentes React estáticos/renderizados no servidor em uma CDN global, os resultados são previsíveis.
Se você está curioso sobre o que esse tipo de resultado poderia parecer para seu projeto, nossa página de pricing detalha o que projetos de migração headless tipicamente custam.
Comparação de Custos: WordPress vs Stack Headless
| WordPress (Anual) | Next.js + Supabase (Anual) | |
|---|---|---|
| Hospedagem | $1.200 - $6.000 (WP Engine/Kinsta) | $0 - $240 (Vercel Pro) |
| Banco de Dados/Backend | Incluído na hospedagem | $0 - $300 (Supabase Pro) |
| Licenças de Plugin | $1.500 - $4.000 | $0 |
| Ferramentas de Segurança | $300 - $500 | $0 (integrado) |
| CDN | $0 - $600 | $0 (incluído com Vercel) |
| Horas de Dev de Manutenção | $6.000 - $18.000 | $1.000 - $4.000 |
| Total | $9.000 - $29.100 | $1.000 - $4.540 |
A stack headless é 70-85% mais barata para operar anualmente. A migração em si tem um custo inicial, obviamente -- tipicamente $15.000-$60.000 dependendo da complexidade para um build profissional (veja nossos serviços de desenvolvimento de headless CMS para detalhes específicos). Mas se paga em 6-18 meses através de custos operacionais reduzidos sozinho, antes de você considerar o impacto de receita de melhor performance e SEO.
FAQ
Preciso aprender React/Next.js para gerenciar meu conteúdo após migração?
Não. A maioria das equipes emparelham Next.js com um headless CMS como Sanity, Contentful, ou até WordPress usado puramente como um headless CMS (via sua API REST). Editores de conteúdo nunca tocam código. Eles obtêm uma interface de edição limpa, e o frontend puxa conteúdo via API. Se você quer manter o editor WordPress que sua equipe já conhece, você absolutamente pode -- apenas remova o frontend do WordPress e use como um backend de conteúdo.
Quanto tempo uma migração típica do WordPress para Next.js leva?
Para um site focado em conteúdo com um blog e páginas padrão: 4-6 semanas. Para um site com e-commerce, contas de usuário, tipos de post personalizados, e funcionalidade complexa: 8-14 semanas. A maior variável é a complexidade do conteúdo -- sites com conteúdo fortemente dependente de shortcode ou blocos Gutenberg profundamente customizados levam mais tempo para migrar de forma limpa.
Vou perder meus rankings do Google durante a migração?
Não se você lidar com redirecionamentos corretamente. Redirecionamentos 301 preservam ~90-99% de link equity. Tipicamente vemos uma pequena queda nas primeiras 1-2 semanas após migração (Google precisa recrawl), seguida por rankings melhorados devido a melhores pontuações de Core Web Vitals. A chave é mapear cada URL única e não fazer launch até que seu mapa de redirecionamento esteja completo.
Supabase é production-ready para sites de alto tráfego?
Sim. Supabase roda em infraestrutura AWS e tem sido usada em produção por empresas lidando com milhões de requisições. Seu banco de dados é apenas PostgreSQL -- possivelmente o banco de dados mais battle-tested que existe. A partir de 2025, Supabase serve mais de 1 milhão de bancos de dados e processa bilhões de requisições de API diariamente. Para escala adicional, seus planos Pro ($25/mês) e Team ($599/mês) incluem recursos dedicados e suporte prioritário.
Posso migrar WooCommerce para essa stack?
Você pode, mas e-commerce adiciona complexidade significativa. A maioria das equipes migrando do WooCommerce vão para Shopify (usando a Storefront API com um frontend Next.js) ou uma solução de código aberto como Medusa.js ou Saleor. Supabase pode lidar com catálogos de produtos e gerenciamento de pedidos, mas você precisaria construir checkout, processamento de pagamento, gerenciamento de inventário, e cálculo de imposto você mesmo. Para a maioria dos negócios, usar um backend de e-commerce dedicado e conectar com Next.js faz mais sentido.
E sobre WordPress multisite -- essa stack pode substituir?
Absolutamente. Next.js tem excelente suporte para arquiteturas multi-tenant usando middleware e roteamento dinâmico. Supabase's Row Level Security torna direto particionar dados por tenant. Migramos redes WordPress multisite com 50+ sites para uma única aplicação Next.js com roteamento específico de tenant, e a simplificação operacional foi enorme.
Ainda preciso de um CMS, ou posso apenas usar Supabase diretamente?
Supabase te oferece um editor de tabela que funciona para desenvolvedores, mas editores de conteúdo usualmente querem algo mais polido. As abordagens mais comuns são: (1) use um headless CMS dedicado como Sanity ou Storyblok para conteúdo e Supabase para dados de aplicação, (2) construa uma simples UI de admin usando algo como Next.js + Supabase Auth, ou (3) mantenha WordPress como um backend de headless CMS. A opção 1 é mais popular para sites com muito conteúdo. Se você está explorando opções, nós dividimos os trade-offs em nossas páginas de desenvolvimento Astro e headless CMS.
E se a migração der errado -- posso voltar para WordPress?
Sim, e você deveria planejar para isso. Mantenha seu site WordPress rodando em um subdomínio durante todo o processo de migração. Use switching de nível DNS (mude seu registro A ou CNAME) então você pode fazer rollback em minutos. Recomendamos manter a instância WordPress antiga rodando por pelo menos 30 dias após lançamento. Apenas detenha-a após ter confirmado que todos os redirecionamentos funcionam, rankings de busca são estáveis, e toda funcionalidade foi verificada. Se você quer ajuda planejando uma migração com procedimentos de rollback apropriados, entre em contato com nossa equipe -- fizemos isso tantas vezes que sabemos onde as armadilhas são.