I’ve been wanting to try out a new theme for davidseah.com, so I needed to create a duplicate installation. Ordinarily, a plugin like BackupBuddy would help migrate the site with relatively little pain, but it turns out that the ones I tried are not able to handle a WordPress Network. This is the case when a single installation of WordPress is used to manage more than one blog; usually it’s one installation per blog. This site, davidseah.com, is a WP Network with each process blog (e.g. this InfoTech process blog) can have its own theme and set of features. There really is no reason for it other than I thought it might be useful for creating more focused subblogs, but in practice it probably hurts more than it helps.
Anyway, since none of the commercial plugins I tried (BackupBuddy and WPMUDEV Snapshot) worked for me, I needed to perform the migration manually. I wasn’t sure if it could be easily done, but there were two helpful posts that got me through it: Moving WordPress Multisite on the WordPress Codex (which I stupidly read last) and Moving WordPress multisite to a new domain/server. You’ll also want to read Changing the Site URL if the domain name is changing.
Basically you do this:
- Make a sqldump of the original database with
mysqldump, using the WordPress db credentials in
- Archive the
tar, along with anything else you might need in the filesystem
- Ftp/sftp from the OLD server to the NEW server, and
putthe sqldump and tar archive
- Install WordPress on the new server, setting up the new WordPress db credentials
- Make sure you have some way of accessing the new WordPress database with a tool like PhpMyAdmin, because you will need to change some values if the domain is different!
- Make sure you have some way of seeing PHP errors.
- Use the
mysqlcommand to import the sqldump, using the new db credentials. Optionally use PhpMyAdmin.
- Untar the
wp-contentarchive in a
_tarballsfolder to keep things tidy, and then
cp -R(recursive copy) the contents of the
pluginsfolder over to the WordPress install.
- Make sure the
wp-config.phpfile has the Multisite enabling commands, otherwise nothing will happen.
Read on for example.
This is an example based on my own recent clone from a CentOS 5-based Plesk-managed server (a Media Temple (dv) 4) to a Digital Ocean Ubuntu 13.10 WordPress test installation.
Let’s say we’re migrating a WordPress Network from oldserver.com to newserver.com. We’ve already installed WordPress on newserver.com in a subdirectory called ‘wordpress’ and the instructions for Giving WordPress Its Own Directory have already been followed. On oldserver.com, we had the WP files in the docroot (no subdirectory install here, and it sucked!)
|path to wp||/var/www/vhosts/oldserver.com/httpdocs||/var/www/wordpress|
1. Backup Oldserver
I’m assuming you have privileges to open a shell on both newserver and oldserver, and can run the
tar commands. You might be able to
sudo if you can’t elevate to root…this depends on your hosts. It goes without saying that both versions of WordPress are the exact same version.
Let’s make backups and send them to the new server. Connecting directly between hosts is waaaaay faster than downloading/reuploading if you have a huge site.
ssh firstname.lastname@example.org cd /var/www/vhosts/oldserver.com/httpdocs tar cvzf files.tgz wp-content/plugins/* wp-content/themes/* wp-content/uploads/* mysqldump -u'wpuser123' -p wp123 > dump.sql sftp newserver.com [login as newusernell] sftp> put dump.sql sftp> put files.tgz sftp> exit
Now, open a new SSH window and login to newserver.com
ssh email@example.com cd ~newusernell mkdir _tarballs mv files.tgz _tarballs cd _tarballs tar xvzf files.tgz cp -R wp-content/* /var/www/wordpress/wp-content mysql -u'wordpress'@'newserver.com' -p'new1e1123' wordpress < dump.sql
At this point, the basic files and database have been move. However, you will need to make a few edits as detailed in Moving WordPress Multisite and make sure
wp-config.php has all those options set correctly and match your original install.
In this example, we're also moving the site to a subdirectory install. This has implications as detailed in Changing the Site URL. because the new installation is in a subdirectory (which has implications for
index.php in the root…see Giving WordPress Its Own Directory for more info).
In practice, there are some gotchyas:
- Differences in the config or version of MySQL and PHP can cause hiccups.
- Subtle differences in
.htaccessfiles or unsupported featured cause server error 500.
- Can't find the PHP error log, or forgetting to restart Apache after enabling PHP error logging.
- Moving to a different domain, which requires editing the databases manually, or use the "functions.php" trick to the options. Note that the option names are misleading: 'siteurl' is actually the "WordPress Address" in the admin panel (where the WP core files are), whereas the 'home' option corresponds to "Site Address". This matters if your core WP files are in a subdirectory, not at the root.
- Making sure that the Multisite commands in
wp-config.phpare present and correct (particularly for subdomain versus subdirectory setting).
- The database wordpress user may not have all privileges for an error-free import of the database. Using PhpMySqlAdmin to handle the db transfer instead of using the command line might work around this, otherwise you'll have to grant the appropriate SUPER privs (also possible with PhpMySqlAdmin)