Skip to content

feat(seo): meta description dinâmica, Open Graph, sitemap e dados estruturados - #45

Merged
tecrodrigocastro merged 10 commits into
php-pb:masterfrom
tecrodrigocastro:seo/meta-og-sitemap-jsonld
Oct 21, 2026
Merged

tecrodrigocastro merged 10 commits into
php-pb:masterfrom
tecrodrigocastro:seo/meta-og-sitemap-jsonld

Conversation

@tecrodrigocastro

Copy link
Copy Markdown
Contributor

Resumo

Implementa os 5 pontos do audit de SEO:

  1. Meta description dinâmica por página (antes era a mesma frase fixa em todo o site). x-layouts.app ganhou um prop description com fallback genérico, usado por cada página/post/evento.
  2. Open Graph + Twitter Cards no layout base (og:title, og:description, og:image, og:url, og:type, twitter:card), com imagem de fallback (farol-cena.png) e og:image específico quando o post tem imagem de capa.
  3. /sitemap.xml dinâmico — gerado por SitemapController, lista as páginas estáticas + todos os posts publicados (com lastmod). Não inclui eventos individualmente (não existe rota de evento único, só listagem — URLs com #fragmento seriam sinal de conteúdo duplicado). Referenciado no robots.txt.
  4. Canonical URL — <link rel="canonical"> calculado a partir de APP_URL + URI atual, consistente independente de como o domínio foi acessado.
  5. Dados estruturados (JSON-LD):
    • Home → Organization (nome, logo, redes sociais)
    • Post do blog → BlogPosting (headline, autor, datas, publisher)
    • /eventos → um Event por item da listagem (só quando há eventos futuros)

Bônus

  • Páginas de erro (403/404) ganharam <meta name="robots" content="noindex, nofollow">
  • robots.txt agora bloqueia /admin e /membro do crawling
  • Post::getExcerpt() novo método que extrai o primeiro parágrafo do content_blocks como resumo em texto puro, usado como meta description/og:description do post

Pegadinha encontrada

A chave '@context' do JSON-LD colide com a diretiva nativa do Blade @context (usada pelo helper context()) — o compilador substitui o texto literal em qualquer lugar do arquivo, mesmo dentro de uma string PHP. Resolvido concatenando '@'.'context' pra evitar o match do regex do compilador.

Test plan

  • vendor/bin/pint --test
  • vendor/bin/phpstan analyse
  • php artisan test (57 testes, incluindo SeoTest.php novo cobrindo meta tags, JSON-LD e sitemap)
  • Build via npm run build
  • Validado manualmente: JSON-LD parseável como JSON válido em /, /blog/{slug} e /eventos

@tecrodrigocastro
tecrodrigocastro merged commit 6d05547 into php-pb:master Oct 21, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant