WP_HOME and WP_SITEURL for WordPress Multisite Development & Migration
I needed to be able to copy the wp_options
table(s) to my development environment as they contain configurations that are needed. To overcome the issue of not being able to set the WP_SITEURL
and WP_HOME
values in WordPress MultiSite, I wrote a custom filter to replace the _config_wp_siteurl()
and _config_wp_home()
functions that are available for non-multisite installs that is included in a plugin that is available network-wide and is configured in wp-config.php
. I am then able to copy all of the database tables except wp_site
and wp_blogs
to a local database.
I highly recommend the URL Token Replacement Techniques for WordPress 3.0 article by Chris Murphy to help handle URLs in your content.
This example assumes a subdomain multisite install, with a domain of example.com and two subdomains, www.example.com and second.example.com. The local development URLs will be www.example.local and second.example.local respectively.
WordPress Multisite Updates
Database Changes:
Update the domain value in wp_site:
UPDATE wp_site SET domain = 'example.local' WHERE domain = 'example.com';
Update the domain value(s) in wp_blogs:
UPDATE wp_blogs SET domain = 'www.example.local' WHERE domain = 'www.example.com'; UPDATE wp_blogs SET domain = 'second.example.local' WHERE domain = 'second.example.com';
Plugin Code:
The following plugin should be installed network-wide.
<?php /* Plugin Name: MultiSite WP_HOME and WP_SITEURL Plugin URI: http://doublesharp.com/ Description: Allows wp_options values to be overwritten in wp-config.php for MultiSite Author: Justin Silver Version: 1.0 Author URI: http://doublesharp.com License: GPL2 */ /** * Replace this site's WP_SITEURL URL based on constant values * * @param String $url - The original URL * @return String - The replaced URL if overridden in wp-config.php */ function _ms_config_wp_siteurl( $url = '' ) { if (is_multisite()): global $blog_id, $current_site; $cur_blog_id = defined( 'BLOG_ID_CURRENT_SITE' )? BLOG_ID_CURRENT_SITE : 1; $key = ( $blog_id!=$cur_blog_id )? $blog_id.'_' : ''; $constant = 'WP_'.$key.'SITEURL'; if ( defined( $constant ) ) return untrailingslashit( constant($constant) ); endif; return $url; } add_filter( 'option_siteurl', '_ms_config_wp_siteurl' ); /** * Replace this site's WP_HOME URL based on constant values * * @param String $url - The original URL * @return String - The replaced URL if overridden in wp-config.php */ function _ms_config_wp_home( $url = '' ) { if (is_multisite()): global $blog_id; $cur_blog_id = defined( 'BLOG_ID_CURRENT_SITE' )? BLOG_ID_CURRENT_SITE : 1; $key = ( $blog_id!=$cur_blog_id )? $blog_id.'_' : ''; $constant = 'WP_'.$key.'HOME'; if ( defined( $constant ) ) return untrailingslashit( constant($constant) ); endif; return $url; } add_filter( 'option_home', '_ms_config_wp_home' ); ?>
Configure wp-config.php:
Add new constants to wp-config.php. The primary site should use the standard WP_HOME and WP_SITEURL and the tertiary URLs should use WP_{$blog_id}_HOME
and WP_{$blog_id}_SITEURL
where {$blog_id}
is the numeric blog ID value that you want to replace from the wp_blogs
table.
define('WP_HOME', 'http://www.example.local'); define('WP_SITEURL', 'http://www.example.local'); define('WP_2_HOME', 'http://secondary.example.local'); define('WP_2_SITEURL', 'http://secondary.example.local');
This post is the result of a question that I originally asked on StackOverflow – Override WP_SITEURL and WP_HOME for WordPress Multisite – and ultimately answered with the help of Chris Murphy.