Scansioni pianificate e confronto delle differenze
Esegui una scansione SEO completa a intervalli programmati e controlla cosa è cambiato dall’ultima scansione: problemi nuovi, ricomparsi o risolti, ordinati per impatto nella dashboard e, se lo desideri, in un’email di riepilogo.
Le due funzioni lavorano insieme: il confronto delle differenze rende leggibile il risultato di una scansione ricorrente.
Cosa è cambiato dall’ultima scansione
Ogni scansione completata salva l’insieme dei problemi aperti in uno snapshot leggero, seo_scan_run_issues. Il confronto tra due snapshot distingue tre categorie:
- Nuovi: problemi ora aperti che non lo erano prima e non erano mai comparsi in nessuna scansione precedente.
- Ricomparsi: problemi risolti che si sono ripresentati. Non indica un aumento della gravità, che è fissa per tipo di problema: corrisponde alla riapertura descritta nel ciclo di vita.
- Risolti: problemi aperti nella scansione precedente e ora assenti.
Ogni categoria è ordinata per impatto.
Perché usare uno snapshot invece della tabella dei problemi
Il ciclo di vita aggiorna la stessa riga quando un problema viene risolto o riaperto. Finché rimane aperto, scan_run_id viene sostituito con l’ultima scansione. Questo conserva la storia del problema, ma la tabella corrente non può dire quali problemi fossero aperti alla fine dell’esecuzione N: un problema persistente punta sempre alla più recente.
Ogni esecuzione salva quindi il proprio insieme aperto usando un’impronta stabile del problema, issue_type | target | field, la stessa identità usata dai report personalizzabili. Il confronto opera su due insiemi di impronte congelati e funziona tra qualsiasi coppia di esecuzioni, anche non consecutive.
Casi particolari
- Una pagina esce dall’insieme delle destinazioni. I suoi problemi aperti non vengono più controllati, quindi restano aperti e vengono inclusi negli snapshot successivi. Compaiono come ancora aperti, senza essere dichiarati risolti solo perché la pagina non viene più analizzata.
- Un controllo viene disattivato tra due scansioni. I suoi problemi non vengono più emessi, il ciclo di vita li segna come risolti e li rimuove dall’insieme aperto. Compaiono quindi come risolti secondo i controlli attualmente attivi. A livello del singolo problema non si distingue una correzione dalla disattivazione del controllo.
- Prima scansione dopo l’aggiornamento. Le esecuzioni precedenti alla funzione non hanno snapshot e non vengono usate come riferimento. La prima scansione con snapshot stabilisce la base di confronto, mostrando lo stato attuale senza etichettare tutto come nuovo. Il confronto è disponibile dalla seconda.
Nella dashboard
Il widget Cosa è cambiato dall’ultima scansione della dashboard SEO confronta le due esecuzioni completate più recenti. Mostra conteggi e problemi principali delle categorie nuovi, ricomparsi e risolti, ordinati per impatto. Finché non esistono due snapshot, indica che è stata stabilita la base di confronto.
Ordinamento per impatto
Ogni categoria viene ordinata tramite un punteggio di impatto:
impact = severity_weight × page_importanceseverity_weight riusa i criteri pubblici del punteggio:
40per un problema critico,15per un avviso e5per una segnalazione informativa. L’ordinamento usa così la stessa valutazione di gravità del prodotto.page_importance tiene conto della domanda di ricerca osservata, cioè delle impressioni della pagina in Search Console:
page_importance = 1 + demand_weight·demand + priority_weight·priority demand = log1p(page impressions) / log1p(busiest page's impressions) ∈ [0,1] priority = the page's configured per-class sitemap priority ∈ [0,1]Le impressioni sono trasformate su scala logaritmica e normalizzate rispetto alla pagina con più traffico: una pagina con dieci volte il traffico non riceve dieci volte l’importanza. La formula rimane confrontabile tra un piccolo blog e un grande catalogo.
<priority>della sitemap è soltanto un segnale secondario debole, assente per impostazione predefinita e spesso uniforme quando impostato. Incide se hai configurato priorità per tipo inseo.sitemap.models.
Senza Search Console, se mancano sia una cronologia GSC sincronizzata sia priorità configurate, page_importance vale 1 per tutte le pagine: l’impatto coincide con l’ordine di gravità. Sincronizza la cronologia GSC con seo-pro:gsc-sync per aggiungere il peso della domanda osservata.
Modifica pesi e finestra in seo-pro.scan.delta.impact.
Pianificare una scansione
Il pacchetto non pianifica nulla per impostazione predefinita. Per attivare la pianificazione:
php
// config/seo-pro.php
'schedule' => [
'enabled' => true, // env SEO_PRO_SCHEDULE_ENABLED
'frequency' => 'weekly', // daily | weekly | monthly | hourly
'time' => '03:00', // for daily/weekly/monthly
'timezone' => null, // null = app timezone
// ...
],Oppure usa un’espressione cron completa, che prevale su frequency:
php
'cron' => '0 3 * * 1', // env SEO_PRO_SCHEDULE_CRONIl pacchetto registra seo-pro:scan nello scheduler Laravel con withoutOverlapping, evitando di sovrapporre l’esecuzione del comando al ciclo successivo. La registrazione avviene solo nel contesto scheduler/console e non aggiunge lavoro alle richieste web.
Serve uno scheduler in esecuzione
La pianificazione del pacchetto resta inattiva se lo scheduler Laravel non gira. Usa il cron standard * * * * * php artisan schedule:run oppure php artisan schedule:work in sviluppo. Vedi Configurazione in produzione.
Se preferisci configurarlo direttamente, lascia schedule.enabled disattivato e pianifica il comando nel kernel console dell’applicazione. Confronto e riepilogo continuano a funzionare:
php
$schedule->command('seo-pro:scan --notify')->weekly();--sync esegue la scansione nel processo corrente anziché accodare un job per destinazione. Può andare bene per un sito piccolo senza worker; in produzione usa le code.
Email di riepilogo
Puoi ricevere un’email con le differenze dall’ultima scansione al termine di una scansione pianificata: un riepilogo HTML con il tuo marchio e problemi nuovi, ricomparsi e risolti ordinati per impatto.
php
'schedule' => [
// ...
'notify' => [
'enabled' => true, // env SEO_PRO_SCHEDULE_NOTIFY
'recipients' => ['seo@agency.test'], // falls back to reports.recipients
'subject' => 'SEO scan summary',
'only_on_change' => true, // skip when nothing changed
],
],La funzione riusa marchio e configurazione email dei report personalizzabili: nome dell’agenzia, logo e colore. Se non specifichi destinatari diversi, usa quelli dei report. only_on_change evita l’invio quando non ci sono cambiamenti; la prima scansione che stabilisce il riferimento viene sempre inviata.
Il riepilogo parte solo per un’esecuzione avviata con --notify, aggiunto automaticamente dallo scheduler quando notify.enabled è attivo. Un normale seo-pro:scan senza quella opzione non invia email.
Un altro canale?
Per Slack, webhook o riepiloghi personalizzati, ascolta Rankbeam\Seo\Pro\Events\SeoScanCompleted. L’evento viene emesso una volta per esecuzione conclusa e contiene il run. Puoi costruire il confronto con Rankbeam\Seo\Pro\Scanning\Delta\ScanRunDelta e inviarlo al canale scelto.
Conservazione
Gli snapshot vengono eliminati a cascata insieme alla loro esecuzione. seo-pro:scan-prune applica quindi automaticamente la conservazione, senza nuovi comandi da pianificare. Un’esecuzione viene eliminata solo quando non contiene problemi aperti; lo snapshot di una recente esecuzione rimane disponibile per il confronto.
Per disattivare completamente gli snapshot, il confronto e il riepilogo, imposta seo-pro.scan.delta.snapshot => false.