Automatizar geracao de landing pages WordPress para SEO programatico
Aprenda a automatizar landing pages no WordPress para SEO programático com templates dinâmicos, REST API e boas práticas de performance.
Imagine uma agência que precisa publicar 3.000 landing pages para “desentupimento em [bairro]” em São Paulo até sexta-feira. O time de conteúdo entrega planilhas com títulos, H1, FAQs e CTAs por bairro. O desenvolvedor recebe o briefing: “não pode subir manualmente, tem que ser automático, indexar rápido e não derrubar o servidor”. Esse cenário real condensa os três pilares da automação: ingestão de dados estruturados, geração de páginas únicas em escala e performance sustentável.
No WordPress, a tentação é usar wp_insert_post em loop dentro de um script PHP disparado via cron. Funciona para cem páginas. Para milhares, você esgota memória, trava o MySQL com locks de tabela e o Googlebot encontra 500 erros antes de indexar a décima página. A arquitetura certa separa ingestão, processamento e publicação em etapas assíncronas, com idempotência e observabilidade em cada passo.
Arquitetura de ingestão: REST API customizada + fila de jobs
Crie um endpoint POST /wp-json/pglp/v1/landing-pages/batch que recebe um array de objetos (máx. 50 por request) e enfileira cada item no Action Scheduler ou WP-CLI queue. O handler do job valida schema JSON (titulo, slug, cidade, servico, faq_json, cta_url), checa duplicidade por post_name e só então chama wp_insert_post com post_status => 'draft'. Isso evita race conditions e permite retry automático.
add_action('rest_api_init', function () {
register_rest_route('pglp/v1', '/landing-pages/batch', [
'methods' => 'POST',
'callback' => 'pglp_handle_batch',
'permission_callback' => fn() => current_user_can('manage_options'),
'args' => [
'items' => ['required' => true, 'type' => 'array'],
],
]);
});
function pglp_handle_batch(WP_REST_Request $request) {
$items = $request->get_param('items');
foreach ($items as $item) {
as_enqueue_async_action('pglp_create_landing_page', $item);
}
return new WP_REST_Response(['queued' => count($items)], 202);
}
Essa abordagem desacopla o recebimento dos dados da escrita no banco. O Action Scheduler roda em background via wp-cron ou runner dedicado, processa um item por vez, loga sucesso/falha em tabela custom e dispara webhook de notificação ao final do lote.
Templates dinâmicos com blocos Gutenberg ou PHP
Com o post criado em rascunho, o template define a apresentação. Duas rotas modernas:
- Bloco Gutenberg customizado (recomendado): registra um bloco
pglp/landing-templatecomInnerBlockstravados (templateLock="all"). Orender_callbackrecebe$attributes(cidade, servico, faq) e monta o HTML final viablock_core/heading,block_core/paragraph,block_core/columns. Vantagem: editável no editor, preview real, reutilizável. - Template PHP via
template_include: filtrasingle_templatepara o CPTpglp_landinge carregatemplates/landing-page.phpque fazecho get_field('cidade')etc. Mais performático em runtime, mas exige deploy para mudanças visuais.
No projeto da agência, usamos blocos Gutenberg com ACF Pro para campos repetidores (FAQ). O bloco renderiza schema FAQPage automaticamente, garantindo rich snippets sem esforço extra.
Performance: cache de fragmentos + páginas estáticas
Gerar 3.000 posts publish de uma vez invalida caches, trava wp-cron e derruba o MySQL. A solução em três camadas:
| Camada | Técnica | TTL / Invalidação |
|---|---|---|
| Objeto | WP_Object_Cache (Redis) via wp_cache_set('pglp_landing_'.$id, $html, 'pglp', 86400) |
24h ou save_post action |
| Fragmento | transient com chave pglp_frag_{$block}_{$cidade}_{$servico} |
7 dias |
| Estático | Build noturno via wp-cli eval-file generate-static.php → HTML em /static/ servido por Nginx try_files |
Regeneração diária 03:00 |
O build noturno itera sobre WP_Query do CPT, renderiza cada template via do_blocks($post->post_content) e salva arquivo .html gzipado. O Nginx serve estático se existir; caso contrário, cai no PHP. Isso tira 95% da carga do PHP-FPM.
Canonicalização, sitemaps e internal linking em escala
Cada landing page recebe rel=canonical apontando para si mesma (URL limpa, sem UTM). Use filtro:
add_filter('wpseo_canonical', function ($url) {
if (is_singular('pglp_landing')) {
return get_permalink(); // já limpa
}
return $url;
});
Sitemaps: gere arquivos sitemap-pglp-01.xml a sitemap-pglp-06.xml (5k URLs cada) via script CLI que usa WP_Sitemaps_Provider custom. Submeta via google-api-php-client no Search Console.
Internal linking: crie taxonomia pglp_regiao (ex: “zona-norte”, “zona-sul”). No bloco pglp/related-links, faça WP_Query com tax_query pela mesma região, limite 5, ordenado por menu_order. Injete no final do conteúdo via the_content filter ou bloco Gutenberg arrastável.
Observabilidade e recuperação de falhas
Tabela wp_pglp_generation_log:
id(bigint)batch_id(uuid)item_slug(varchar 200)status(enum: queued, processing, success, failed)error_message(text)created_at,updated_at(datetime)
Dashboard admin simples (WP_List_Table) mostra últimos 100 lotes, taxa de sucesso, botão “Reprocessar falhas”. Alerta no Slack/Teams se taxa < 95% via action_scheduler_after_execute.
Automatizar landing pages em escala no WordPress não é sobre “rodar um loop”. É sobre desenhar um pipeline resiliente: ingestão validada, processamento assíncrono, templates versionados, cache multinível e observabilidade ponta a ponta. Com essa base, a agência publica 3.000 páginas na quinta à noite, indexa na sexta de manhã e o servidor nem pisca.
Checklist prático
Perguntas frequentes
Qual a melhor forma de criar milhares de landing pages sem duplicar conteúdo?
Use Custom Post Types com templates dinâmicos baseados em blocos Gutenberg ou PHP, alimentados por dados estruturados via ACF ou Meta Box. Cada página herda a estrutura, mas recebe conteúdo único via variáveis de template, evitando penalização por conteúdo duplicado.
Como garantir performance ao gerar landing pages em massa?
Implemente cache de fragmentos com Transients API, use object cache (Redis/Memcached) e gere páginas estáticas via build ou SSG. Evite queries pesadas no front-end; pré-renderize HTML e sirva via CDN para manter Core Web Vitals estáveis.
É seguro usar a REST API do WordPress para criar páginas programaticamente?
Sim, desde que use autenticação via Application Passwords ou tokens JWT, valide e saneie todos os inputs com `wp_kses` e `sanitize_*`, e aplique nonces em endpoints customizados. Limite taxa de requisições para evitar abuso.
Como lidar com canonicalização em landing pages geradas automaticamente?
Defina `rel=canonical` apontando para a versão principal de cada cluster de variações. Use `wpseo_canonical` (Yoast) ou filtros nativos `get_canonical_url` para injetar a URL correta baseada no slug ou parâmetros UTM.
Qual estratégia de internal linking funciona em escala programática?
Crie hubs temáticos (páginas-pai) que agreguem links para as landing pages filhas. Use blocos de 'related posts' dinâmicos baseados em taxonomias compartilhadas (cidade, serviço, categoria) e injete links via `the_content` filter ou bloco Gutenberg customizado.
Como monitorar indexação e erros em milhares de páginas automatizadas?
Envie sitemaps segmentados (por tipo, região ou lote) via Search Console API. Configure alertas no `indexing API` do Google e monitore `crawl stats` semanalmente. Logue erros de geração em tabela customizada para auditoria rápida.