Salta al contenuto principale
Sistemi Attivi
WP Planet — WordPress Cloud & Managed Services
Torna al MagazineWooCommerce

Caching e pagine dinamiche: perché il carrello WooCommerce non si può (e non si deve) cachare

06 Nov 2026 — 12:45 9 min di lettura
Caching e pagine dinamiche: perché il carrello WooCommerce non si può (e non si deve) cachare

La page cache accelera il 90% del sito ma le pagine dinamiche — carrello, checkout, account — devono restare non cachate. Come configurare le esclusioni senza lasciare buchi che rallentano tutto il resto.

La page cache è la prima cosa che attivi su un sito WordPress lento, e nella maggior parte dei casi risolve metà del problema in un colpo solo. Le pagine statiche — home, articoli, pagine — vengono servite dal cache senza toccare PHP né database, e il TTFB passa da 1.200ms a 80ms. Poi apri il carrello e scopri che si svuota da solo, o che il cliente vede il carrello di un altro utente. La cache sta facendo esattamente quello che le hai detto di fare, solo sulla pagina sbagliata.

Il principio è semplice: si cachano le pagine uguali per tutti, non si cachano quelle che cambiano per utente. Carrello, checkout, account, ordini, wishlist sono pagine dinamiche per definizione — il loro contenuto dipende dall'utente che le visita. Cacharle significa servire a un cliente il carrello del precedente visitatore. Non è un'ottimizzazione, è un bug di sicurezza.

Le pagine che non si cachano mai

L'elenco delle pagine da escludere dalla page cache è quasi standard su ogni installazione WooCommerce seria. Lo ricordiamo perché l'ho visto dimenticare su siti in produzione più volte di quanto mi piacerebbe ammettere:

wp-config.php
// Esclusioni dalla page cache per WooCommerce + WordPress dinamico
// Da aggiungere al plugin di caching o nel functions.php del tema child

add_action( 'template_redirect', function() {
    if ( function_exists( 'WC' ) ) {
        // Pag WooCommerce: carrello, checkout, account, ordini
        if ( is_cart() || is_checkout() || is_account_page() || is_order_received_page() ) {
            header( 'Cache-Control: no-cache, must-revalidate, max-age=0' );
            header( 'Pragma: no-cache' );
            return;
        }
    }

    // Pagine utente autenticato
    if ( is_user_logged_in() ) {
        header( 'Cache-Control: no-cache, must-revalidate, max-age=0' );
        return;
    }

    // WooCommerce e-commerce con coupon
    if ( isset( $_COOKIE['woocommerce_recently_viewed'] ) ||
         isset( $_COOKIE['woocommerce_items_in_cart'] ) ) {
        header( 'Cache-Control: no-cache, must-revalidate, max-age=0' );
        return;
    }
} );
Nota: Gli header Cache-Control con no-cache dicono alla CDN e alla page cache di non memorizzare la risposta. Tuttavia, se il caching è configurato a livello di server (Nginx FastCGI cache), bisogna configurare l'esclusione anche lì — gli header HTTP da soli non bastano se il server ignora gli header dinamici.

Nginx FastCGI cache: escludere le pagine dinamiche a livello server

Su un hosting gestito con Nginx + PHP-FPM, la page cache è spesso implementata con FastCGI cache a livello di server. In quel caso l'esclusione via header PHP funziona solo se Nginx è configurato per rispettarli, e l'approccio più solido è escludere per location o cookie:

.htaccess
# Nginx FastCGI cache — esclude pagine dinamiche per location
# Nel server block di Nginx:

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WP:100m inactive=60m;

server {
    # ... configurazione base ...

    # Non cacheare carrello, checkout, account, my-account
    location ~* ^/(carrello|checkout|mio-account|account|my-account|dashboard) {
        fastcgi_cache off;
        fastcgi_pass php;
        fastcgi_cache_bypass $skip_cache 1;
        fastcgi_no_cache $skip_cache 1;
        add_header X-Cache-Status "DYNAMIC";
    }

    # Non cacheare se l'utente ha il cookie del carrello o è loggato
    set $skip_cache 0;
    if ( $http_cookie ~* "wordpress_logged_in_|woocommerce_items_in_cart" ) {
        set $skip_cache 1;
    }
    if ( $arg_add-to-cart ) {
        set $skip_cache 1;
    }

    location ~ \.php$ {
        fastcgi_cache WP;
        fastcgi_cache_key "$scheme$request_method$host$request_uri$skip_cache";
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;
        fastcgi_pass php;
        # ... resto della configurazione FastCGI ...
    }
}
Nota: Il cookie woocommerce_items_in_cart è presente quando un utente ha aggiunto qualcosa al carrello — se cache per quel visitatore, serve la pagina statica anche quando il carrello cambia. Le query string ?add-to-cart=X vanno escluse perché l'aggiunta al carrello passa via URL in alcuni flussi WooCommerce.

L'object cache Redis: la cache che serve sulle pagine dinamiche

La page cache non si usa sulle pagine dinamiche, ma lì il database lavora comunque — ogni accesso al carrello esegue query su prodotti, stock, prezzi, sessioni. È qui che entra l'object cache Redis: non cachea la pagina intera, ma le singole query e gli oggetti PHP che si ripetono. Il risultato è che il carrello risponde in 150ms invece di 400ms, pur restando dinamico e personalizzato per utente.

wp-config.php
// wp-config.php — abilita Redis object cache
// (richiede il plugin Redis Object Cache o Drop-in)

define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );
define( 'WP_REDIS_DB', 0 );
// Usato da WP Planet su ogni installazione WooCommerce gestita
define( 'WP_REDIS_PREFIX', 'miosito' );
define( 'WP_REDIS_TIMEOUT', 2 );
define( 'WP_REDIS_READ_TIMEOUT', 2 );
Nota: L'object cache Redis è la cache che fa la differenza su WooCommerce — non sostituisce la page cache, la completa. Le query ripetitive (categorie, prodotti, metodi di spedizione) vengono servite da Redis in 1ms invece di essere ricalcolate ogni volta dal database.

Il test che ti dice se la cache è configurata male

Il modo più rapido di capire se la page cache sta servendo il carrello sbagliato è aprire il carrello su due browser diversi o due sessioni in incognito. Se vedi gli stessi prodotti in entrambi, la cache è rotta. Un secondo test è controllare l'header X-Cache-Status della pagina carrello:

Terminale
# Verifica lo stato della cache sulla pagina carrello
curl -sI https://miosito.com/carrello/ | grep -i 'x-cache\|cache-control'

# Output atteso (cache disattivata):
# X-Cache-Status: DYNAMIC
# Cache-Control: no-cache, must-revalidate, max-age=0

# Verifica che le pagine statiche siano in cache
curl -sI https://miosito.com/ | grep -i 'x-cache\|cache-control'
# Output atteso (cache attiva):
# X-Cache-Status: HIT
# Cache-Control: max-age=86400
Nota: X-Cache-Status: HIT sulla home e MISS/DYNAMIC sul carrello è la configurazione corretta. Se vedi HIT sul carrello, la cache sta servendo contenuti dinamici come fossero statici — è il momento di correggere le esclusioni prima che qualcuno veda il carrello di un altro.

La cache ben configurata è la differenza tra un WooCommerce veloce e uno che apparentemente funziona ma perde ordini ogni tanto in modo misterioso. Le esclusioni non sono un dettaglio, sono la parte che rende sicuro tutto il resto. Un audit del checkout e della configurazione di cache è il modo più rapido di capire se la tua cache sta facendo il suo lavoro o creando problemi nascosti.

Assistenza WooCommerce

Checkout, pagamenti e cache del tuo e-commerce sotto controllo.

Verifica tecnica del tuo store WooCommerce: configurazione della cache, esclusioni del carrello, object cache e prestazioni del checkout.

Assistenza WooCommerce
Condividi