Logo Sernicola Labs orizzontale

Come gestire siti WordPress con migliaia di pagine: cancellazione periodica degli articoli

8-ridotta

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.

Il problema: quando WordPress diventa troppo pesante

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:

  • Lato utente: le pagine impiegano più tempo a caricarsi, soprattutto quelle che contengono liste di articoli o ricerche interne.
  • Lato amministratore: il backend diventa più lento, l’editor impiega più tempo ad aprire i contenuti, e perfino l’elenco degli articoli può richiedere secondi o minuti per caricarsi.
  • Lato server: il database cresce in modo sproporzionato, le query diventano più pesanti e si saturano le risorse del server (RAM e CPU).

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.

Cancellare i contenuti vecchi dal sito

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.

La nostra soluzione: una query SQL veloce ed efficace

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.

Il codice

/**
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);

Cosa fa questa query, spiegato in modo semplice

  1. Cancellazione degli articoli vecchi: la prima parte della query cerca tutti i post della categoria news che sono stati pubblicati da più di 365 giorni. Non solo elimina i post, ma anche i legami con le categorie, così non restano dati “zombie”.
  2. Pulizia dei commenti: la seconda parte elimina i commenti che appartenevano a post ormai cancellati. In caso contrario, rimarrebbero righe inutili nel database.
  3. Pulizia dei metadati: infine, vengono rimossi i metadati orfani, cioè tutte quelle informazioni extra che WordPress associa ai post (come campi personalizzati) e che non hanno più motivo di esistere se il post non c’è più.

Ecco la lista completa dei parametri che devi personalizzare nella query e nel cron job prima di usarli in produzione:

Prefisso delle tabelle del database

  • wptest_
      • È il prefisso che WordPress assegna alle tabelle durante l’installazione.
      • In molti casi è wp_, ma può essere diverso per motivi di sicurezza o configurazione.
      • Deve essere sostituito in tutte le tabelle: wptest_posts, wptest_term_relationships, wptest_term_taxonomy, wptest_terms, wptest_comments, wptest_postmeta.

Slug della categoria

  • t.slug = 'news'
      • Qui bisogna inserire lo slug della categoria da cui si vogliono eliminare gli articoli.
      • Ad esempio, se la categoria si chiama eventi e lo slug è eventi, il codice diventa: t.slug = 'eventi'.

Tipo di contenuto

    • p.post_type = 'post'
      • Ad esempio, se la categoria si chiama eventi e lo slug è eventi, il codice diventa: t.slug = 'eventi'.
      • In genere non va modificato, perché di solito si eliminano solo articoli.
      • Tuttavia, se si desidera cancellare un custom post type (ad esempio ricette o newsletters), bisogna sostituire 'post' con il nome del post type.

Stato del contenuto

  • p.post_status = 'publish'
      • Anche questo parametro di solito resta invariato.
      • Serve a cancellare solo articoli pubblicati.
      • Se si volessero eliminare anche bozze o articoli programmati, andrebbe modificato.

Intervallo temporale

  • INTERVAL 365 DAY
        • Indica quanto devono essere vecchi gli articoli da cancellare.
        • Può essere modificato in mesi, settimane o giorni:
          • INTERVAL 730 DAY → 2 anni
          • INTERVAL 6 MONTH → 6 mesi
          • INTERVAL 90 DAY → 3 mesi

Come eseguire la query

Per eseguire questa query esistono diversi approcci. I due più comuni sono:

1. phpMyAdmin

Molti hosting mettono a disposizione phpMyAdmin, un’interfaccia web per gestire MySQL. In questo caso:

  • Accedi al pannello di controllo del tuo hosting.
  • Apri phpMyAdmin e seleziona il database del tuo WordPress.
  • Vai nella scheda SQL e incolla la query.
  • Clicca su Esegui.

2. Accesso SSH

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:

Prima di tutto: backup!

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.

Automatizzare il processo con un cron job

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:

  1. Salva la query in un file, ad esempio /var/www/cleanup_news.sql.
  2. Apri il crontab con il comando:
  3. crontab -e
  4. Aggiungi questa riga: 0 3 * * * mysql -u tuo_utente -ptua_password nome_database < /var/www/cleanup_news.sql

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.

Altri consigli per migliorare le performance di WordPress

Naturalmente, cancellare i vecchi articoli è solo una parte del lavoro. Per avere un sito davvero veloce è importante intervenire anche su altri fronti:

  • Cache: installare un plugin come WP Rocket o W3 Total Cache riduce drasticamente i tempi di caricamento.
  • Ottimizzazione delle immagini: strumenti come Imagify o Smush riducono il peso delle immagini senza perdita di qualità.
  • CDN (Content Delivery Network): distribuisce i contenuti statici (immagini, CSS, JS) da server vicini all’utente, riducendo la latenza.
  • Database ottimizzato: usare MariaDB o MySQL 8 può offrire prestazioni migliori rispetto a versioni più datate.

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.

Ti trovi a Milano? Vieni a trovarci

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.

Mappa illustrata Sernicola Labs a Milano

Il nostro ufficio

Via Felice Casati n°5
20124 - Milano (MI)

Orari

Assistenza tecnica e sviluppo dal lunedì al venerdì 9.30 - 18.30 esclusi festivi.

Per emergenze fuori orario puoi usare questo form

Come raggiungerci

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

Sei un’agenzia e cerchi un partner tecnologico?

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.

This is a basic text element.