Skip to content

Instantly share code, notes, and snippets.

@r-a-y
Last active May 24, 2018 20:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save r-a-y/92312061b5d7044b05a9f48577f5af71 to your computer and use it in GitHub Desktop.
Save r-a-y/92312061b5d7044b05a9f48577f5af71 to your computer and use it in GitHub Desktop.
WPMU Domain Mapping - Add object caching
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