Come cambiare dominio con Search & Replace

Spesso si ha l’esigenza di cambiare url di WordPress, a volte a causa di un cambio del dominio o semplicemente se si è sviluppato il sito web su un server di sviluppo (in localhost ad esempio) ed è venuto il momento di migrare sul dominio in produzione.

Per essere più precisi quello che andremo a fare è  eseguire un replace di tutte le occorrenze dell’URL all’interno del database nel caso che il dominio cambi (es. da http://localhost a http://www.esempio.com).

Search & Replace Web GUI

Search & Replace è una libreria disponibile qui, estremaente semplice da utilizzare tramite interfaccia web e installandola nella stessa root di WordPress prende automaticamente le configurazioni del database da wp-config.php. Ad esempio supponiamo di aver caricato tramite FTP la cartella dentro miosito/searchreplace/ basterà semplicemente aprire la suddetta url e inserire i parametri di sostituzione (l’interfaccia è molto intuitiva).

WP CLI Search & Replace Command line

Per chi, come me, preferisce il terminale è preferibile, dove possibile, utilizzare la libreria command line WP CLI, che offre una larga scelta di comandi utili per chi sviluppa tra cui appunto il comando wp search-replace

Vediamo alcuni esempi:

# Search and replace but skip one column
$ wp search-replace 'http://example.dev' 'http://example.com' --skip-columns=guid

# Run search/replace operation but dont save in database
$ wp search-replace 'foo' 'bar' wp_posts wp_postmeta wp_terms --dry-run

# Run case-insensitive regex search/replace operation (slow)
$ wp search-replace '\[foo id="([0-9]+)"' '[bar id="\1"' --regex --regex-flags='i'

# Turn your production multisite database into a local dev database
$ wp search-replace --url=example.com example.com example.dev 'wp_*options' wp_blogs

# Search/replace to a SQL file without transforming the database
$ wp search-replace foo bar --export=database.sql

# Bash script: Search/replace production to development url (multisite compatible)
#!/bin/bash
if $(wp --url=http://example.com core is-installed --network); then
    wp search-replace --url=http://example.com 'http://example.com' 'http://example.dev' --recurse-objects --network --skip-columns=guid --skip-tables=wp_users
else
    wp search-replace 'http://example.com' 'http://example.dev' --recurse-objects --skip-columns=guid --skip-tables=wp_users
fi