Performance WordPress per Agenzie: Core Web Vitals 2026 su Scala

17 giugno 202611 minPerformance
In breveAI

Ottimizzare i Core Web Vitals per decine di siti WordPress può essere un problema, specialmente quando si tratta di raggiungere e mantenere le soglie "buone" di LCP, INP e CLS. Le agenzie possono risolvere questo problema standardizzando la stack tecnica e automatizzando il monitoraggio, permettendo di intervenire proattivamente e migliorare la performance dei siti.

Se gestisci decine di siti WordPress per conto di clienti, sai già che il problema non è ottimizzare un sito. Il problema è ottimizzare tutti i siti, in modo ripetibile, senza morire di configurazioni manuali. I Core Web Vitals non sono più un nice-to-have: dal 2023 sono un fattore di ranking ufficiale di Google, e nel 2026 la soglia “buono” si è fatta più stretta. In questo articolo vediamo le strategie tecniche che usiamo su AgencyPilot per portare i siti dei clienti al verde — e mantenerli lì.

TL;DR

Core Web Vitals 2026: LCP < 2.5s, INP < 200ms, CLS < 0.1. Le agenzie che gestiscono più siti devono standardizzare la stack tecnica, automatizzare il monitoraggio e intervenire in modo proattivo prima che i clienti se ne accorgano. AgencyPilot integra il monitoraggio CWV direttamente nella dashboard multi-sito.

Cosa Sono i Core Web Vitals nel 2026

Google ha consolidato tre metriche come standard per la performance percepita dall’utente:

Metrica Cosa misura Soglia “Buono” Soglia “Da migliorare”
LCP — Largest Contentful Paint Velocità di caricamento del contenuto principale < 2.5s 2.5s – 4.0s
INP — Interaction to Next Paint Reattività alle interazioni utente < 200ms 200ms – 500ms
CLS — Cumulative Layout Shift Stabilità visiva della pagina < 0.1 0.1 – 0.25

Nota: INP ha sostituito FID (First Input Delay) a partire da marzo 2024. Se stai ancora monitorando FID, stai guardando la metrica sbagliata.

Il Problema della Scala: Perché un’Agenzia Non Può Ottimizzare a Mano

Con 5 siti sotto gestione, puoi fare audit manuali ogni mese. Con 30 siti, è fisicamente impossibile. Con 80+ siti — la realtà di molte agenzie WordPress italiane — ogni intervento manuale è un collo di bottiglia che blocca la crescita.

Nella nostra esperienza su AgencyPilot, il pattern tipico è questo:

  1. Cliente installa un plugin pesante o un page builder nuovo → LCP peggiora del 40%
  2. Nessuno se ne accorge finché Google Search Console non invia l’avviso (dopo settimane)
  3. L’agenzia interviene in emergenza, spesso senza capire la causa root
  4. Si “sistema” con cache più aggressiva senza risolvere il problema reale

Il risultato è che i siti oscillano tra “buono” e “da migliorare” in modo caotico. Per evitare questo, serve un approccio sistematico. Vediamo come strutturarlo, partendo dalla gestione multi-sito per agenzie come fondamento.

Stack Tecnica Standard per Core Web Vitals Ottimali

La prima cosa da fare è standardizzare la stack su tutti i siti nuovi. Non significa clonare tutto — significa definire un baseline non negoziabile.

Hosting

Il server è il fattore più impattante su LCP. Un TTFB (Time To First Byte) sopra i 600ms rende quasi impossibile raggiungere LCP < 2.5s, indipendentemente da qualsiasi altra ottimizzazione. Il nostro threshold minimo per i nuovi siti cliente:

  • TTFB < 400ms (misurato da 3 location europee)
  • PHP 8.3+ con OPcache abilitato
  • MySQL 8.0+ con query cache configurata
  • HTTP/3 o almeno HTTP/2 obbligatorio

Cache a Tre Livelli

Un sistema di cache efficace su WordPress si struttura così:

# Nginx FastCGI Cache — livello 1
fastcgi_cache_path /tmp/nginx_cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

# Regole bypass per utenti loggati e WooCommerce
set $skip_cache 0;
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
    set $skip_cache 1;
}
  • Livello 1: Nginx FastCGI cache — serve le pagine statiche senza toccare PHP
  • Livello 2: Object cache con Redis — elimina le query DB ripetitive
  • Livello 3: CDN (Cloudflare o BunnyCDN) — distribuisce gli asset statici geograficamente

Plugin di Performance: Meno è Meglio

La combo che usiamo sulla maggior parte dei siti gestiti:

  • WP Rocket o FlyingPress per page caching e ottimizzazioni front-end
  • Redis Object Cache (plugin ufficiale) per object caching
  • Imagify o ShortPixel per compressione immagini WebP/AVIF
  • Perfmatters per disabilitare script inutili a livello chirurgico

Evitare di installare 4-5 plugin di cache diversi. Ogni plugin aggiuntivo aggiunge overhead PHP, specialmente su WordPress che già esegue decine di hook per ogni richiesta.

Ottimizzare LCP: I Problemi Più Comuni

LCP è la metrica più difficile da migliorare perché dipende da variabili diverse: immagini hero, font, CSS critici, server response time. Questi sono i pattern che vediamo più spesso nei siti cliente che portano a un LCP scarso.

Immagine Hero non Preloadata

L’errore più comune: l’immagine hero viene caricata come qualsiasi altra immagine, senza preload. Questo fa sì che il browser la scopra solo dopo aver analizzato il CSS e il DOM.

Soluzione — aggiungi in functions.php o nel tema:

<?php
add_action('wp_head', function() {
    if (is_front_page() || is_home()) {
        $hero_image = get_theme_mod('hero_image_url', '');
        if ($hero_image) {
            echo '<link rel="preload" as="image" href="' . esc_url($hero_image) . '" fetchpriority="high">';
        }
    }
}, 1); // priorità 1 = prima possibile

Aggiungi anche fetchpriority="high" direttamente sul tag <img> dell’immagine hero nel template.

CSS Critico Non Inline

Il browser blocca il rendering fino a che non scarica tutto il CSS. Estrarre il CSS critico (above-the-fold) e iniettarlo inline riduce drasticamente il LCP. Tool consigliato: Critical di Addy Osmani o la funzione integrata in WP Rocket/FlyingPress.

Render-Blocking Resources

Ogni script e stylesheet in <head> ritarda il First Contentful Paint. Il pattern corretto per i JavaScript non critici:

<?php
// Defer tutto tranne gli script critici
add_filter('script_loader_tag', function($tag, $handle, $src) {
    $critical_scripts = ['jquery-core', 'wc-cart-fragments']; // no defer su questi
    if (in_array($handle, $critical_scripts)) {
        return $tag;
    }
    if (strpos($tag, ' defer') === false && strpos($tag, ' async') === false) {
        return str_replace(' src=', ' defer src=', $tag);
    }
    return $tag;
}, 10, 3);

Ottimizzare INP: La Metrica Meno Compresa

INP misura il tempo tra un’interazione utente (click, tap, pressione tasto) e il momento in cui il browser aggiorna visivamente la pagina. È la metrica che più dipende dal JavaScript, e quindi la più insidiosa su WordPress con molti plugin.

Trovare il JavaScript Problematico

Usa Chrome DevTools → Performance → Interactions per identificare quali interazioni superano i 200ms. Spesso i responsabili sono:

  • Plugin di form pesanti (Contact Form 7 con validazione sincrona)
  • Plugin di accessibilità che modificano il DOM su ogni click
  • Google Tag Manager con tag non ottimizzati
  • WooCommerce con molti prodotti nella cart

Delegare Aggiornamenti al Browser

Se hai event handler che fanno lavoro pesante sul main thread, usa scheduler.postTask() o requestIdleCallback() per spostare il lavoro non critico:

// Invece di fare tutto nel click handler
button.addEventListener('click', (event) => {
    // Operazione critica: immediata
    updateCartUI(event);
    
    // Operazione non critica: delegata al browser
    if ('scheduler' in window) {
        scheduler.postTask(() => logAnalyticsEvent(event), { priority: 'background' });
    } else {
        requestIdleCallback(() => logAnalyticsEvent(event));
    }
});

Ottimizzare CLS: Layout Shift Prevenibili

Il CLS è spesso il più facile da correggere una volta identificate le cause. Le più comuni su WordPress:

Immagini Senza Dimensioni

Ogni immagine deve avere width e height espliciti nel markup HTML. WordPress > 5.5 li aggiunge automaticamente, ma i page builder e i widget custom spesso li omettono.

<!-- Sbagliato: il browser non sa quanto spazio riservare -->
<img src="hero.webp" alt="Hero image">

<!-- Giusto: spazio riservato anche prima del caricamento -->
<img src="hero.webp" alt="Hero image" width="1200" height="600">

Font Web con FOUT

I Google Fonts caricati dall’esterno causano spesso FOUT (Flash of Unstyled Text) che contribuisce al CLS. Soluzione: scarica i font e servili dallo stesso dominio, con font-display: swap:

@font-face {
    font-family: 'Inter';
    src: url('/wp-content/fonts/inter-regular.woff2') format('woff2');
    font-display: swap; /* Mostra testo con font fallback subito */
    font-weight: 400;
}

Banner Cookie e Overlay

I banner cookie che appaiono dopo il caricamento spingono il contenuto verso il basso, generando CLS. Usa position: fixed invece di inserire il banner nel flusso del documento, oppure riserva lo spazio con un placeholder CSS.

Monitoraggio Core Web Vitals su Scala con AgencyPilot

Ottimizzare una volta non basta. I siti cambiano, i plugin si aggiornano, i clienti aggiungono contenuti pesanti. Serve un sistema di monitoraggio continuo.

AgencyPilot integra il controllo dei Core Web Vitals direttamente nella dashboard multi-sito, usando l’API di Google PageSpeed Insights (CrUX data per dati reali, Lighthouse per dati lab). La logica è semplice: se un sito scende sotto soglia, arriva una notifica prima che lo dica Google Search Console.

Il controllo si esegue via REST API di PageSpeed Insights:

<?php
function agencypilot_check_core_web_vitals(string $url): array {
    $api_key = get_option('agencypilot_psi_api_key');
    $api_url = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed';
    
    $response = wp_remote_get(add_query_arg([
        'url'      => urlencode($url),
        'strategy' => 'mobile',
        'key'      => $api_key,
        'category' => 'performance',
    ], $api_url));
    
    if (is_wp_error($response)) {
        return ['error' => $response->get_error_message()];
    }
    
    $data = json_decode(wp_remote_retrieve_body($response), true);
    $metrics = $data['loadingExperience']['metrics'] ?? [];
    
    return [
        'lcp' => $metrics['LARGEST_CONTENTFUL_PAINT_MS']['percentile'] ?? null,
        'inp' => $metrics['INTERACTION_TO_NEXT_PAINT']['percentile'] ?? null,
        'cls' => $metrics['CUMULATIVE_LAYOUT_SHIFT_SCORE']['percentile'] ?? null,
        'lcp_category' => $metrics['LARGEST_CONTENTFUL_PAINT_MS']['category'] ?? 'UNKNOWN',
        'inp_category' => $metrics['INTERACTION_TO_NEXT_PAINT']['category'] ?? 'UNKNOWN',
        'cls_category' => $metrics['CUMULATIVE_LAYOUT_SHIFT_SCORE']['category'] ?? 'UNKNOWN',
    ];
}

Questa funzione restituisce i dati CrUX (Chrome User Experience Report) — ovvero le metriche reali degli utenti su quel dominio, non simulazioni. È quello che conta per il ranking di Google.

Per approfondire come automatizzare questo tipo di monitoring, leggi il nostro articolo sull’automazione della gestione WordPress per scalare l’agenzia.

Soglie e Alert Proattivo: La Differenza tra Reattivo e Proattivo

La configurazione che usiamo su AgencyPilot per gli alert automatici:

Condizione Azione Urgenza
Qualsiasi metrica diventa “Scarso” Notifica immediata + task automatico 🔴 Alta
Qualsiasi metrica diventa “Da migliorare” Notifica nel daily digest 🟡 Media
Regressione > 20% rispetto a baseline Alert + report con diff 🟠 Medio-Alta
Performance score Lighthouse < 70 Warning nel weekly report 🟡 Media

L’alert non serve solo a te — serve anche per il cliente. Un report proattivo del tipo “abbiamo rilevato un peggioramento delle performance e stiamo intervenendo” trasforma una crisi in una dimostrazione di valore.

Checklist Pre-Deployment per Ogni Nuovo Sito

Ogni sito nuovo che entra sotto gestione AgencyPilot passa per questa checklist prima di andare online:

  1. ☐ TTFB < 400ms verificato da almeno 2 location EU (usare WebPageTest)
  2. ☐ PHP 8.3 + OPcache attivo
  3. ☐ Redis Object Cache configurato e funzionante
  4. ☐ Nginx FastCGI cache attivo (bypass per utenti loggati)
  5. ☐ Tutte le immagini con width/height nel markup
  6. ☐ Font serviti locally con font-display: swap
  7. ☐ Hero image con rel=preload + fetchpriority=high
  8. ☐ CSS critico inline nel <head>
  9. ☐ JavaScript non critico con defer
  10. ☐ CDN configurato per asset statici
  11. ☐ Google PageSpeed Insights: LCP < 2.5s mobile
  12. ☐ CLS < 0.1 verificato su mobile
  13. ☐ Plugin ridondanti rimossi (max 20 plugin attivi)
  14. ☐ Monitoraggio CWV aggiunto ad AgencyPilot

Questa checklist non è teorica — è il risultato di anni di ottimizzazioni su siti reali, compresi portali della pubblica amministrazione italiana dove la performance WordPress è un requisito contrattuale.

FAQ — Domande Frequenti

Qual è la differenza tra dati CrUX e Lighthouse?

CrUX (Chrome User Experience Report) sono dati reali raccolti dagli utenti Chrome su quel sito negli ultimi 28 giorni. Lighthouse è una simulazione di laboratorio eseguita su un dispositivo virtuale con connessione 4G throttled. Per il ranking di Google contano i dati CrUX. Lighthouse serve per diagnosticare problemi in fase di sviluppo.

Con quanti siti ha senso automatizzare il monitoraggio CWV?

Già con 5-10 siti il monitoraggio manuale diventa costoso in termini di tempo. L’API di Google PageSpeed Insights ha un limite gratuito di 25.000 chiamate/giorno — più che sufficiente per controllare anche 500 siti due volte al giorno.

Il plugin di cache può peggiorare INP?

Il plugin di cache non impatta INP direttamente (la cache serve HTML/CSS/JS già generati). Ma alcuni plugin di cache iniettano JavaScript aggiuntivo per gestire la cache lato client — questo JS può contribuire a un INP peggiore se non è ottimizzato. Controlla sempre il JS iniettato dal tuo plugin di cache.

Come gestire i Core Web Vitals su WooCommerce?

WooCommerce è notoriamente pesante, specialmente per INP. Le pagine prodotto con molti plugin di varianti, wishlist, e notifiche cart sono i casi peggiori. Strategia: usa LiteSpeed Cache o WP Rocket con integrazione WooCommerce, bypassa la cache solo sulle pagine checkout/cart, e considera un tema leggero (Blocksy, GeneratePress) al posto di Divi/Elementor.

PageSpeed Insights mostra punteggi diversi da Google Search Console. Quale credere?

Google Search Console mostra dati CrUX aggregati su 28 giorni con una soglia minima di traffico. PageSpeed Insights mostra sia dati CrUX che dati lab Lighthouse per una singola pagina. Per decisioni SEO, guarda Search Console. Per debugging tecnico, usa PageSpeed Insights o WebPageTest.

Gestisci i siti WordPress dei tuoi clienti?

AgencyPilot ti dà report AI, uptime monitoring, backup e portale clienti in un’unica dashboard. Gratis per 3 siti.

Prova gratis
Leggi anche
Tutti gli articoli
Tutti gli articoli