I’ve been converting a large WordPress Network installation from a dual subdomain+subdirectory setup to a subdirectory+domain mapping configuration using the WordPress MU Domain Mapping plugin. This should allow for more flexibility when we need to break out of our primary domain name, but so far it has required some extra features in the domain mapping plugin.
Domain Mapped siteurl()
domain_mapping_siteurl() is built to work only for the currently active blog. Here’s a modification which allows a $blog_id parameter:
Index: domain_mapping.php
===================================================================
--- domain_mapping.php (revision 9545)
+++ domain_mapping.php (revision 9553)
@@ -515,27 +515,37 @@
}
-function domain_mapping_siteurl( $setting ) {
- global $wpdb, $current_blog;
+function domain_mapping_siteurl( $setting, $blog_id = 0 ) {
+ global $wpdb, $current_blog, $switched;
// To reduce the number of database queries, save the results the first time we encounter each blog ID.
static $return_url = array();
+ if( $blog_id == 0 ) {
+ $blog_id = $current_blog->blog_id;
+ }
+
$wpdb->dmtable = $wpdb->base_prefix . 'domain_mapping';
- if ( !isset( $return_url[ $wpdb->blogid ] ) ) {
+ if ( !isset( $return_url[ $blog_id ] ) ) {
$s = $wpdb->suppress_errors();
- if ( get_site_option( 'dm_no_primary_domain' ) == 1 ) {
- $domain = $wpdb->get_var( "SELECT domain FROM {$wpdb->dmtable} WHERE blog_id = '{$wpdb->blogid}' AND domain = '" . $wpdb->escape( $_SERVER[ 'HTTP_HOST' ] ) . "' LIMIT 1" );
+ if ( get_site_option( $blog_id, 'dm_no_primary_domain' ) == 1 ) {
+ if ( $switched === false ) {
+ // Only filter using HTTP_HOST if we haven't done switch_to_blog()
+ $domain = $wpdb->get_var( "SELECT domain FROM {$wpdb->dmtable} WHERE blog_id = '{$blog_id}' AND domain = '" . $wpdb->escape( $_SERVER[ 'HTTP_HOST' ] ) . "' LIMIT 1" );
+ } else {
+ $domain = $wpdb->get_var( "SELECT domain FROM {$wpdb->dmtable} WHERE blog_id = '{$blog_id}' LIMIT 1" );
+ }
+
if ( null == $domain ) {
- $return_url[ $wpdb->blogid ] = untrailingslashit( get_original_url( "siteurl" ) );
- return $return_url[ $wpdb->blogid ];
+ $return_url[ $blog_id ] = untrailingslashit( get_original_url( "siteurl", $blog_id ) );
+ return $return_url[ $blog_id ];
}
} else {
// get primary domain, if we don't have one then return original url.
- $domain = $wpdb->get_var( "SELECT domain FROM {$wpdb->dmtable} WHERE blog_id = '{$wpdb->blogid}' AND active = 1 LIMIT 1" );
+ $domain = $wpdb->get_var( "SELECT domain FROM {$wpdb->dmtable} WHERE blog_id = '{$blog_id}' AND active = 1 LIMIT 1" );
if ( null == $domain ) {
- $return_url[ $wpdb->blogid ] = untrailingslashit( get_original_url( "siteurl" ) );
- return $return_url[ $wpdb->blogid ];
+ $return_url[ $blog_id ] = untrailingslashit( get_original_url( "siteurl", $blog_id ) );
+ return $return_url[ $blog_id ];
}
}
@@ -546,11 +556,11 @@
$protocol = ( 'on' == strtolower( $_SERVER[ 'HTTPS' ] ) ) ? 'https://' : 'http://';
if ( $domain ) {
- $return_url[ $wpdb->blogid ] = untrailingslashit( $protocol . $domain );
- $setting = $return_url[ $wpdb->blogid ];
- } else {
- $return_url[ $wpdb->blogid ] = false;
- }
- } elseif ( $return_url[ $wpdb->blogid ] !== FALSE) {
- $setting = $return_url[ $wpdb->blogid ];
+ $return_url[ $blog_id ] = untrailingslashit( $protocol . $domain );
+ $setting = $return_url[ $blog_id ];
+ } else {
+ $return_url[ $blog_id ] = false;
+ }
+ } elseif ( $return_url[ $blog_id ] !== FALSE) {
+ $setting = $return_url[ $blog_id ];
}
Here's the filter I'm using to apply this function to all siteurl() and home() calls:
function do_canonical_siteurl( $value, $blog_id ) {
// gotta do the remove/add dance to avoid recursion
remove_filter( 'blog_option_siteurl', __FUNCTION__, 10, 2 );
$url = domain_mapping_siteurl( 'siteurl', $blog_id );
add_filter( 'blog_option_siteurl', __FUNCTION__, 10, 2 );
return $url;
}
add_filter('blog_option_siteurl', 'do_canonical_siteurl', 10, 2);
add_filter('blog_option_home', 'do_canonical_siteurl', 10, 2);
Fixup MUPLUGINDIR Paths
Plugin filters helpfully update the PLUGINDIR fragment in URLs, but does not know about MUPLUGINDIR. This patch makes the filter a bit more robust.
Index: domain_mapping.php
===================================================================
--- domain_mapping.php (revision 9553)
+++ domain_mapping.php (revision 9554)
@@ -660,5 +660,9 @@
// fixes the plugins_url
function domain_mapping_plugins_uri( $full_url, $path=NULL, $plugin=NULL ) {
- return get_option( 'siteurl' ) . substr( $full_url, stripos( $full_url, PLUGINDIR ) - 1 );
+ if( false === ( $pos = stripos( $full_url, PLUGINDIR ) ) ) {
+ $pos = stripos( $full_url, MUPLUGINDIR );
+ }
+
+ return get_option( 'siteurl' ) . substr( $full_url, $pos - 1 );
}
@@ -668,5 +672,5 @@
if ( defined( 'DOMAIN_MAPPING' ) ) {
- add_filter( 'plugins_url', 'domain_mapping_plugins_uri', 1 );
+ add_filter( 'plugins_url', 'domain_mapping_plugins_uri', 1, 3 );
add_filter( 'theme_root_uri', 'domain_mapping_themes_uri', 1 );
add_filter( 'pre_option_siteurl', 'domain_mapping_siteurl' );