Migrating a single site of a wordpress multisite instance
Recently I had to deal with a WordPress multisite instance, the task was moving the contents of one of the sites hosted on the network to a local copy, update them and the re-move them to the production server.
Due the fact that many plugins were used, in particular WPML, using the native import/export features was impossible, so I developed a little Rake task to do the job. Essential was the discovery of PHP serialize by Elijah Miller, which basically lets you un-serialize and serialize objects using the same algorithm used to store data on some WordPress tables, such as wp_options.
The task is driven by a config file and do two things, first of all it dumps the database in a temporary instance, then it find and replace the required patterns, including those saved in a serialized database field; last it exports only the required tables.
Here’s an example of the config file:
dump: mysqldump: "path/to/bin/mysqldump" mysql: "path/to/bin/mysql" databases: origin: database: your-db-name username: your-db-username password: your-db-password host: your-db-host transito: database: a-transit-database-name username: your-db-username password: your-db-password host: your-db-host domain: domainofthenetwork1: substitute: a_substitution: old: "find-this-string" new: "replace-with-this-string" tables: - a_table_we_want_to_export domainofthenetwork2: substitute: an_other_substitution: old: "find-this-other-string" new: "replace-with-this-other-string" more_substitution: old: "you-can-ask-replacement" new: "of-as-many-strings-as-you-want" tables: - a_table_we_want_to_export2
Once created this config.yml file you can call
rake util:dump domain=domainofthenetwork1
and obtain a replace.sql file containing only the tables required by domainofthenetwork1 and with all the desired patterns replaced.
The Rakefile containing this task is, as always, available on Github.