How-To: Convert a WordPress site from Multisite to Standalone install

3 minute read

Since wordpress 3.0, it is possible to create a network or site by using the multisite feature. It allows to manage multiple wordpress websites from a single installation. Plugins, themes get installed and maintained in one place, and the individual sites can activate them.

While multisite has its benefits, in my case, I wanted to return to a good old standalone install. I had a plan a long time ago to move multiple websites from drupal onto wordpress, but never got to it. Finally, I much prefer to handle the upgrade of 1 site on it own rather than upgrading all at the same time. While wordpress does a good job at making maintenance easy, I have been bitten a few time in the past by upgrades going bad.

Finally, one should also read WordPress: Create A Network” before going head down in setting it up.

Moving off a multisite install is not that straightforward, some of the resource will end up in different places, permalinks need to be fixed and some files need to be moved around.

Disclaimer

Before doing anything, make a backup of your site and try to run this tutorial in a VM or dev environment as you may need to adjust a few steps to fit your setup.

Also, to be noted, you should not run this on a live website as this will migration will cause downtime.

This worked for me, but the migration is rather manual and your mileage may vary. Please follow this steps with caution!

Getting started

Finding your site ID

Now that you have a backup, you will need to find which site ID you are migrating. You can get this from visiting http://example.com/wp-admin/network and find the site you are migrating off.

In this example, I was moving site ID 2.

Database

Exporting your DB

The database table you will want to export may vary depending on the plugins you have installed and used. Here, assuming your site had ID 2 and your db table_prefix was set to wp__, you will want to dump ALL tables starting with _wp_2_ along with wp_usermeta and wp_users, as they will contain the users from the multisite.

Here is a 1-liner that may help to get all the required data out assuming:

  • DB name: mywordpressdb
  • DB table prefix: wp_
  • Site ID: 2
mysqldump -u root -p mywordpressdb $(mysql -u root -p mywordpressdb -N -s -e 'show tables;' | grep '^wp_2_') > mywordpressdb.sql

Fixing the DB

Now that we have the relevant tables, it is time to fix the content of the DB. sed is your friend here:

sed -i 's#wp-content/blogs.dir/2/files#wp-content/uploads#g' mywordpressdb.sql # Fix uploaded file locations
sed -i 's#wp_2_#wp_#g' mywordpressdb.sql # fix table names
sed -i 's#/files/#/wp-content/uploads/#g' mywordpressdb.sql # fix file upload permalinks

At this stage, you should have a database backup that should allow you to restore your wordpress site in standalone mode.

WordPress files

Assuming your wordpress install is in /var/www/wordpress, running the following command should copy the files that were uploaded while using a multisite set up to a standalone setup:

rsync -avz /var/www/wordpress/wp-content/blogs.dir/2/files/ /var/www/wordpress/wp-content/uploads/
rm -rf /var/www/wordpress/wp-content/blogs.dir/2/files

Importing standalone setup DB

The backup we made earlier should contain all the data we need, but to be on the safe side, we will let the wordpress installer bootstrap a new DB and then re-import the data.

Bootstrapping the DB

At this stage, I assume you have a brand new DB called mywordpressdb. To force the wordpress installer to run, we will move wp-config.php in another location and we will copy it back later.

Accessing http://www.example.com should now trigger the wordpress installer. Go through the install steps to setup the database.

Restoring DB

To restore the DB from our backup, we will use the mysql CLI:

mysql -u root -p mywordpressdb < mywordpressdb.sql

Fixing the config

We now need to fix the wp-config.php file by removing references to multisite config. Below is an example of the constants that need to be removed from wp-config:

--- wordpress.old/wp-config.php 2016-01-25 17:07:24.437572380 -0500
+++ wordpress/wp-config.php 2016-01-25 23:44:56.432183250 -0500
@@ -119,15 +121,6 @@
* in their development environments.
*/
define('WP_DEBUG', false);
-define('WP_ALLOW_MULTISITE', true);
-
-define( 'MULTISITE', true );
-define( 'SUBDOMAIN_INSTALL', true );
-$base = '/';
-define( 'DOMAIN_CURRENT_SITE', 'debuntu.org' );
-define( 'PATH_CURRENT_SITE', '/' );
-define( 'SITE_ID_CURRENT_SITE', 1 );
-define( 'BLOG_ID_CURRENT_SITE', 1 );

/* That's all, stop editing! Happy blogging. */

Finally, we need to copy wp-config.php back to /var/www/wordpress/