Em 2013, muitos sites ainda tentavam classificar-se repetindo a mesma palavra-chave no rodapé. Em 2026, o sinal dominante é outro: autoridade temática. A Google não precisa de um artigo isolado sobre um termo; precisa de perceber se o domínio cobre um assunto de ponta a ponta, com páginas que respondem a intenções reais e se ligam entre si.
Se tiver apenas um texto genérico sobre segurança WordPress, dificilmente compete com quem documenta malware, cabeçalhos HTTP, SSL, 2FA, backups e resposta a incidentes no mesmo cluster. O SEO programático entra aqui como ferramenta de cobertura, não como atalho para spam.
O que é SEO programático
SEO programático não é “auto-blogging” com um modelo de linguagem a gerar milhares de posts quase iguais. É pegar num conjunto de dados estruturado, desenhar um template que mostre diferenças reais entre registos e publicar páginas que resolvem consultas de cauda longa.
Exemplos clássicos de arquitetura (não de tráfego inventado):
- Zillow e similares: páginas por código postal, bairro e filtros de imóvel a partir de dados de mercado.
- TripAdvisor e diretórios de viagem: páginas por cidade, tipo de alojamento e atributos (piscina, família, faixa de preço).
- Listas de comparação B2B: páginas por ferramenta × vertical × critério (preço, integrações, conformidade).
O ponto comum não é “gerar mil URLs”. É ter dados que mudam a resposta à pergunta do utilizador. Se a única diferença entre duas páginas for a palavra “Lisboa” e “Porto” num parágrafo boilerplate, não está a fazer SEO programático útil: está a fabricar variantes.
O SEO programático é spam ou páginas doorway
A Google publica orientação clara sobre conteúdo útil e sobre políticas de spam. Conteúdo fino (thin) e páginas doorway são padrões distintos, mas na prática o SEO programático mal feito cai nos dois.
| Critério | SEO programático com valor | Risco de thin / doorway |
|---|---|---|
| Dados | Fontes verificáveis, APIs, medições próprias | Só sinónimos e nomes de cidade |
| Experiência | Tabelas, filtros, mapas, scores calculados | Bloco de texto repetido |
| Intenção | Responde a uma consulta concreta | Existe para capturar a keyword e redirecionar |
| Indexação | Poucas URLs quase duplicadas; GSC estável | Muitas URLs “descobertas, não indexadas” |
Páginas doorway, na política de spam da Search Central, são páginas feitas para ranquear por consultas semelhantes e levar o utilizador a outro destino, sem servir o próprio conteúdo. Um CSV de 5.000 cidades com o mesmo parágrafo e um botão “contacte-nos” é doorway com roupa de “escala”.
A regra prática: se remover o nome da localização ou do produto e a página deixar de dizer nada de novo, não publique essa URL. Melhore o dataset ou o template primeiro.
O que diz a política da Google sobre abuso de conteúdo em escala
A 5 de março de 2024, a Google anunciou no blog do Search Central uma nova política chamada abuso de conteúdo em escala (scaled content abuse). Segundo esse anúncio, a política “baseia-se na nossa anterior política de spam sobre conteúdo gerado automaticamente” (tradução própria). Para quem faz SEO programático, a mudança está no critério: já não importa se as páginas são escritas por uma máquina ou por uma pessoa, importa para que existem.
A definição atual nas políticas de spam da Pesquisa Google diz que há abuso de conteúdo em escala quando “são geradas muitas páginas com o objetivo principal de manipular as classificações de pesquisa e não de ajudar os utilizadores”, e que costuma tratar-se de conteúdo não original “que oferece pouco ou nenhum valor aos utilizadores, independentemente da forma como foi criado” (tradução própria).
Os exemplos que a Google enumera leem-se como uma lista de falhas típicas de um projeto programático:
| Exemplo da política | Como aparece num projeto de pSEO |
|---|---|
| Usar IA generativa ou ferramentas semelhantes para gerar muitas páginas sem acrescentar valor | Um prompt por linha do CSV e publicação direta |
| Fazer scraping de feeds, resultados de pesquisa ou outro conteúdo, também com sinónimos, tradução ou outras técnicas de ofuscação | Copiar fichas de um diretório alheio e passá-las por um parafraseador |
| Juntar conteúdo de várias páginas sem acrescentar valor | Um template que cola descrições de três fontes diferentes |
| Criar vários sites para esconder a escala do conteúdo | Distribuir as mesmas landing pages por domínios satélite |
| Criar muitas páginas sem sentido para o leitor, mas com palavras-chave | Parágrafos gerados só para encaixar a palavra-chave de cauda longa |
A mesma página define o abuso de páginas de entrada (doorway): sites ou páginas criados para classificar em consultas específicas e semelhantes, que levam o utilizador a páginas intermédias menos úteis do que o destino final. Entre os exemplos estão “vários domínios ou páginas dirigidos a regiões ou cidades específicas que encaminham os utilizadores para uma única página” e “criar páginas substancialmente semelhantes, mais próximas de resultados de pesquisa do que de uma hierarquia claramente definida e navegável” (tradução própria). O segundo exemplo descreve com precisão uma listagem programática sem estrutura, e é por isso que a topologia hub e spoke da secção seguinte é um requisito e não um enfeite.
Pode usar IA generativa para criar páginas programáticas
Sim, com condições que a Google deixa por escrito. A sua orientação sobre conteúdo gerado por IA no seu site repete que usar ferramentas de IA generativa para produzir muitas páginas sem valor para os utilizadores pode violar a política de abuso de conteúdo em escala. A orientação não proíbe a ferramenta; aponta para o resultado vazio.
Dois pontos desse documento mudam o fluxo de trabalho de um projeto programático:
- Verificação de factos antes de publicar. O documento diz que “é fundamental verificar manualmente os factos e rever todo o conteúdo gerado por IA quanto à exatidão e fiabilidade antes de publicar”, e explica porquê: os modelos generativos “não recuperam factos, preveem uma sequência provável de palavras com base nos dados de treino” (tradução própria). Em pSEO, isto significa que cada frase gerada tem de sair das colunas do dataset, e não daquilo que o modelo julga saber sobre uma cidade ou um produto.
- Os metadados também entram na revisão. O documento abrange os elementos
<title>, as meta descrições e os dados estruturados, porque podem aparecer nos resultados de pesquisa. Um JSON-LD com um preço inventado pelo modelo é um erro visível na SERP, não um detalhe interno.
A regra de trabalho que daqui resulta é simples: a IA pode redigir a partir de campos verificados (por exemplo, transformar price e integrations numa frase legível) e uma pessoa revê uma amostra de cada lote. Se o modelo tiver de inventar algo para completar a página, esse registo não está pronto para publicação.
Como construir autoridade temática com hub e spoke
Autoridade temática não é um score mágico. É o resultado de cobertura coerente: um hub (pilar) que define o tema e spokes (satélites) que aprofundam ângulos, segmentos ou combinações de dados.
Exemplo de esqueleto:
- Hub: “Guia de CRM para clínicas e serviços profissionais”
- Spoke: “CRM para clínicas dentárias com faturação recorrente”
- Spoke: “CRM para fisioterapia com agenda online”
- Spoke: “Comparação de CRM com API e exportação RGPD”
Regras de ligação interna que importam mais do que o volume:
- O hub liga a todos os spokes relevantes (ou a um índice filtrável).
- Cada spoke liga de volta ao hub com âncora descritiva.
- Spokes próximos ligam entre si quando a comparação ajuda o leitor.
- Evite “clique aqui”; use âncoras que descrevem o destino.
Sem esta topologia, mil páginas programáticas ficam um arquivo plano. Com ela, o crawler (e o leitor) percebe a hierarquia do tema.
SEO programático no WordPress com CPT e ACF
Não precisa de um CMS à medida. O WordPress funciona bem se tratar as páginas programáticas como um tipo de conteúdo próprio, não como posts de blog misturados com artigos editoriais.
Stack habitual:
- Custom Post Type dedicado (ex.:
destino,ferramenta,comparacao). - Advanced Custom Fields (ou campos nativos) para preço, atributos, localização, scores.
- Dataset limpo (CSV/JSON) com colunas que o template realmente usa.
- WP All Import (ou script próprio) para mapear colunas para campos.
- Template PHP (
single-{post_type}.php) com lógica, não sóthe_field()em prosa.
Um template completo, que lê campos, compõe texto a partir dos dados e liga a alternativas do mesmo setor, está na secção sobre o template de página mais abaixo. Tabelas, mapa e filtros devem mudar com o registo, não só o H1.
Cuidados de produção:
- Separar o CPT programático do blog editorial (menus, sitemaps, breadcrumbs).
- Validar campos obrigatórios na importação; um registo incompleto não deve ir a
publish. - Gerar slug estável a partir de chaves do dataset (cidade + atributo), não de títulos manuais inconsistentes.
- Incluir schema só quando os campos existem (FAQ, Product, Place, etc.), nunca JSON-LD vazio.
Se a stack de importação e templates for o gargalo, um desenvolvedor WordPress costuma resolver CPT, ACF, ingestão e template numa passagem, em vez de deixar o marketing a publicar CSV cru.
Que dados precisa uma página de SEO programático
O template só amplifica o que o CSV já contém. Se as colunas forem fracas, mil páginas bonitas continuam finas.
Priorize colunas que alteram a decisão do leitor:
- Métricas numéricas (contagens, médias, intervalos, datas de atualização).
- Atributos booleanos ou categóricos que o filtro da SERP implica (com API, com faturação, com suporte em português europeu).
- Texto curto e factual por registo (uma nota de método, uma limitação, uma fonte), não um parágrafo marketing copiado.
- Chaves estáveis de identidade (ID externo, slug canónico) para reimportações sem criar duplicados.
Evite colunas decorativas que ninguém usa no frontend. Cada campo no ACF deve aparecer no template ou no schema. Campos órfãos aumentam o custo de manutenção e dão falsa sensação de “riqueza de dados”.
Para nichos em Portugal e na UE, documente também a jurisdição dos dados (RGPD, faturação local, idiomas). Uma página “melhor ferramenta X em Lisboa” sem qualquer sinal local (método de pagamento, suporte, conformidade) lê-se como variante doorway de um texto em inglês.
Como a Google trata o conteúdo duplicado entre landing pages programáticas
A documentação da Google sobre canonização desfaz um mito frequente: “algum conteúdo duplicado num site é normal e não viola as políticas de spam da Google” (tradução própria). Não existe uma penalização automática por ter dois URLs parecidos. O que acontece é outra coisa: a Google agrupa as páginas com conteúdo principal igual ou muito semelhante e escolhe como canónica a que considera mais completa e útil para quem pesquisa.
Num site programático, isto tem três consequências práticas:
- Se duas landing pages só diferem no nome da cidade, a Google pode escolher uma e deixar a outra fora dos resultados. Não é um castigo, mas o efeito no tráfego é o mesmo de nunca a ter publicado.
- A etiqueta
rel="canonical"é uma indicação, não uma regra. A Google combina-a com outros sinais, como HTTPS face a HTTP, redirecionamentos e a presença do URL no sitemap. Um canonical que contradiz o sitemap envia sinais contraditórios. - As versões não canónicas são rastreadas com menos frequência para reduzir a carga no servidor. Com muitas variantes, o bot dedica o tempo à versão escolhida e as outras atualizam-se tarde.
O risco de spam começa quando a duplicação é sistemática e o objetivo é captar consultas. Aí o problema já não é de canonização, mas de abuso de conteúdo em escala ou de doorway.
Como importar CSV em massa para campos personalizados com WP-CLI
O WP All Import chega para conjuntos de dados simples. Campanhas grandes (a partir de cerca de 1000 páginas) funcionam melhor com PHP otimizado ou um comando WP-CLI: menos timeouts, menos memória e nenhuma consulta desnecessária através da interface.
Um esqueleto de comando WP-CLI próprio que preenche um CPT tool registado a partir de um ficheiro CSV:
if ( ! defined( 'WP_CLI' ) || ! WP_CLI ) {
return;
}
class Tool_Importer_Command {
public function __invoke( $args, $assoc_args ) {
$csv_file = $args[0];
if ( ! file_exists( $csv_file ) || ! is_readable( $csv_file ) ) {
WP_CLI::error( "Não é possível ler o ficheiro CSV: $csv_file" );
}
if ( ( $handle = fopen( $csv_file, 'r' ) ) !== false ) {
$header = fgetcsv( $handle, 0, ',' );
$count = 0;
wp_defer_term_counting( true );
wp_defer_comment_counting( true );
while ( ( $data = fgetcsv( $handle, 0, ',' ) ) !== false ) {
$row = array_combine( $header, $data );
$slug = sanitize_title( $row['name'] );
$existing = get_page_by_path( $slug, OBJECT, 'tool' );
$post_data = [
'post_title' => sanitize_text_field( $row['name'] ),
'post_name' => $slug,
'post_status' => 'publish',
'post_type' => 'tool',
'post_content' => '',
];
if ( $existing ) {
$post_data['ID'] = $existing->ID;
$post_id = wp_update_post( $post_data );
} else {
$post_id = wp_insert_post( $post_data );
}
if ( is_wp_error( $post_id ) ) {
WP_CLI::warning( "Falha na importação de {$row['name']}: " . $post_id->get_error_message() );
continue;
}
update_post_meta( $post_id, 'tool_price_monthly', floatval( $row['monthly_price'] ) );
update_post_meta( $post_id, 'tool_target_industry', sanitize_text_field( $row['industry'] ) );
update_post_meta( $post_id, 'tool_score_overall', floatval( $row['score'] ) );
update_post_meta( $post_id, 'tool_features_list', sanitize_text_field( $row['features'] ) );
update_post_meta( $post_id, 'tool_integrations', sanitize_text_field( $row['integrations'] ) );
$count++;
}
fclose( $handle );
wp_defer_term_counting( false );
wp_defer_comment_counting( false );
WP_CLI::success( "Registos processados: $count" );
}
}
}
WP_CLI::add_command( 'import-tools', 'Tool_Importer_Command' );O comando reconhece as entradas existentes pelo slug e atualiza-as em vez de criar duplicados. wp_defer_term_counting() e wp_defer_comment_counting() adiam a recontagem de termos e comentários até ao fim da execução. Na importação piloto, defina post_status como draft e mude para publish só depois de verificar.
Como criar um template de página programática no WordPress
Crie no tema o ficheiro single-tool.php. É o motor de renderização de todas as landing pages programáticas: lê os metadados, compõe texto contextual e liga a alternativas do mesmo setor.
<?php
get_header();
$post_id = get_the_ID();
$price = get_post_meta( $post_id, 'tool_price_monthly', true );
$industry = get_post_meta( $post_id, 'tool_target_industry', true );
$score = get_post_meta( $post_id, 'tool_score_overall', true );
$features = get_post_meta( $post_id, 'tool_features_list', true );
$integrations = get_post_meta( $post_id, 'tool_integrations', true );
$is_budget = ( $price < 50 );
?>
<main id="primary" class="site-main">
<article <?php post_class(); ?>>
<h1><?php the_title(); ?>: análise para o setor <?php echo esc_html( $industry ); ?></h1>
<p>
Classificação <?php echo esc_html( $score ); ?>/5.
Desde <?php echo esc_html( $price ); ?>/mês.
<?php echo $is_budget ? 'Opção económica' : 'Gama premium'; ?>.
</p>
<section>
<h2>Funcionalidades</h2>
<p><?php echo esc_html( $features ); ?></p>
<h3>Integrações</h3>
<p><?php echo esc_html( $integrations ); ?></p>
</section>
<section>
<h2>Comparar com alternativas</h2>
<?php
$alternatives = new WP_Query( [
'post_type' => 'tool',
'posts_per_page' => 3,
'post__not_in' => [ $post_id ],
'meta_query' => [
[
'key' => 'tool_target_industry',
'value' => $industry,
'compare' => '=',
],
],
] );
if ( $alternatives->have_posts() ) :
while ( $alternatives->have_posts() ) : $alternatives->the_post();
echo '<p><a href="' . esc_url( get_permalink() ) . '">' . esc_html( get_the_title() ) . '</a></p>';
endwhile;
wp_reset_postdata();
endif;
?>
</section>
<p><a href="/pt-pt/seo-programatico-autoridade-tematica/">Voltar ao guia do cluster pSEO</a></p>
</article>
</main>
<?php get_footer(); ?>Schema JSON-LD para landing pages programáticas
Os motores de pesquisa e os crawlers de modelos de linguagem precisam de JSON-LD claro no head de cada landing page programática:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "TechArticle",
"@id": "<?php echo esc_url( get_permalink() ); ?>#article",
"headline": "<?php echo esc_attr( get_the_title() ); ?>: análise e guia de integração",
"description": "Análise, dados de preço e funcionalidades de <?php echo esc_attr( get_the_title() ); ?>.",
"inLanguage": "pt-PT",
"mainEntityOfPage": "<?php echo esc_url( get_permalink() ); ?>",
"about": [{
"@type": "SoftwareApplication",
"name": "<?php echo esc_attr( get_the_title() ); ?>",
"applicationCategory": "BusinessApplication",
"operatingSystem": "All"
}]
},
{
"@type": "FAQPage",
"@id": "<?php echo esc_url( get_permalink() ); ?>#faq",
"mainEntity": [{
"@type": "Question",
"name": "Quanto custa <?php echo esc_attr( get_the_title() ); ?>?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<?php echo esc_attr( get_the_title() ); ?> custa a partir de <?php echo esc_attr( $price ); ?> por mês."
}
}]
}
]
}
</script>Escreva cada nó apenas quando os campos correspondentes estão preenchidos. Um registo sem preço não recebe uma pergunta sobre preço no schema.
Controlo de indexação e crawl budget
Escalar URLs sem controlo enche a Search Console de “Discovered - currently not indexed” e dilui o sinal do domínio. Antes de importar o lote completo:
- Publique um piloto (por exemplo 30-50 URLs) e meça indexação e comportamento de pesquisa.
- Noindexe stubs incompletos até o template e os dados estarem prontos.
- Consolide duplicados óbvios (mesma cidade com dois slugs) em vez de manter variantes.
- Use um sitemap só do CPT programático e monitore erros de rastreio.
A orientação de conteúdo útil da Search Central não exige que abandonemos a automação. Exige que o resultado ajude alguém que fez aquela pesquisa. Automação sem essa barra vira volume vazio.
Desempenho da base de dados e cache com milhares de páginas programáticas
Escalar para milhares de páginas cria estrangulamentos na base de dados e no rastreador. Sem controlo, as Core Web Vitals descem e o bot gasta crawl budget em URLs inúteis.
- Índices em postmeta: a
wp_postmetaindexa mal campos personalizados. Acrescente índices emmeta_key/meta_valuepara as chaves mais consultadas, ou passe os metadados mais usados para tabelas próprias. - Object cache Redis: metadados e consultas em memória, sem ir ao MySQL em cada visita.
- Sitemaps divididos: não um único XML gigante. Uma abordagem prática são partes de cerca de 1000 URLs por tipo de conteúdo ou categoria.
- Cache no edge: Cloudflare ou outra CDN a guardar o HTML em cache. As landing pages programáticas mudam pouco; os cabeçalhos
Cache-Controlpermitem servi-las a partir do edge e reduzem a carga no servidor de origem.
Quando é que o crawl budget importa num site programático
O guia da Google para gerir o crawl budget em sites grandes foi escrito para dois perfis: sites com mais de um milhão de páginas únicas cujo conteúdo muda com frequência moderada (semanal) e sites com mais de 10 000 páginas únicas cujo conteúdo muda muito depressa (diariamente). A Google sublinha que não são limiares exatos. O guia dirige-se também a sites com uma grande parte dos URLs no estado “Discovered - currently not indexed” da Search Console, que é o sintoma típico de um lote programático mal planeado.
Segundo o guia, o crawl budget é o conjunto de URLs que a Google pode e quer rastrear, e depende de dois fatores: o limite de capacidade de rastreio (quanto tempo de ligação o seu servidor aguenta) e a procura de rastreio, que para o Googlebot varia com o tamanho do site, a frequência de atualização, a qualidade das páginas e a sua relevância. Abaixo desses limiares, um catálogo programático que é mal rastreado costuma ter primeiro um problema de qualidade ou de duplicação, e só depois de orçamento.
Três detalhes do guia corrigem hábitos comuns em pSEO:
noindexnão poupa crawl budget. A Google tem de pedir a página para ler a diretiva. Se o objetivo é que o bot não perca tempo com URLs de ordenação ou filtros, a ferramenta é o robots.txt; se o objetivo é que não entrem no índice, é onoindex. São decisões distintas.- As páginas soft 404 continuam a ser rastreadas e gastam orçamento. Uma landing page programática sem dados que responde 200 com “sem resultados” deve responder 404 ou 410.
- As versões da mesma página com ordenação diferente devem ser consolidadas ou bloqueadas no robots.txt.
Sobre sitemaps, a Google documenta um limite de 50 000 URLs ou 50 MB sem compressão por ficheiro, ignora <priority> e <changefreq> e só usa <lastmod> quando é consistente e verificavelmente exato. Num site programático, o lastmod deve refletir a última alteração real dos dados do registo, e não a data da última importação do CSV.
Como medir SEO programático na Search Console
Não precisa de percentagens inventadas. Precisa de sinais observáveis na Search Console e no analytics:
- Quantas URLs do CPT estão indexadas vs publicadas.
- Que consultas reais batem nas páginas (não só as keywords do briefing).
- Tempo na página e taxa de retorno ao hub (sinal de que o spoke fez o trabalho).
- Erros 404/500 e soft-404 após cada importação.
Se o piloto indexar mal, pare. Corrija dados e template. Só depois aumente o lote. Escalabilidade sem este freio é a forma mais rápida de transformar um domínio útil num arquivo de URLs vazias.
Checklist de SEO programático antes de escalar
Use esta lista como gate de publicação, não como ornamentação:
- Cada página responde a uma intenção distinta (não só a uma keyword).
- Pelo menos um elemento único por URL: tabela, score, mapa, amostra de dados, filtro.
- Hub e spoke ligados nos dois sentidos.
- Fonte dos dados documentada (API, dataset interno, data da última atualização).
- Processo de refresh: quando o CSV muda, as páginas atualizam sem reescrever prosa à mão.
- Critério de despublicação: URLs sem impressões úteis e sem valor editorial saem do índice.
- Revisão humana das primeiras dezenas de URLs de cada lote, com lista de defeitos recorrentes no template.
Plano de SEO programático em 90 dias
- Dias 1-30: análise de palavras-chave, controlo de qualidade do conjunto de dados, CPT e campos ACF.
- Dias 31-60: template
single-tool.php, comando de importação WP-CLI e testes em staging. - Dias 61-90: piloto medido, primeiro lote de dados, cobertura de schema, rastreio na Search Console e cache na edge.
Trate o conteúdo programático como software: esquema de dados, template, testes, implementação por lotes.
Resumo
- Não persiga só termos genéricos onde a Wikipédia e os gigantes do setor já dominam.
- Use a cauda longa onde tem dados que diferenciam a resposta.
- Trate o conteúdo programático como software: schema de dados, template, testes, deploy em lotes.
- Separe SEO programático de páginas doorway: valor na página, não só captura de consulta.
- Meça indexação e intenções reais antes de multiplicar o volume.
Conteúdo, neste modelo, é dados mais apresentação. Se faltar um dos dois, o volume só aumenta o risco.
Do lado da entrega mantemos este tema sob GEO e LLMO.







