Vai al contenuto

Punteggio SEO: criteri trasparenti, versionati e gestiti da Pro

La scansione Pro assegna a ogni pagina un punteggio SEO da 0 a 100, familiare a chi proviene da Rank Math o Yoast. Il calcolo è verificabile: ogni punto sottratto deriva da un problema di scansione, e lo stesso insieme di problemi produce sempre lo stesso risultato.

score = 100 − Σ penalty(issue) for each scored issue   (floored at 0)

Un solo responsabile del punteggio

Il punteggio numerico è una funzione Pro. Viene salvato in seo_scan_results, non nel seo_meta del core; la vecchia colonna seo_score è stata rimossa nel core 3. L’audit gratuito seo:audit restituisce pass, warn o fail per pagina, senza numero.

I criteri di calcolo

Il punteggio usa criteri pubblici e versionati, definiti da Rankbeam\Seo\Pro\Scanning\ScoreRubric: un elenco esplicito dei codici conteggiati e una penalità fissa per gravità.

GravitàPenalitàSignificato
critical−40Segnalazione di impatto elevato secondo questi criteri.
warning−15Segnalazione da esaminare a breve.
notice−5Miglioramento consigliato.

La gravità di ogni codice viene letta dal registro dei problemi, senza ricalcolarla nei criteri. Ogni codice ha una sola gravità, così il punteggio resta deterministico.

Problemi conteggiati

I codici sotto contribuiscono al punteggio secondo i controlli e le interpretazioni del prodotto: 40 punti per un critico, 15 per un avviso e 5 per una segnalazione informativa.

CodiceGravitàPenalità
missing_titlecritical−40
missing_descriptionwarning−15
missing_og_imagenotice−5
duplicate_titlewarning−15
duplicate_descriptionwarning−15
title_too_longwarning−15
title_too_shortnotice−5
description_too_longwarning−15
description_too_shortnotice−5
robots_conflict_indexingcritical−40
robots_conflict_followingwarning−15
noindex_warningwarning−15
invalid_canonicalcritical−40
cross_domain_canonicalwarning−15
shared_canonicalnotice−5
insecure_canonicalwarning−15
http_errorcritical−40
empty_responsecritical−40
missing_canonicalnotice−5
missing_h1notice−5
missing_image_altwarning−15
thin_contentnotice−5
mixed_contentwarning−15
canonical_target_brokencritical−40
canonical_target_redirectwarning−15
canonical_target_noindexwarning−15

I codici dei metadati vengono rilevati nelle scansioni di modello, quelli dell’HTML e della rete nelle scansioni URL: vedi le classi di esecuzione. Il punteggio di una destinazione modello riflette quindi i controlli sui metadati; quello di una destinazione URL riflette la pagina generata. Un modello con 100 indica che quei controlli non hanno rilevato difetti nei metadati, non che l’HTML sia perfetto. Per verificarlo, analizza anche l’URL.

Problemi esclusi dal punteggio

Questi codici del registro sono esclusi intenzionalmente. Le esclusioni fanno parte del contratto: un test verifica che ogni codice sia conteggiato oppure elencato qui.

CodiceMotivo dell’esclusione
missing_focus_keywordConsiglio editoriale. Dipende dal flusso facoltativo seo.keywords.enabled. Una pagina non deve perdere punti perché non adotta le parole chiave principali, né il punteggio deve dipendere da quell’opzione.
noindex_pageInformativo. noindex può essere intenzionale. La combinazione con un canonical autoreferenziale viene conteggiata da noindex_warning; è un’euristica da verificare, non la prova che la pagina debba essere indicizzata.
multiple_h1Informativo. Più H1 non comportano una penalità in questi criteri; Google può gestire pagine con più H1.
blocked_urlVerifica non eseguita. SsrfGuard ha rifiutato la richiesta, quindi non è stato accertato un difetto della pagina.
canonical_target_blockedVerifica non eseguita. La destinazione canonical non è stata controllata; non è un difetto accertato della pagina.
hreflang_invalid_code, hreflang_missing_self_reference, hreflang_duplicate_code, hreflang_missing_x_defaultConsigli, per ora. I controlli hreflang compaiono nella scansione e nell’audit gratuito, ma non modificano il punteggio. Includerli richiederebbe un incremento di VERSION.
html_lang_missing, html_lang_invalid, html_lang_mismatchConsultivi. I controlli della lingua non incidono su questi criteri.
hreflang_not_reciprocalConsultivo. Il controllo facoltativo della reciprocità non incide sul punteggio.
hreflang_target_unverifiedEvidenza assente. La reciprocità non è stata verificata.
aeo_missing_author, aeo_article_missing_dateConsigli. I segnali AEO indicano un articolo senza entità autore o data di pubblicazione nella scansione e nell’audit gratuito, ma non modificano il punteggio. Includerli richiederebbe un incremento di VERSION.

Densità delle parole chiave, parole persuasive e altri controlli della checklist della pagina non entrano nel punteggio. Sono consigli in un elenco pass/warn/fail separato, non codici del registro.

Versionamento: i risultati salvati non cambiano silenziosamente

Ogni punteggio salvato riporta il ScoreRubric::VERSION che lo ha prodotto, nella colonna rubric_version. Ne derivano due regole:

  • Un nuovo codice non incide sul punteggio finché non viene aggiunto esplicitamente all’elenco. Un nuovo controllo non cambia retroattivamente i risultati salvati. Modificare l’elenco o i pesi richiede una nuova versione dei criteri.
  • Il punteggio viene salvato e non ricalcolato in lettura. Il numero di una scansione resta quello, accompagnato dalla versione che ne spiega il calcolo.

Dove viene salvato

Ogni scansione esegue un upsert di una riga per destinazione in seo_scan_results:

ColonnaContenuto
scannable_type / scannable_idModello valutato; nulli per destinazioni URL.
urlURL valutato.
scoreNumero da 0 a 100.
rubric_versionVersione dei criteri usati.
penalty_totalSomma delle penalità prima di applicare il limite minimo di zero.
scored_issuesNumero di problemi che incidono sul risultato.
breakdownTraccia completa: [{code, severity, penalty}, …].
keywords_enabledValore di seo.keywords.enabled al momento della scansione, registrato per trasparenza senza influire sul punteggio.
scan_run_idEsecuzione che ha prodotto il risultato. Diventa nullo quando il run viene eliminato, senza cancellare il punteggio: la tabella conserva lo stato corrente, non la cronologia dei run.
scored_atData del calcolo.

Leggere il punteggio

Senza pannello, per l’ultimo punteggio di un modello:

php
use Rankbeam\Seo\Pro\Facades\SeoPro;

$result = SeoPro::resultFor($post);

$result?->score;     // e.g. 85
$result?->grade();   // 'A'..'F'
$result?->breakdown; // [['code' => 'cross_domain_canonical', 'severity' => 'warning', 'penalty' => 15]]

php artisan seo-pro:scan-status mostra il punteggio medio del sito nel riepilogo. La dashboard Filament lo presenta nella statistica del punteggio SEO medio, con colore associato alla fascia.

Fasce di valutazione

La lettera è una rappresentazione del numero; il contratto rimane il valore numerico:

PunteggioFascia
90–100A
75–89B
50–74C
25–49D
0–24F

Segnale di pubblicazione: noindex_warning

noindex_warning compare quando una pagina dichiara noindex e presenta un segnale che Rankbeam interpreta come intenzione di indicizzarla. Il segnale è ricavabile dai metadati: un canonical autoreferenziale, che indica l’URL della pagina stessa. Un canonical su un altro dominio delega invece il riferimento altrove e non attiva questo avviso. Il problema contiene context.shipping_signal, per esempio self_canonical, e i valori canonical e page_url confrontati. È un’euristica da verificare: un canonical autoreferenziale non dimostra da solo che la pagina debba essere indicizzata.

Entrambi gli scanner applicano questa regola. PageScanner confronta il canonical salvato con l’URL del modello; UrlScanner passa da noindex_page informativo a noindex_warning conteggiato quando la pagina noindex ha un canonical autoreferenziale. Per questo noindex_page è escluso dal punteggio: il possibile conflitto viene gestito da noindex_warning in entrambi i percorsi.

Configurazione

php
// config/seo-pro.php → 'scan'
'score' => [
    'enabled' => true, // turn the scoring pass + its persistence on/off
],

Elenco dei codici e pesi non sono configurabili. A parità di rubric_version, il calcolo deve essere deterministico in ogni installazione: per cambiarlo serve una modifica ai criteri nel codice, non un’impostazione.

rankbeam/laravel-seo è distribuito con licenza MIT.