Vai al contenuto principale
enricomorano.it/blog/ps-checkout-litespeed ← ../
ps_checkout sparisce dal checkout: colpa di LiteSpeed Cache
▸ Assistenza PrestaShop

ps_checkout sparisce dal checkout: colpa di LiteSpeed Cache

Il metodo di pagamento spariva dal checkout PrestaShop senza un errore a video. Ecco come l'ho diagnosticato e le due strade per risolverlo: una da pannello, una da codice.

16 giugno 2026 #prestashop#litespeed#debug

Era un mercoledì mattina quando è arrivato il messaggio: “il checkout non mostra più i metodi di pagamento”. Lo shop attivo, gli ordini fermi, il cliente nel panico. Apro il backoffice: ps_checkout risulta installato, attivo, configurato a dovere. Eppure nel frontend, niente. E ps_checkout non è un modulo qualsiasi: è uno dei più importanti e recenti per chi vende online con PrestaShop. Se sparisce lui, sparisce il modo di pagare - e con lui il fatturato.

Ambiente del caso: PrestaShop 8, modulo ps_checkout 8.5, LiteSpeed Cache 1.4.

Il sintomo: checkout senza metodi di pagamento

Il cliente non riusciva a concludere l’ordine: la sezione dei pagamenti era semplicemente vuota. Nessuna schermata di errore, log puliti a un primo sguardo, modulo installato e attivo.

E qui sta la parte peggiore. Un metodo di pagamento che non si vede è un danno gravissimo perché è silenzioso: non genera un alert, non rompe niente di evidente. Ma chi compra online è diffidente per natura: appena vede un errore, o qualcosa di diverso da quello che si aspetta, scappa via in un attimo. Non ti scrive per segnalare il problema, chiude la scheda e va altrove. Te ne accorgi dagli ordini che non arrivano, non da un messaggio di sistema.

Perché LiteSpeed Cache lo rompe

LiteSpeed Cache sostituisce (override) la classe classes/Hook.php di PrestaShop. Nel suo override concatena il marcatore con l’output dell’hook senza verificare che quell’output sia davvero una stringa:

// override LiteSpeed (semplificato)
$html = Hook::exec($hookName, $params);
$output = $marker . $html; // se $html e un array, qui esplode

Il punto è che alcuni hook non restituiscono HTML: paymentOptions restituisce un array di oggetti PaymentOption[]. La concatenazione lo forza a stringa, scatta un Array to string conversion e il metodo di pagamento svanisce dal checkout.

paymentOptions PaymentOption[] override LiteSpeed $marker . $html Array to string metodo sparito
L'array dei pagamenti passa nell'override e viene concatenato come stringa: si rompe.

La diagnosi senza accessi SSH

Il cliente aveva solo l’FTP, niente accessi al server. Ho usato una tecnica che applico spesso: uno script PHP read-only, protetto da un token nell’URL, caricato in una cartella di servizio. Mi permette di eseguire l’hook in due modi e capire dove si rompe, senza chiedere credenziali sensibili:

[ok]   $module->hookPaymentOptions()  =>  array(1) { [0] => PaymentOption }
[FAIL] Hook::exec('paymentOptions')   =>  "Array to string conversion" (Hook.php override LiteSpeed)

Chiamato direttamente, il modulo funziona e restituisce l’array corretto. Passando dal dispatcher sovrascritto da LiteSpeed, salta tutto. Da lì la certezza: il problema non è nel modulo, è nell’override.

Chiamato direttamente il modulo funziona.
È il dispatcher sovrascritto da LiteSpeed a rompere tutto.

✅ La soluzione sostenibile: escludere il modulo

Per la maggior parte dei siti non serve toccare il codice. Dal pannello di LiteSpeed Cache si esclude ps_checkout dall’ottimizzazione: è la strada più semplice, reversibile e alla portata anche di chi non sviluppa.

Pannello LiteSpeed Cache, sezione Customization: ps_checkout gestito come ESI block privato con TTL e cache tag dedicati

Il fix definitivo: la guardia di tipo

Chi mette le mani nel codice può chiudere il problema alla radice, con una guardia sul tipo prima di concatenare:

$output = $marker . (is_string($html) ? $html : ''); // guardia sul tipo

Una riga, e il metodo di pagamento torna in checkout.

prima nessun pagamento dopo Carta / PayPal
Checkout prima e dopo il fix: il metodo di pagamento torna disponibile.

Come prevenirlo (e perché non è un controllo una tantum)

Ogni override della classe Hook deve distinguere il tipo del valore restituito: gli hook non sono solo HTML.

Ma c’è un punto più importante. Questo non è un problema da sistemare una volta e dimenticare. I moduli cambiano anche senza che te ne accorga: un aggiornamento di LiteSpeed, una nuova versione di ps_checkout, un modulo terzo che entra in conflitto. È un effetto butterfly: basta un update apparentemente innocuo, da un’altra parte, e il checkout torna a perdere un pezzo. Dopo ogni aggiornamento varrebbe la pena ricontrollare che tutti i metodi di pagamento siano ancora al loro posto - cosa che, realisticamente, nessuno fa a mano.

🛟 Hai lo stesso problema?

Se sul tuo PrestaShop il checkout perde un metodo di pagamento, o un modulo sparisce dopo un aggiornamento, te lo diagnostico e risolvo - anche senza accessi SSH.
Fa parte del mio servizio di assistenza PrestaShop professionale.

E se vuoi smettere di preoccupartene: posso metterti in piedi un monitoraggio automatizzato che verifica di continuo che metodi di pagamento e moduli critici siano sempre attivi, e ti avvisa prima che sia un cliente ad accorgersene.

Hai un caso simile? Scrivimi dai contatti e ti rispondo entro 24 ore.

❓ Domande frequenti

Perché il metodo di pagamento sparisce solo con LiteSpeed attivo?
Perché l'override di LiteSpeed sulla classe Hook concatena come stringa un valore che è un array. Con la cache disattivata, il dispatcher originale di PrestaShop gestisce correttamente il tipo e il metodo torna visibile.
Devo per forza modificare il codice?
No. Nella maggior parte dei casi basta escludere ps_checkout dall'ottimizzazione dal pannello LiteSpeed. La modifica al codice è la soluzione definitiva, ma riservata a chi sviluppa.
Il problema può tornare dopo un aggiornamento?
Sì. Se un update ripristina l'override o cambia il modulo, può ripresentarsi. Per questo conviene ricontrollare il checkout dopo ogni aggiornamento, o automatizzare il controllo.
Vale solo per ps_checkout o anche per altri moduli?
Vale per qualunque hook che restituisce dati strutturati invece di HTML. Anche altri moduli di pagamento e layer di cache (Varnish, Cloudflare) possono dare problemi simili.
Enrico Morano
Sviluppatore PrestaShop freelance da quasi 10 anni - debug, performance, moduli custom

Hai un progetto in testa?

Raccontami cosa ti serve o cosa non funziona. Rispondo entro 24 ore, senza preventivi a scatola chiusa.

Descrivi il tuo progetto → il form guidato, 2 minuti
Scrivimi una mailemail
Scrivimi su WhatsApp di solito rispondo in giornata