Ir para o conteúdo

Auditoria SEO gratuita (seo:audit)

php artisan seo:audit responde: quais problemas existem agora nos metadados das minhas páginas? O comando percorre os models HasSEO no processo atual, sem fila, licença ou rede, e mostra pass / warn / fail por página, seguido de um resumo.

bash
php artisan seo:audit
+--------------+--------+----------------------------+
| Page         | Status | Findings                   |
+--------------+--------+----------------------------+
| Post #1      | PASS   | —                          |
| Post #2      | WARN   | notice title_too_short     |
| Post #3      | FAIL   | critical missing_title     |
|              |        | warning missing_description|
+--------------+--------+----------------------------+

3 page(s) — 1 passed, 1 warned, 1 failed
4 issue(s) — 1 critical, 1 warning, 2 notice

O que é verificado

A auditoria executa apenas a classe metadata: verificações derivadas do model e do resolvedor, sem buscar a página.

VerificaçãoCódigos
Título e descrição presentes, considerando fallbacksmissing_title, missing_description
Imagem OG presente, considerando fallbacksmissing_og_image
Tamanho do título e da descriçãotitle_too_long, title_too_short, description_too_long, description_too_short
Títulos e descrições duplicados no siteduplicate_title, duplicate_description
Diretivas robots conflitantes e noindex a revisarrobots_conflict_indexing, robots_conflict_following, noindex_warning
Canonical: formato, outro domínio, URL compartilhada ou insegurainvalid_canonical, cross_domain_canonical, shared_canonical, insecure_canonical
Preparação para respostas (AEO): dados estruturados de artigosaeo_missing_author, aeo_article_missing_date
Palavra-chave de foco definida, após ativaçãomissing_focus_keyword
Alternativas hreflang, só no núcleo e quando declaradashreflang_invalid_code, hreflang_duplicate_code, hreflang_missing_self

Os códigos têm o mesmo significado na análise Pro. Os códigos hreflang desta tabela e blank_explicit_override são exclusivos do núcleo. Os tamanhos seguem o orçamento por escrita: 60/160 grafemas para texto latino e cerca de 30/80 para CJK. A medida usa o valor resolvido, incluindo o sufixo do título. O editor Filament lê a mesma política, embora também possa mostrar texto ainda não salvo.

As verificações hreflang usam a lista após as políticas de seo.hreflang, como as tags e o sitemap. A reciprocidade exige rastreamento e fica no Pro.

As verificações AEO só se aplicam a artigos JSON-LD (Article, BlogPosting, NewsArticle, …) sem entidade author ou sem datePublished / dateModified. Elas examinam autoria e cronologia explícitas nos dados estruturados. Páginas sem artigo declarado não recebem esses avisos. São recomendações de nível notice, excluídas do score Pro de 0 a 100.

O que não é verificado — limites do comando

Uma auditoria local de metadados não cobre toda a análise Pro. Cada execução informa que não inclui:

  • Verificações do HTML servido: missing_h1, multiple_h1, missing_image_alt, thin_content e mixed_content precisam do conteúdo real da página.
  • Verificações de rede do canonical: canonical_target_broken / _redirect / _noindex exigem uma requisição de saída protegida.
  • O score numérico de 0 a 100: o Pro o salva com uma rubrica versionada no resultado da análise; veja score SEO (EN).

Essas funções pertencem ao Pro. Consulte o registro completo de problemas (EN).

Escolher os models

O comando usa seo.audit.models, com fallback para seo.sitemap.models:

php
// config/seo.php
'audit' => [
    'models' => [
        \App\Models\Post::class,
        \App\Models\Page::class,
    ],
],

Você também pode fornecer as classes explicitamente:

bash
php artisan seo:audit --model="App\Models\Post" --model="App\Models\Page"

Opções

OpçãoEfeito
--model=Classe com HasSEO; repetível, substitui a configuração.
--locale=Idioma para resolver os dados; padrão da aplicação se omitido.
--limit=Máximo de registros por model; 0 significa todos.
--issues-onlyMostrar apenas páginas com pelo menos um problema.
--strictRetornar código de saída diferente de zero se houver qualquer problema, para CI.
--jsonProduzir JSON com páginas, resumo e cobertura, em vez da tabela.

Verificação em CI

Com --strict, a auditoria vira uma verificação do build:

bash
php artisan seo:audit --strict

Retorna 1 se alguma página tiver aviso ou falha e 0 quando todas as páginas auditadas passarem.

JSON

bash
php artisan seo:audit --json
json
{
  "pages": [
    {
      "model": "App\\Models\\Post",
      "key": 3,
      "label": "Post #3",
      "url": "https://example.com/blog/...",
      "status": "fail",
      "issues": [
        { "code": "missing_title", "severity": "critical", "field": "title", "message": "Page is missing a title tag." }
      ]
    }
  ],
  "summary": { "pages": 3, "passed": 1, "warned": 1, "failed": 1, "issues": 4, "by_severity": { "critical": 1, "warning": 1, "notice": 2 } },
  "skipped": [],
  "coverage": { "executes": "metadata", "note": "...", "reference": "https://rankbeam.dev/pro/scan-issues" }
}

Palavras-chave de foco

O aviso missing_focus_keyword vem desativado por padrão. Ele aparece após ativar o fluxo de palavras-chave:

php
// config/seo.php
'keywords' => [
    'enabled' => true,
],

O Pro lê a mesma opção, de modo que auditoria, análise e editor compartilham a ativação. Use o campo Filament ou $model->saveSEO(['focus_keywords' => [['keyword' => 'laravel seo', 'is_primary' => true]]]).

Explicar valores inesperados com seo:explain

seo:audit mostra o problema. seo:explain (EN) explica a origem do valor: configuração, padrão, cálculo ou dado explícito; o que foi substituído e quais políticas vieram depois, como sufixo, limpeza do canonical e proteção contra indexação. Use quando uma tag ou resultado for inesperado:

bash
php artisan seo:explain "App\Models\Post" 42

rankbeam/laravel-seo é distribuído sob a licença MIT.