Chi lavora quotidianamente con WordPress sa che questa piattaforma è una delle più versatili e diffuse al mondo. È perfetta per blog, portali di notizie, siti aziendali e progetti di ogni dimensione. Tuttavia, quando un sito cresce troppo, iniziano ad emergere alcuni limiti tecnici che non si possono più ignorare. Questo accade in particolare quando parliamo di portali con decine di migliaia di articoli pubblicati, solitamente oltre i 50.000 articoli.
In questa guida vogliamo raccontarvi un problema concreto che abbiamo affrontato su alcuni progetti dei nostri clienti e la soluzione pratica che abbiamo ideato. Non parleremo soltanto di teoria, ma vi mostreremo il codice SQL che utilizziamo, spiegheremo nel dettaglio come funziona e come automatizzarlo per non dover intervenire manualmente ogni volta.
WordPress non è stato progettato per gestire database enormi. Certo, può farlo, ma con alcune difficoltà. Quando il numero di articoli cresce a dismisura, il sito inizia a rallentare in diversi punti:
Naturalmente, una prima soluzione è quella di potenziare l’infrastruttura: più RAM, processori migliori, database ottimizzati. Ma non sempre questo basta, perché il vero problema non è solo la potenza del server, bensì la mole di dati che WordPress deve continuamente gestire e soprattutto le richieste molto pesanti al database.
Molti siti, soprattutto portali di news, non hanno realmente bisogno di conservare per sempre gli articoli più vecchi. Se il vostro progetto pubblica decine di notizie ogni giorno, dopo un anno vi ritroverete con decine di migliaia di articoli ormai superati, che non portano più traffico e che continuano a pesare sul database.
Eliminare periodicamente i contenuti datati diventa quindi una scelta strategica: meno dati nel database significa query più veloci, caricamenti più rapidi e un’esperienza migliore sia per l’utente sia per chi gestisce il sito.
Ovviamente esistono plugin (a pagamento) che permettono di eliminare i vecchi articoli in automatico. Tuttavia, nella nostra esperienza, questi plugin hanno un limite importante: non riescono a gestire database molto grandi. Quando devono cancellare migliaia di articoli, si bloccano o richiedono tempi lunghissimi e il server va in timeout.
Ecco perché abbiamo deciso di affrontare il problema in modo diverso, agendo direttamente sul database.
Abbiamo creato una query SQL che ci permette di cancellare automaticamente gli articoli più vecchi di un certo periodo di tempo (nel nostro caso un anno), insieme ai dati correlati come commenti e metadati. In questo modo si alleggerisce il database in maniera radicale e sicura.
/**
Cancella gli articoli nella categoria "news" più vecchi di 1 anno
*/
DELETE p, tr
FROM wptest_posts p
LEFT JOIN wptest_term_relationships tr ON (p.ID = tr.object_id)
INNER JOIN wptest_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
INNER JOIN wptest_terms t ON (tt.term_id = t.term_id)
WHERE tt.taxonomy = 'category'
AND t.slug = 'news'
AND p.post_type = 'post'
AND p.post_status = 'publish'
AND p.post_date < NOW() - INTERVAL 365 DAY;
-- Elimina commenti orfani
DELETE FROM wptest_comments
WHERE comment_post_ID NOT IN (SELECT ID FROM wptest_posts);
-- Elimina meta orfani
DELETE FROM wptest_postmeta
WHERE post_id NOT IN (SELECT ID FROM wptest_posts);
Ecco la lista completa dei parametri che devi personalizzare nella query e nel cron job prima di usarli in produzione:
Per eseguire questa query esistono diversi approcci. I due più comuni sono:
Molti hosting mettono a disposizione phpMyAdmin, un’interfaccia web per gestire MySQL. In questo caso:
Se hai accesso al server via SSH, puoi usare direttamente il client MySQL. Ti basterà salvare la query in un file, ad esempio cleanup.sql, e poi eseguirla con:
Non ci stancheremo mai di ripeterlo: prima di eseguire query di cancellazione fai sempre un backup completo del database. È la miglior garanzia per poter tornare indietro in caso di errore.
Eseguire la query manualmente può andare bene una volta, ma su un portale che continua a crescere serve un approccio automatico. Qui entra in gioco il cron job, uno strumento dei server Linux che permette di pianificare l’esecuzione di comandi a intervalli regolari.
Per esempio, possiamo programmare l’esecuzione della query ogni notte alle 3 del mattino, quando il sito ha poco traffico. Ecco come:
Da quel momento, ogni notte il sistema eseguirà automaticamente la query, mantenendo il database leggero e ordinato.
Se hai un pannello di gestione del server, puoi farlo direttamente dalle impostazioni “CronJob” invece di usare il terminale.
Naturalmente, cancellare i vecchi articoli è solo una parte del lavoro. Per avere un sito davvero veloce è importante intervenire anche su altri fronti:
Gestire un sito WordPress con decine di migliaia di articoli non è semplice. Se non si adottano strategie di ottimizzazione, il rischio è di avere un portale lento, difficile da gestire e poco gradito agli utenti. La soluzione che abbiamo messo in pratica – cancellare periodicamente gli articoli vecchi con una query SQL automatizzata – ci ha permesso di mantenere siti molto grandi stabili e performanti.
È un approccio radicale ma estremamente efficace, soprattutto per portali di news dove i contenuti hanno una “vita utile” limitata. Se anche tu gestisci un sito WordPress molto grande e stai affrontando problemi simili, questo metodo potrebbe fare la differenza.
E se vuoi un supporto professionale, contattaci: siamo un’agenzia specializzata nello sviluppo e nella manutenzione di siti WordPress complessi, e ci piace trovare soluzioni concrete ai problemi reali.
Lavoriamo a distanza senza problemi, ma è sempre bello conoscersi di persona. Puoi raggiungere il nostro ufficio con i principali mezzi pubblici, in auto o a piedi se ti trovi vicino al centro. Abbiamo sempre caffè, caramelle e un buon whiskey.
Assistenza tecnica e sviluppo dal lunedì al venerdì 9.30 - 18.30 esclusi festivi.
Per emergenze fuori orario puoi usare questo form
3 minuti a piedi dalla linea metropolitana M1 e stazione ferroviaria Milano P.ta Venezia
8 minuti a piedi dalla linea metropolitana M3 Milano Repubblica
10 minuti a piedi dalla linea metropolitana M2 M3 e stazione ferroviaria Centrale FS
Sei in auto? Ti consigliamo di parcheggiare in via Benedetto Marcello, a 5 minuti a piedi dal nostro ufficio
Da anni collaboriamo con agenzie di comunicazione e studi grafici in qualità di partner tecnologici. Sviluppiamo siti web, portali, app mobile e piattaforme digitali sulla base del vostro design e template, operando come ghost developers. Questo vi consente di mantenere la piena gestione del cliente finale senza dover internalizzare la parte tecnica, che può risultare complessa da gestire e dispendiosa. Lavoriamo con l’elasticità e l’efficienza di un team interno, gestendo autonomamente task tecnici articolati, distribuendoli tra le nostre figure specializzate. Il processo di sviluppo del vostro progetto sarà completamente trasparente: voi curate il design e la relazione con il cliente, al resto pensiamo noi.