Abra o código-fonte da sua página (Ctrl+U / Cmd+Option+U). Olhe para a secção <head>. Vê dezenas de linhas que não reconhece? Em 2026 a maior parte é desnecessária: manifests legados, feeds de comentários, polyfills de emoji e a meta generator da era do Windows Live Writer.
Isto não é cosmética. Cada <link> a mais e cada script extra custam bytes, tempo de parsing e, por vezes, um DNS lookup. Numa loja WooCommerce com dezenas de plugins as tags acumulam-se depressa. Um wp_head() limpo facilita o debug e reduz a superfície de ataque via fuga de versão.
Referências úteis: wp_head(), o WordPress Developer Handbook e o guia web.dev sobre LCP.
O que o WordPress coloca no head por defeito
Uma instalação fresca com tema padrão costuma entregar, entre outras coisas:
- Links RSS para posts, categorias, tags e comentários
wlwmanifestpara Windows Live Writer- Really Simple Discovery (
rsd_link) meta name="generator"com a versão do core- Script de deteção de emoji mais estilos
- Tags de shortlink (
?p=123) - Links de posts adjacentes (
rel="prev"/rel="next") - Links de discovery REST e oEmbed
| Elemento | Utilidade em 2026 | Risco ao remover |
|---|---|---|
| Feed de comentários | Muito baixa | Baixo |
Feed principal /feed/ | Média (newsletter, leitores) | Médio |
| wlwmanifest / RSD | Legado | Baixo |
| Meta generator | Nenhuma (fuga de info) | Baixo |
| Script de emoji | Nativo nos browsers | Baixo |
| Discovery REST | Alta em headless / app | Alto se usa API |
| Shortlink | Baixa | Baixo |
A tabela é a base de decisão: não arranque tudo, remova legado e fugas, mantenha a API de propósito.
Porque limpar o head?
Performance
Antes da limpeza vê muitas vezes 10 a 20 tags extra e um pedido a s.w.org para emoji. Depois, o HTML encolhe, o parser trabalha menos e no Network tab desaparecem os requests supérfluos. Em redes móveis portuguesas (4G em comboio, 5G instável em zonas urbanas densas) a diferença nota-se mais do que no Wi-Fi do escritório.
Segurança e fuga de informação
meta name="generator" content="WordPress x.y.z" revela a versão do core. Não é um exploit por si, mas é um convite a scanners para cruzar CVE conhecidas. O mesmo vale para query strings de versão no CSS do tema. Remova a generator; continue a patchar core, temas e plugins.
Manutenção
Um head magro torna diffs de staging legíveis. Quando um plugin injeta de repente três prefetch hints, vê-o de imediato. Em auditorias a PME portuguesas, «head limpo» é muitas vezes o primeiro ganho rápido antes de Redis ou object cache.
Como remover o feed RSS de comentários no WordPress
O WordPress gera um feed RSS separado para cada post, categoria, tag e comentários. Se não gere um site de notícias onde alguém subscreve threads via leitor RSS, é desperdício.
// Remove links RSS para comentários
add_filter( 'feed_links_show_comments_feed', '__return_false' );
// Remove feeds extra (categorias, tags, autores)
remove_action( 'wp_head', 'feed_links_extra', 3 );
// Só se realmente não precisares do feed principal:
// remove_action( 'wp_head', 'feed_links', 2 );Deixe feed_links se o Mailchimp, o Brevo ou um setup de podcast lê o feed do site. Feeds de comentários e feeds extra pode, em regra, desligar em sites empresariais.
Remover wlwmanifest e RSD do WordPress
Quando foi a última vez que usou o Windows Live Writer para escrever no blog? O WordPress ainda adiciona o manifest. O Really Simple Discovery era para remote publishing e é irrelevante nos workflows modernos.
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'rsd_link' ); // Really Simple DiscoveryIsto remove tipicamente:
<link rel="wlwmanifest" type="application/wlwmanifest+xml" ...><link rel="EditURI" type="application/rsd+xml" ...>
Como desativar os emojis do WordPress
O WordPress carrega JS e CSS para converter caracteres como :) em imagens. Os browsers modernos têm suporte nativo a emoji. O script é só um pedido HTTP extra mais DNS prefetch para s.w.org.
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'admin_print_styles', 'print_emoji_styles' );
remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );Se a redação usa muito emoji em e-mail e a vista no Outlook é crítica, teste os filtros de mail um a um. Para performance de frontend bastam os hooks de wp_head e de estilos.
Esconder a versão do WordPress na meta generator
Por razões de segurança não deve expor a versão no frontend.
remove_action( 'wp_head', 'wp_generator' );
add_filter( 'the_generator', '__return_empty_string' );Isto também silencia tags generator nos feeds. Não substitui atualizações: core, temas e plugins continuam a precisar de patch. Só remove o cartaz na porta da frente.
Como remover o shortlink e rel prev/next no WordPress
Shortlinks (?p=123) e rel="prev" / rel="next" no head raramente são úteis para crawlers modernos. Inflam o HTML.
remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );
remove_action( 'template_redirect', 'wp_shortlink_header', 11 );
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );
remove_action( 'wp_head', 'start_post_rel_link', 10, 0 );
remove_action( 'wp_head', 'index_rel_link' );
remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 );Quando remover os links REST API e oEmbed
// Remove só se o frontend não precisar de discovery:
// remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
// remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
// remove_action( 'template_redirect', 'rest_output_link_header', 11 );Setups headless, apps móveis e muitos page builders esperam discovery REST. Num blog empresarial clássico com pouco uso de API pode remover as links. Em WordPress headless com Next.js ou Astro no frontend, deixe-as ficar.
Código completo para limpar o wp_head
Prefira um must-use plugin em wp-content/mu-plugins/wppoland-clean-head.php em vez de meter tudo só no functions.php do tema pai.
<?php
/**
* Plugin Name: WPPoland Clean Head
* Description: Remove tags legadas de wp_head.
* Author: wppoland.com
*/
function wppoland_cleanup_head() {
remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'wp_generator' );
remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );
remove_action( 'wp_head', 'start_post_rel_link', 10, 0 );
remove_action( 'wp_head', 'index_rel_link' );
remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 );
remove_action( 'wp_head', 'feed_links_extra', 3 );
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
add_filter( 'feed_links_show_comments_feed', '__return_false' );
add_filter( 'the_generator', '__return_empty_string' );
}
add_action( 'init', 'wppoland_cleanup_head' );Limpar o head só em certas páginas
Por vezes quer manter feeds só na homepage:
add_action( 'wp', function () {
if ( ! is_front_page() ) {
remove_action( 'wp_head', 'feed_links', 2 );
}
} );Ou matar emojis só no frontend e deixá-los no admin. Lógica condicional mantém o snippet sustentável, em vez de empilhar cinco plugins de cleanup sobrepostos.
Como verificar se o head ficou limpo
- Abra janela anónima e verifique o código-fonte: generator, wlwmanifest e script de emoji desapareceram?
- Separador Network: nenhum pedido a
wp-emoji-release.min.js. - O feed principal
/feed/continua acessível se for necessário. - Editor Gutenberg e chamadas REST (guardar post) continuam verdes.
- Checkout WooCommerce passa sem regressão se a loja estiver ativa.
Em projetos portugueses com CSP estrita vê muitas vezes menos ruído na consola depois da limpeza, porque o CDN de emoji e os prefetch hints desaparecem. É um efeito colateral, não substitui uma política CSP real.
Que tags do head do WordPress manter
viewporte meta charset (tema)- Canonical e hreflang (plugin SEO / tema)
- Preloads críticos que definiu de propósito
- Scripts de cookies e consentimento (obrigação legal)
- Schema /
application/ld+jsonquando os usa
Limpar o head significa legado fora, não «apagar tudo o que é invisível».
Limpeza do head com cache e Cloudflare
Limpeza de head e full-page cache reforçam-se. Menos tags significam menos HTML na edge. Esvazie a cache de HTML depois do deploy (não só o browser), senão continua a ver a linha antiga da generator. Com Cloudflare ou um host com Varnish: mantenha as cache keys de forma a que utilizadores autenticados não misturem output de cleanup com visitantes anónimos.
Plugin cleaner e MU-plugin ao mesmo tempo é redundante. Escolha uma fonte de verdade. Em auditorias a agências em Lisboa e Porto vemos muitas vezes três plugins de cleanup mais código no tema: o plugin A remove links REST, o plugin B volta a adicioná-los por causa do oEmbed, e ninguém sabe porque o head cresce outra vez.
Checklist antes de publicar a limpeza do head
- Espelhe staging com os plugins de produção (não só o tema padrão).
- Compare código-fonte da homepage, de um post e, se existir, de uma página de loja.
- Teste o URL do feed à mão num reader se o marketing o usar.
- Um editor guarda um post Gutenberg sem erros REST.
- Monitorização: anote o tamanho HTML de
/antes e depois da limpeza (diff simples no ticket).
Estes cinco passos levam menos de uma hora e evitam a regressão típica «matámos os emojis e a newsletter morreu». Em lojas com Multibanco, MB Way ou Stripe no checkout: clique no pagamento em staging depois de mudanças no head, para garantir que nenhum script de terceiros foi removido por acidente. Registe bytes de HTML antes e depois no ticket de deploy; assim tem prova quando alguém perguntar se o ganho valeu o risco. Repita a mesma verificação depois de cada update de plugin de cache.
Ajuda com a velocidade do WordPress e Core Web Vitals
Se quiser tratar head-bloat, scripts de terceiros e Core Web Vitals em conjunto, contacta-nos via página de contacto. Mais sobre velocidade: otimização de velocidade WordPress.







