-
-
Save r-a-y/92312061b5d7044b05a9f48577f5af71 to your computer and use it in GitHub Desktop.
WPMU Domain Mapping - Add object caching
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Index: domain_mapping.php | |
=================================================================== | |
--- domain_mapping.php | |
+++ domain_mapping.php | |
@@ -30,6 +30,14 @@ | |
} | |
add_action( 'init', 'dm_text_domain' ); | |
+/** | |
+ * Registers our cache group globally with WordPress. | |
+ */ | |
+function dm_cache_add_global_group() { | |
+ wp_cache_add_global_groups( 'wpmu-dm' ); | |
+} | |
+add_action( 'plugins_loaded', 'dm_cache_add_global_group' ); | |
+ | |
function domain_mapping_warning() { | |
echo "<div id='domain-mapping-warning' class='updated fade'><p><strong>".__( 'Domain Mapping Disabled.', 'wordpress-mu-domain-mapping' )."</strong> ".sprintf(__('You must <a href="%1$s">create a network</a> for it to work.', 'wordpress-mu-domain-mapping' ), "http://codex.wordpress.org/Create_A_Network")."</p></div>"; | |
} | |
@@ -155,9 +163,13 @@ | |
$wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->dmtable} SET blog_id = %d, domain = %s, active = %d WHERE domain = %s", $_POST[ 'blog_id' ], $domain, $_POST[ 'active' ], $_POST[ 'orig_domain' ] ) ); | |
echo "<p><strong>" . __( 'Domain Updated', 'wordpress-mu-domain-mapping' ) . "</strong></p>"; | |
} | |
+ | |
+ wp_cache_delete( (int) $_POST['blog_id'], 'wpmu-dm' ); | |
} | |
break; | |
case "del": | |
+ do_action( 'dm_handle_actions_del', $domain ); | |
+ | |
$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->dmtable} WHERE domain = %s", $domain ) ); | |
echo "<p><strong>" . __( 'Domain Deleted', 'wordpress-mu-domain-mapping' ) . "</strong></p>"; | |
break; | |
@@ -504,45 +516,96 @@ | |
echo "</div>"; | |
} | |
+/** | |
+ * Fetch the site URL for the current site. | |
+ * | |
+ * If the current site is a mapped domain, it will return the mapped site URL. | |
+ * If the current site is not mapped, it will return the subdomain site URL. | |
+ * | |
+ * @param mixed $setting Does nothing? | |
+ */ | |
function domain_mapping_siteurl( $setting ) { | |
- global $wpdb, $current_blog; | |
- | |
- // To reduce the number of database queries, save the results the first time we encounter each blog ID. | |
- static $return_url = array(); | |
+ global $wpdb; | |
$wpdb->dmtable = $wpdb->base_prefix . 'domain_mapping'; | |
- if ( !isset( $return_url[ $wpdb->blogid ] ) ) { | |
- $s = $wpdb->suppress_errors(); | |
+ // Fetch cached domain mapping data for the blog ID. | |
+ $dm = domain_mapping_get_data_by_id(); | |
- 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 ( null == $domain ) { | |
- $return_url[ $wpdb->blogid ] = untrailingslashit( get_original_url( "siteurl" ) ); | |
- return $return_url[ $wpdb->blogid ]; | |
+ // Disable primary domain option is set. | |
+ 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" ); | |
+ | |
+ $key = null; | |
+ if ( ! empty( $dm ) ) { | |
+ foreach ( $dm as $k => $d ) { | |
+ if ( $wpdb->escape( $_SERVER[ 'HTTP_HOST' ] ) === $d->domain ) { | |
+ $key = $k; | |
+ } | |
} | |
+ } | |
+ | |
+ if ( null === $key ) { | |
+ return untrailingslashit( get_original_url( 'siteurl' ) ); | |
} 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" ); | |
- if ( null == $domain ) { | |
- $return_url[ $wpdb->blogid ] = untrailingslashit( get_original_url( "siteurl" ) ); | |
- return $return_url[ $wpdb->blogid ]; | |
+ $domain = $dm[$key]->domain; | |
+ } | |
+ | |
+ } 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" ); | |
+ | |
+ $key = null; | |
+ if ( ! empty( $dm ) ) { | |
+ foreach( $dm as $k => $d ) { | |
+ if ( $d->active ) { | |
+ $key = $k; | |
+ } | |
} | |
} | |
- $wpdb->suppress_errors( $s ); | |
- $protocol = is_ssl() ? 'https://' : 'http://'; | |
- if ( $domain ) { | |
- $return_url[ $wpdb->blogid ] = untrailingslashit( $protocol . $domain ); | |
- $setting = $return_url[ $wpdb->blogid ]; | |
+ if ( null === $key ) { | |
+ return untrailingslashit( get_original_url( 'siteurl' ) ); | |
} else { | |
- $return_url[ $wpdb->blogid ] = false; | |
+ $domain = $dm[$key]->domain; | |
} | |
- } elseif ( $return_url[ $wpdb->blogid ] !== FALSE) { | |
- $setting = $return_url[ $wpdb->blogid ]; | |
} | |
- return $setting; | |
+ $protocol = is_ssl() ? 'https://' : 'http://'; | |
+ | |
+ return untrailingslashit( $protocol . $domain ); | |
+} | |
+ | |
+/** | |
+ * Fetch domain mapping data by blog ID. | |
+ * | |
+ * @param int $blog_id Blog ID to fetch domain mapping data for. | |
+ * @return object|null Object on success, null on failure. | |
+ */ | |
+function domain_mapping_get_data_by_id( $blog_id = 0 ) { | |
+ global $wpdb; | |
+ | |
+ if ( empty( $blog_id ) ) { | |
+ $blog_id = $wpdb->blogid; | |
+ } | |
+ $blog_id = (int) $blog_id; | |
+ | |
+ // Fetch cached domain mapping data for the site ID. | |
+ $dm = wp_cache_get( $blog_id, 'wpmu-dm' ); | |
+ | |
+ // Not in cache, so query for the data. | |
+ if ( false === $dm ) { | |
+ $s = $wpdb->suppress_errors(); | |
+ $dm = $wpdb->get_results( "SELECT * FROM {$wpdb->dmtable} WHERE blog_id = '{$blog_id}'" ); | |
+ $wpdb->suppress_errors( $s ); | |
+ | |
+ $dm = ! empty( $dm ) ? $dm : null; | |
+ | |
+ // Cache it. | |
+ wp_cache_set( $blog_id, $dm, 'wpmu-dm' ); | |
+ } | |
+ | |
+ return $dm; | |
} | |
// url is siteurl or home | |
@@ -671,6 +734,20 @@ | |
if ( isset( $_GET[ 'dm' ] ) ) | |
add_action( 'template_redirect', 'remote_login_js' ); | |
+/** | |
+ * Clear cache when domain mapping is changed. | |
+ */ | |
+add_action( 'dm_handle_actions_init', function( $domain ) { | |
+ $blog_id = (int) $_POST['blog_id']; | |
+ wp_cache_delete( $blog_id, 'wpmu-dm' ); | |
+} ); | |
+add_action( 'dm_handle_actions_del', function( $domain ) { | |
+ global $wpdb; | |
+ | |
+ $blog_id = (int) $wpdb->get_var( "SELECT blog_id FROM {$wpdb->dmtable} WHERE domain = '{$domain}'" ); | |
+ wp_cache_delete( $blog_id, 'wpmu-dm' ); | |
+} ); | |
+ | |
function remote_logout_loader() { | |
global $current_site, $current_blog, $wpdb; | |
$wpdb->dmtablelogins = $wpdb->base_prefix . 'domain_mapping_logins'; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment