Spostare WordPress tra ambienti o nomi di dominio
da Massimo Della Rovere · pubblicato il 4 Dicembre, 2014 · modificato il 11 Ottobre, 2016

In questo articolo affronteremo le tecniche e le operazioni che devono essere svolte in WordPress quando dobbiamo cambiare ambiente di esecuzione o spostare il nostro sito in un dominio diverso. Anche se può sembrare un’operazione molto semplice, in realtà può nascondere diverse difficoltà, un’esempio pratico è la nostra community italiana, dove è molto frequente che venga pubblicata propria questa domanda.

Le situazioni in cui abbiamo la necessità di spostare la nostra installazione sono diverse, ad esempio stiamo lavorando in (locale) e vogliamo pubblicare tutto in ambiente web su un hosting condiviso. È comune anche la situazione contraria, ad esempio copiare un sito di produzione in ambiente (locale) o su altro dominio, il quale può essere usato sia per test che per semplice cambio di nome. In ogni caso, qualunque sia il motivo le operazioni da eseguire sono quasi sempre le stesse.

Trasferimento di un sito web

Prima di procedere ad analizzare le operazioni necessarie ad un trasferimento completo è bene capire cosa di preciso bisogna spostare in un’istallazione WordPress e quali sono gli elementi principali che devono essere salvati. Suddividerei gli elementi in file del core, in cui includerei anche temi e plugin, database MySQL che contiene tutti i nostri articoli, e i file della Libreria Media (immagini, video, audio, etc) che normalmente si trovano nella directory (wp-content), anche se ormai non è sempre vero, infatti ultimamente vengono usate sempre più spesso delle CDN per i contenuti statici.

Wordpress change domain

A questo aggiungerei la configurazione del Web Server sull’ambiente di destinazione e il controllo di eventuali moduli come il rewrite e la gestione del file .htaccess, il quale viene quasi sempre utilizzato anche da WordPress. Finita l’operazione di spostamento si passa alla cosa più importante di tutti, modificare tutti gli URL locali memorizzati nel database, che una volta copiati punteranno ancora alla sorgente di origine.

Infatti bisogna sapere che ogni volta che inseriamo in un articolo un’immagine o una qualche risorsa locale, il nostro WordPress memorizza tutta la stringa URL completa nel database, quindi se spostiamo l’articolo questi URL continueranno sempre a puntare al vecchio dominio. Non mi chiedete il perché, ci sono diverse discussioni su questo, è come parlare in politica di destra e sinistra, non ne usciamo più :)

Operazioni per il trasferimento

Adesso che abbiamo chiaro cosa dobbiamo spostare, andiamo ad analizzare tutte le operazioni necessarie ad un trasferimento completo. Vi indicherò le operazioni su diversi gruppi, rispettando lo schema grafico che vi ho allegato precedentemente. La sequenza degli argomenti sarà impostata in questa maniera: Server WEB, Database, WordPress con Temi e Plugin, Risorse Media e modifica della stringa URL nel database.

1. Server WEB (su sistema di destinazione)

Ovviamente WordPress funziona se installato su un server web, quindi nell’ambiente di destinazione, sia che sia locale o internet dobbiamo verificare di aver un software compatibile con il sistema di origine. Se ad esempio l’origine utilizza apache 2.4 non andate ad utilizzare una versione più vecchia, o peggio ancora utilizzare un server diverso come IIS, non dico che non sia possibile farlo, ma è meglio evitare problemi.

Se utilizzate Apache come la maggior parte delle installazioni di WordPress, controllate che sul sistema di destinazione ci siano i moduli necessari, ad esempio il modulo rewrite che permette a WordPress di gestire le friendly URL è quasi sempre richiesto, se non è attivato non vi funzionerà quasi niente. Controllate anche il file .htaccess presente nella root principale del sistema origine, infatti analizzando questo file è possibile capire i moduli particolari che conviene installare sul sistema di destinazione.

2. Trasferimento Database MySQL

Per trasferire il database bisogna salvare tutte le tabelle dal sistema origine ed eseguire l’operazione di ripristino sul sistema di destinazione. Bisognerà anche creare nel sistema di destinazione un’utente di database e una password per accedere a questo database. Se volete mantenere le stesse credenziali del sistema origine, andate a guardare nel file (wp-config.php) presente della directory principale.

// ** MySQL settings - You can get this info from your web host ** //
define('DB_NAME','database_pluto');
define('DB_USER','utente_paperino');
define('DB_PASSWORD','password_topolino');
define('DB_HOST','localhost');
define('DB_CHARSET','utf8');

In questo file trovate anche come deve essere chiamato il database e il nome host su cui questo punta, se ad esempio state copiando tutto WordPress da un sistema Aruba per portarlo in locale, ricordate di cambiare questo valore in localhost o nell’indirizzo a cui risponde il vostro nuovo MySQL Server. In ogni caso potete anche cambiare tutto, però ricordatevi di cambiare (wp-config.php) con i nuovi parametri.

1. Salvataggio Database (sistema origine)

Per salvare il database dal sistema di origine è possibile utilizzare la funziona messa a disposizione nel pannello admin del vostro hosting (è quasi sempre presente) o utilizzare un plugin come ad esempio WP-DB-Backup. In alternativa potete utilizzare un software come phpmyadmin, anche esso presente in molti servizi di hosting. Volendo è possibile anche fare tutto da linea di comando:

mysqldump --add-drop-table -h nome_host
    -u user -p nome_del_database > database_origine.sql

Insomma, alla fine qualsiasi sistema decidete di utilizzare, l’importante è ottenere un file con estensione .SQL che contiene tutte le informazioni necessarie a creare il database in un’altro sistema. Se il il database dovesse risultare molto grande, conviene utilizzare una compressione prima del trasferimento, come ad esempio (zip) o (tar).

2. Ripristino Database (sistema di destinazione)

Dato che il salvataggio salva solo le tabelle, dobbiamo creare un database e ripristinare le tabelle. Per svolgere questa operazione è possibile utilizzare gli strumenti come phpmyadmin, MySQL Workbench, altri client MySQL o la linea di comando.

// Entro in una sessione MySQL, normalmente
// in ambiente localhost si usa root per le operazioni

mysql -u root -p

// Creazione e verifica del nuovo database
// Vi conviene usare lo stesso nome di origine

CREATE DATABASE nome_del_database;
SHOW DATABASES;
QUIT

// Ripristino tabelle dentro database appena creato
// Nome host usare localhost o indirizzo server MySQL

mysql -h nome_host 
   -u root -p nome_del_database < database_origine.sql

Adesso dobbiamo creare un’utente per accedere allo stesso database, possiamo utilizzare lo stesso indicato in (wp-config.php) o crearne uno nuovo e poi modificare questo file quando lo porteremo sul sistema di destinazione. Gli strumenti per questa operazione sono sempre i soliti, quindi usate quello con cui vi trovate meglio.

// Entro in una sessione MySQL, normalmente
// in ambiente localhost si usa root per le operazioni

mysql -u root -p

// Aggiungo tramite SQL utente e host al database
// Specificare le stesse credenziali di wp-config.php

GRANT ALL PRIVILEGES ON nome_del_database.* to nome_utente@nome_host
   IDENTIFIED BY 'specifica_la_password';

QUIT

Se state trasportando l’ambiente in localhost per uno sviluppo personale e volete saltare questa operazione, basta che inserite in (wp-config.php) le credenziali di root e quindi non necessitate di nessun utente specifico. Ovviamente mai farlo in produzione!

3. Trasferimento Core, Temi e plugin

Per svolgere questa operazione dobbiamo salvare tutti i file di WordPress partendo dalla directory radice del sistema di origine. Mi raccomando che la cosa importante è l’opzione document root del server. Quindi le directory di origine e destinazione possono anche essere diverse, l’importante è che ogni server punti a quella giusta. Se per caso i media sono in (wp-content) verranno salvate anche esse in questa fase come in un backup completo e l’operazione numero 4 non sarà più necessaria.

Il backup può essere fatto in diversi modi: possiamo utilizzare un client FTP, ad esempio Filezilla o similare ed eseguire il comando di copia cartella. Se volete risparmiare tempo vi consiglio di creare un file (zip) o (tar) nel server di origine e fare un solo comando di trasferimento FTP. Mi raccomando di rispettare il nome della cartella di origine rispetto alla document root, quindi se l’origine contiene tutti i file in (/) fate lo stesso sul sistema di destinazione, se l’origine ha una cartella tipo /blog create questa sulla destinazione ed eseguita la copia qui dentro.

Dopo la Copia controllare ed eseguire queste operazioni

Andate subito a modificare il file (wp-config.php) e indicate le opzioni configurate sul nuovo ambiente operativo. Controllare bene il file (.htaccess) e vedere se viene usato il nome di dominio in qualche istruzione, in modo da cambiarlo con il nuovo ambiente.

4. Trasferimento Libreria Media

Come detto se questi file erano presenti in (wp-content) o comunque in una directory che era interna al salvataggio globale questa operazione può essere saltata. Se invece i file sono memorizzati in un dominio esterno come ad esempio una CDN allora bisognerà copiarli da questa sorgente e memorizzarli in locale dentro la (wp-content), volendo è possibile usare anche la stessa CDN ma in una sottocartella diversa.

Con l’utilizzo di CDN è possibile anche fare una cosa interessante durante lo sviluppo su ambiente separato, infatti è possibile utilizzare i stessi riferimenti URL sia per la parte di produzione che quella di test. Sempre se non si ha necessità di cambiare le risorse, e a dirvi la verità mi capita molto poco, lavoro molto di più sul codice che sui media.

5. Modifica stringa URL sul database MySQL

Finalmente siamo arrivati all’ultimo passaggio, concluso questo il nostro WordPress è pronto e funzionante. Prima di modificare la stringa cerchiamo di capire quale sia la stringa di origine e quella di destinazione che deve essere modificata. Ad esempio se l’origine è https://domino.com/ potremmo modificarla in http://localhost/.

Per modificare la stringa dobbiamo eseguire dei comandi SQL o usare degli strumenti più specifici. Per quanto riguarda MySQL potete sempre usare gli strumenti che vi ho indicato in precedenza, l’importante è eseguire quanto segue:

// Modifico le opzioni che contengono il nome di dominio in WordPress.
// Sto usando wp_ come prefisso di tabella, voi usate il vostro.

UPDATE wp_options SET option_value = 
  replace(option_value,'http://old-domain','http://new-domain') 
WHERE option_name = 'home' OR option_name = 'siteurl';

// Modifica la stringa URL nel contenuto dei post
// Come ad esempio immagine e allegati di vario genere

UPDATE wp_posts SET guid = 
  replace(guid,'http://old-domain','http://new-domain');

UPDATE wp_posts SET post_content = 
  replace(post_content,'http://old-domain','http://new-domain');

Invece che un client SQL potete anche utilizzare uno strumento che consiglio sempre, vi sto parlando di WP-CLI, sui cui ho scritto anche una guida dedicata. Lo strumento mette a disposizione molti comandi da eseguire su WP senza dover usare stringhe SQL o programmazione. Qui trovate un’esempio per la modifica di una stringa.

NB: Nell’esempio siamo andati a sostituire il nome vecchio con quello nuovo, se per caso le risorse statiche stanno su una CDN, il comando di sostituzione stringa domini va bene per la tabella (wp_options) ma deve essere cambiata per (wp_posts), infatti qui dovete sostituire il domino che appartiene alla CDN e non quello di origine del sito.

2 Commenti

  1. La procedura per una installazione multisite è molto diversa o posso seguire questo articolo? Sulla parte FTP mi sembra uguale ma le tabelle SQL sono diverse.

  2. Ciao Alberto, gli ambienti MU sono differenti dal setup standard di wordpress. Ogni sito ha le sue tabelle e quindi un'eventuale sostituzione di stringa andrebbe ripetuta per ogni singolo "site". In ogni caso il concetto espresso è in buona parte valido anche per questo ambiente.

condividi