Migrate WordPress to Custom PHP Without Losing SEO – BuiltToWinWeb
EN ES FR DE IT PT ZH JA KO RU NL
← Back to all articles
?>

Migrare da WordPress a PHP personalizzato senza perdere SEO – La guida completa in 7 passaggi

Passare da WordPress a una base di codice PHP personalizzato può ridurre il TTFB del 70%, eliminare le vulnerabilità dei plugin e darti il 100% di proprietà. Ma se gestisci male reindirizzamenti e metadati, farai crollare il tuo posizionamento. Ho migrato oltre 30 siti WordPress – ecco il processo esatto che preserva (e spesso migliora) la SEO.

Perché migrare da WordPress a PHP personalizzato?

  • Prestazioni lente – Anche con la cache, WordPress carica oltre 847 KB di JavaScript.
  • Vulnerabilità dei plugin – Il 96% dei siti WordPress violati è dovuto a plugin obsoleti.
  • Costi mensili – Plugin premium, hosting ottimizzato per WP e manutenzione si accumulano.
  • Blocco – Non possiedi il codice; possiedi un database di post e un tema.

PHP personalizzato ti dà il controllo totale, tempi di caricamento inferiori al secondo e zero costi mensili della piattaforma. Ma la migrazione deve essere impeccabile.

Prima di iniziare: L’audit pre‑migrazione

  • Esporta tutti gli URL – Usa Screaming Frog (gratuito fino a 500 URL) o wget: wget --spider --force-html -r -l 3 https://tuosito.com 2>&1 | grep '^--' | awk '{ print $3 }' > urls.txt
  • Registra i posizionamenti – Esporta le prime 100 parole chiave da Google Search Console (rapporto sulle prestazioni).
  • Salva i metadati – Screaming Frog può esportare tag titolo, meta descrizioni e H1 in CSV.
  • Documenta i backlink – Usa Search Console → Link → Link esterni, o Ahrefs/SEMrush se disponibili.

Passaggio 1: Esegui il crawl del tuo vecchio sito (Screaming Frog in profondità)

Scarica Screaming Frog SEO Spider (gratuito fino a 500 URL). Configuralo per estrarre:

  1. Tutti gli URL interni.
  2. Tag titolo e meta descrizioni.
  3. Tag canonici.
  4. Intestazioni H1.
  5. Codici di risposta (200, 301, 404).

Esporta in CSV. Questo file diventa la tua mappa di migrazione. Lo userai per verificare che ogni pagina esistente abbia una destinazione.

Passaggio 2: Mappa gli URL alla nuova struttura – Mantienili identici se possibile

L’approccio più sicuro: mantieni esattamente gli stessi percorsi URL. Se i tuoi URL WordPress sono puliti (es. /servizi/web-design), puoi riutilizzarli. Cambia struttura solo se:

  • I tuoi URL WordPress includono /2023/01/nome-post/ (date) – rimuovi le date.
  • Hai contenuti duplicati dagli archivi /categoria/ e /etichetta/ – eliminali.

Esempio di mappatura per un blog:

/2023/01/perche-php-personalizzato → /blog/perche-php-personalizzato
/categoria/prestazioni → /blog/categoria/prestazioni (opzionale, puoi eliminare le pagine di categoria)
/etichetta/seo → (elimina – le pagine delle etichette spesso diluiscono l’autorità)

Crea un CSV con due colonne: old_url, new_url. Per le pagine che non stai ricreando (es. archivi di etichette), reindirizza alla pagina pertinente più vicina.

Passaggio 3: Esporta il contenuto da WordPress

Metodo A – WP REST API (più facile per siti piccoli)

<code>&lt;?php<br>$posts = json_decode(file_get_contents('https://tuosito.com/wp-json/wp/v2/posts?per_page=100&page=1'));<br>foreach ($posts as $post) {<br>    $data = [<br>        'title' => $post->title->rendered,<br>        'slug' => $post->slug,<br>        'content' => $post->content->rendered,<br>        'excerpt' => $post->excerpt->rendered,<br>        'date' => $post->date,<br>        'meta' => [<br>            'title' => get_post_meta($post->id, '_yoast_wpseo_title', true),<br>            'description' => get_post_meta($post->id, '_yoast_wpseo_metadesc', true)<br>        ]<br>    ];<br>    // Inserisci nella tabella MySQL personalizzata<br>}<br>?&gt;</code>

Metodo B – WP CLI (più veloce per siti grandi)

<code>wp export --dir=/tmp --post_type=post,page --with_attachments</code>

Metodo C – MySQL diretto (per controllo totale)

<code>SELECT ID, post_title, post_name, post_content, post_date FROM wp_posts WHERE post_status = 'publish' AND post_type IN ('post', 'page');</code>

Quindi recupera i metadati Yoast SEO da wp_postmeta dove meta_key IN ('_yoast_wpseo_title','_yoast_wpseo_metadesc').

Passaggio 4: Ricostruisci il tuo sito PHP personalizzato con gli stessi metadati

  • Lo stesso identico tag <title> (da Yoast o All in One SEO).
  • La stessa <meta name="description">.
  • Lo stesso <h1> (anche se una modifica minore è solitamente accettabile).

Memorizza i metadati nel tuo database (es. una tabella page_meta) o in un array PHP. Per siti dinamici, puoi persino mantenere il database di WordPress come fonte di sola lettura durante la transizione – ma questo aggiunge complessità.

Passaggio 5: Implementa i reindirizzamenti 301 (Il passaggio più critico)

Un reindirizzamento 301 dice a Google: “Questa pagina è stata spostata permanentemente.” Google trasferisce quasi il 100% del potere di ranking della vecchia pagina al nuovo URL.

Per Apache (.htaccess) – Ideale per meno di 200 reindirizzamenti

<code>Redirect 301 /vecchio-url /nuovo-url<br>Redirect 301 /2023/01/perche-php-personalizzato /blog/perche-php-personalizzato</code>

Per migliaia di reindirizzamenti – Usa una mappa PHP (evita di gonfiare .htaccess)

<code>&lt;?php<br>$redirects = json_decode(file_get_contents(__DIR__ . '/redirects.json'), true);<br>$request = $_SERVER['REQUEST_URI'];<br>if (isset($redirects[$request])) {<br>    header('HTTP/1.1 301 Moved Permanently');<br>    header('Location: ' . $redirects[$request]);<br>    exit;<br>}<br>?&gt;</code>

Per Nginx – Usa la direttiva map

<code>map $request_uri $new_uri {<br>    /vecchio-url /nuovo-url;<br>    /2023/01/perche-php-personalizzato /blog/perche-php-personalizzato;<br>}<br>server {<br>    if ($new_uri) {<br>        return 301 $new_uri;<br>    }<br>}</code>

Consiglio da professionista: Non concatenare mai i reindirizzamenti (A → B → C). Ogni salto perde una piccola quantità di link juice. Reindirizza sempre direttamente A → C.

Passaggio 6: Genera una sitemap XML dinamica

Non usare una sitemap statica – diventerà obsoleta. Invece, crea sitemap.php che produce XML dinamicamente:

<code>&lt;?php<br>header('Content-Type: application/xml');<br>echo '&lt;?xml version="1.0" encoding="UTF-8"?&gt;';<br>echo '&lt;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&gt;';<br>$pages = getAllPageUrlsFromDatabase(); // la tua funzione personalizzata<br>foreach ($pages as $url) {<br>    echo '&lt;url&gt;&lt;loc&gt;' . htmlspecialchars($url) . '&lt;/loc&gt;&lt;lastmod&gt;' . date('Y-m-d') . '&lt;/lastmod&gt;&lt;/url&gt;';<br>}<br>echo '&lt;/urlset&gt;';<br>?&gt;</code>

Quindi aggiungi una regola di riscrittura in .htaccess:

<code>RewriteRule ^sitemap\.xml$ sitemap.php [L]</code>

Invia la sitemap a Google Search Console immediatamente dopo il lancio.

Passaggio 7: Lancia e monitora per 30 giorni

  1. Controlla tutti i reindirizzamenti – Usa un crawler (Screaming Frog) per visitare ogni vecchio URL e verificare che restituisca un 301 al nuovo URL.
  2. Monitora quotidianamente il rapporto “Copertura” di Google Search Console – Cerca errori 404. Per ogni 404, aggiungi un reindirizzamento mancante o correggi il link rotto.
  3. Invia la nuova sitemap – In Search Console, vai su Sitemap → Aggiungi una nuova sitemap (sitemap.xml).
  4. Osserva i Core Web Vitals – Entro una settimana, dovresti vedere un miglioramento. In caso contrario, esegui il debug di immagini, CSS o configurazione del server.
  5. Confronta i posizionamenti dopo 4 settimane – Esporta nuovamente i dati GSC. La maggior parte dei clienti vede nessun cambiamento o un leggero miglioramento a causa di tempi di caricamento più rapidi.

Insidie comuni e come evitarle

Insidia 1: Cambiare URL senza reindirizzamenti

Sintomo: Errori 404 in Search Console.

Soluzione: Implementa la mappa PHP dei reindirizzamenti prima del lancio.

Insidia 2: Dimenticare di migrare le meta descrizioni

Sintomo: Google riscrive il tuo snippet con testo casuale.

Soluzione: Usa la stessa esportazione di metadati del Passaggio 1.

Insidia 3: Perdere le immagini (file multimediali)

Sintomo: Immagini rotte sul sito personalizzato.

Soluzione: Copia l’intera cartella /wp-content/uploads/ nella directory pubblica del tuo nuovo sito. Imposta un reindirizzamento da /wp-content/uploads/... a /uploads/... se hai spostato la cartella.

Insidia 4: Avvisi di contenuto misto (immagini HTTP)

Sintomo: Il browser mostra “contenuto non sicuro” su HTTPS.

Soluzione: Cerca e sostituisci i vecchi URL delle immagini nel tuo database da http://vecchiosito.com a https://nuovosito.com.

Caso di studio reale: Migrazione di un sito aziendale di 500 pagine

Una rete di franchising nazionale aveva un sito WordPress con oltre 500 pagine di sedi, ciascuna con contenuti unici. Il tempo di caricamento era di 2,8 s (mobile) e pagavano $300/mese per hosting e plugin.

Processo:

  • Esportazione di tutti i dati delle sedi utilizzando WP CLI.
  • Ricostruzione di un sito PHP personalizzato con un singolo template PHP che estraeva i dati delle sedi da MySQL.
  • Mantenimento della struttura URL identica (/sedi/citta-stato/).
  • Utilizzo di una mappa PHP per i reindirizzamenti 301 (anche se gli URL non cambiavano, hanno mantenuto la mappa per sicurezza).

Risultati dopo 60 giorni:

  • TTFB: 800 ms → 180 ms.
  • Prestazioni Lighthouse: 58 → 96.
  • Costo hosting: $300/mese → $30/mese (VPS standard).
  • Posizionamenti: Migliorati per l’87% delle pagine delle sedi (grazie alla velocità).
  • Traffico organico: +23% entro 3 mesi.

Il cliente ora possiede il codice completamente, non paga commissioni per i plugin e può aggiungere nuove sedi istantaneamente tramite un semplice caricamento CSV.

Dovresti migrare? Un quadro decisionale

Migra a PHP personalizzato se:

  • Il tuo sito è per lo più statico o ha contenuti prevedibili (blog + servizi).
  • Sei stanco della manutenzione dei plugin e degli aggiornamenti di sicurezza.
  • Vuoi il 100% di proprietà del codice e nessuna tariffa mensile della piattaforma.

Rimani su WordPress se:

  • Hai bisogno di e-commerce avanzato (anche se PHP personalizzato può gestirlo).
  • Dipendi fortemente dalle estensioni di WooCommerce.
  • Il tuo team non è tecnico ed è abituato all’amministrazione WP.

Pronto per fare il cambio?

Ho migrato oltre 30 siti WordPress a PHP personalizzato – da piccoli blog a negozi e-commerce di 2.000 pagine. Gestisco tutto: esportazione dei contenuti, mappatura degli URL, reindirizzamenti 301, conservazione dei metadati e monitoraggio post‑lancio.

Il tuo sito PHP personalizzato si caricherà in meno di 0,8 s, otterrà 100 su Lighthouse e non pagherai mai più una commissione per i plugin.

Lasciami migrare il tuo sito WordPress →

Tutti i dati provengono da reali migrazioni di clienti eseguite da BuiltToWinWeb. I risultati individuali possono variare in base alla complessità e al contenuto del sito.