".__( 'Domain Mapping Disabled.', 'wordpress-mu-domain-mapping' )." ".sprintf(__('You must create a network for it to work.', 'wordpress-mu-domain-mapping' ), "http://codex.wordpress.org/Create_A_Network")."

"; } function dm_add_pages() { global $current_site, $wpdb, $wp_db_version, $wp_version; if ( !isset( $current_site ) && $wp_db_version >= 15260 ) { // WP 3.0 network hasn't been configured add_action('admin_notices', 'domain_mapping_warning'); return false; } if ( $current_site->path != "/" ) { wp_die( __( "The domain mapping plugin only works if the site is installed in /. This is a limitation of how virtual servers work and is very difficult to work around.", 'wordpress-mu-domain-mapping' ) ); } if ( get_site_option( 'dm_user_settings' ) && $current_site->blog_id != $wpdb->blogid && !dm_sunrise_warning( false ) ) { add_management_page(__( 'Domain Mapping', 'wordpress-mu-domain-mapping'), __( 'Domain Mapping', 'wordpress-mu-domain-mapping'), 'manage_options', 'domainmapping', 'dm_manage_page' ); } } add_action( 'admin_menu', 'dm_add_pages' ); function dm_network_pages() { add_submenu_page('settings.php', 'Domain Mapping', 'Domain Mapping', 'manage_options', 'dm_admin_page', 'dm_admin_page'); add_submenu_page('settings.php', 'Domains', 'Domains', 'manage_options', 'dm_domains_admin', 'dm_domains_admin'); } add_action( 'network_admin_menu', 'dm_network_pages' ); // Default Messages for the users Domain Mapping management page // This can now be replaced by using: // remove_action('dm_echo_updated_msg','dm_echo_default_updated_msg'); // add_action('dm_echo_updated_msg','my_custom_updated_msg_function'); function dm_echo_default_updated_msg() { switch( $_GET[ 'updated' ] ) { case "add": $msg = __( 'New domain added.', 'wordpress-mu-domain-mapping' ); break; case "exists": $msg = __( 'New domain already exists.', 'wordpress-mu-domain-mapping' ); break; case "primary": $msg = __( 'New primary domain.', 'wordpress-mu-domain-mapping' ); break; case "del": $msg = __( 'Domain deleted.', 'wordpress-mu-domain-mapping' ); break; } echo "

$msg

"; } add_action('dm_echo_updated_msg','dm_echo_default_updated_msg'); function maybe_create_db() { global $wpdb; get_dm_hash(); // initialise the remote login hash $wpdb->dmtable = $wpdb->base_prefix . 'domain_mapping'; $wpdb->dmtablelogins = $wpdb->base_prefix . 'domain_mapping_logins'; if ( dm_site_admin() ) { $created = 0; if ( $wpdb->get_var("SHOW TABLES LIKE '{$wpdb->dmtable}'") != $wpdb->dmtable ) { $wpdb->query( "CREATE TABLE IF NOT EXISTS `{$wpdb->dmtable}` ( `id` bigint(20) NOT NULL auto_increment, `blog_id` bigint(20) NOT NULL, `domain` varchar(255) NOT NULL, `active` tinyint(4) default '1', PRIMARY KEY (`id`), KEY `blog_id` (`blog_id`,`domain`,`active`) );" ); $created = 1; } if ( $wpdb->get_var("SHOW TABLES LIKE '{$wpdb->dmtablelogins}'") != $wpdb->dmtablelogins ) { $wpdb->query( "CREATE TABLE IF NOT EXISTS `{$wpdb->dmtablelogins}` ( `id` varchar(32) NOT NULL, `user_id` bigint(20) NOT NULL, `blog_id` bigint(20) NOT NULL, `t` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, PRIMARY KEY (`id`) );" ); $created = 1; } if ( $created ) { ?>

path != "/" ) { wp_die( sprintf( __( "Warning! This plugin will only work if WordPress is installed in the root directory of your webserver. It is currently installed in ’%s’.", "wordpress-mu-domain-mapping" ), $current_site->path ) ); } echo '

' . __( 'Domain Mapping: Domains', 'wordpress-mu-domain-mapping' ) . '

'; if ( !empty( $_POST[ 'action' ] ) ) { check_admin_referer( 'domain_mapping' ); $domain = strtolower( $_POST[ 'domain' ] ); switch( $_POST[ 'action' ] ) { case "edit": $row = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->dmtable} WHERE domain = %s", $domain ) ); if ( $row ) { dm_edit_domain( $row ); } else { echo "

" . __( 'Domain not found', 'wordpress-mu-domain-mapping' ) . "

"; } break; case "save": if ( $_POST[ 'blog_id' ] != 0 AND $_POST[ 'blog_id' ] != 1 AND null == $wpdb->get_var( $wpdb->prepare( "SELECT domain FROM {$wpdb->dmtable} WHERE blog_id != %d AND domain = %s", $_POST[ 'blog_id' ], $domain ) ) ) { if ( $_POST[ 'orig_domain' ] == '' ) { $wpdb->query( $wpdb->prepare( "INSERT INTO {$wpdb->dmtable} ( `blog_id`, `domain`, `active` ) VALUES ( %d, %s, %d )", $_POST[ 'blog_id' ], $domain, $_POST[ 'active' ] ) ); echo "

" . __( 'Domain Add', 'wordpress-mu-domain-mapping' ) . "

"; } else { $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 "

" . __( 'Domain Updated', 'wordpress-mu-domain-mapping' ) . "

"; } } break; case "del": $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->dmtable} WHERE domain = %s", $domain ) ); echo "

" . __( 'Domain Deleted', 'wordpress-mu-domain-mapping' ) . "

"; break; case "search": $rows = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->dmtable} WHERE domain LIKE %s", $domain ) ); dm_domain_listing( $rows, sprintf( __( "Searching for %s", 'wordpress-mu-domain-mapping' ), esc_html( $domain ) ) ); break; } if ( $_POST[ 'action' ] == 'update' ) { if ( preg_match( '|^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$|', $_POST[ 'ipaddress' ] ) ) update_site_option( 'dm_ipaddress', $_POST[ 'ipaddress' ] ); if ( ! preg_match( '/(--|\.\.)/', $_POST[ 'cname' ] ) && preg_match( '|^([a-zA-Z0-9-\.])+$|', $_POST[ 'cname' ] ) ) update_site_option( 'dm_cname', stripslashes( $_POST[ 'cname' ] ) ); else update_site_option( 'dm_cname', '' ); update_site_option( 'dm_301_redirect', intval( $_POST[ 'permanent_redirect' ] ) ); } } echo "

" . __( 'Search Domains', 'wordpress-mu-domain-mapping' ) . "

"; echo '
'; wp_nonce_field( 'domain_mapping' ); echo ''; echo '

'; echo _e( "Domain:", 'wordpress-mu-domain-mapping' ); echo "

"; echo "

"; echo "

"; dm_edit_domain(); $rows = $wpdb->get_results( "SELECT * FROM {$wpdb->dmtable} ORDER BY id DESC LIMIT 0,20" ); dm_domain_listing( $rows ); echo '

' . sprintf( __( 'Note: %s', 'wordpress-mu-domain-mapping' ), dm_idn_warning() ) . "

"; } function dm_edit_domain( $row = false ) { if ( is_object( $row ) ) { echo "

" . __( 'Edit Domain', 'wordpress-mu-domain-mapping' ) . "

"; } else { echo "

" . __( 'New Domain', 'wordpress-mu-domain-mapping' ) . "

"; $row = new stdClass(); $row->blog_id = ''; $row->domain = ''; $_POST[ 'domain' ] = ''; $row->active = 1; } echo "
"; wp_nonce_field( 'domain_mapping' ); echo "\n"; echo "\n"; echo "\n"; echo "\n"; if ( get_site_option( 'dm_no_primary_domain' ) == 1 ) { echo ""; } echo "
" . __( 'Site ID', 'wordpress-mu-domain-mapping' ) . "
" . __( 'Domain', 'wordpress-mu-domain-mapping' ) . "
" . __( 'Primary', 'wordpress-mu-domain-mapping' ) . "active == 1 ? 'checked=1 ' : ' '; echo "/>
" . __( 'Warning! Primary domains are currently disabled.', 'wordpress-mu-domain-mapping' ) . "
"; echo "



"; } function dm_domain_listing( $rows, $heading = '' ) { if ( $rows ) { if ( file_exists( ABSPATH . 'wp-admin/network/site-info.php' ) ) { $edit_url = network_admin_url( 'site-info.php' ); } elseif ( file_exists( ABSPATH . 'wp-admin/ms-sites.php' ) ) { $edit_url = admin_url( 'ms-sites.php' ); } else { $edit_url = admin_url( 'wpmu-blogs.php' ); } if ( $heading != '' ) echo "

$heading

"; echo ''; foreach( $rows as $row ) { echo ""; } echo '
'.__( 'Site ID', 'wordpress-mu-domain-mapping' ).''.__( 'Domain', 'wordpress-mu-domain-mapping' ).''.__( 'Primary', 'wordpress-mu-domain-mapping' ).''.__( 'Edit', 'wordpress-mu-domain-mapping' ).''.__( 'Delete', 'wordpress-mu-domain-mapping' ).'
'editblog', 'id' => $row->blog_id ), $edit_url ) . "'>{$row->blog_id}{$row->domain}"; echo $row->active == 1 ? __( 'Yes', 'wordpress-mu-domain-mapping' ) : __( 'No', 'wordpress-mu-domain-mapping' ); echo "
"; wp_nonce_field( 'domain_mapping' ); echo "
"; wp_nonce_field( 'domain_mapping' ); echo "
"; echo "
'; if ( get_site_option( 'dm_no_primary_domain' ) == 1 ) { echo "

" . __( 'Warning! Primary domains are currently disabled.', 'wordpress-mu-domain-mapping' ) . "

"; } } } function dm_admin_page() { global $wpdb, $current_site; if ( false == dm_site_admin() ) { // paranoid? moi? return false; } dm_sunrise_warning(); maybe_create_db(); if ( $current_site->path != "/" ) { wp_die( sprintf( __( "Warning! This plugin will only work if WordPress is installed in the root directory of your webserver. It is currently installed in ’%s’.", "wordpress-mu-domain-mapping" ), $current_site->path ) ); } // set up some defaults if ( get_site_option( 'dm_remote_login', 'NA' ) == 'NA' ) add_site_option( 'dm_remote_login', 1 ); if ( get_site_option( 'dm_redirect_admin', 'NA' ) == 'NA' ) add_site_option( 'dm_redirect_admin', 1 ); if ( get_site_option( 'dm_user_settings', 'NA' ) == 'NA' ) add_site_option( 'dm_user_settings', 1 ); if ( !empty( $_POST[ 'action' ] ) ) { check_admin_referer( 'domain_mapping' ); if ( $_POST[ 'action' ] == 'update' ) { $ipok = true; $ipaddresses = explode( ',', $_POST[ 'ipaddress' ] ); foreach( $ipaddresses as $address ) { if ( ( $ip = trim( $address ) ) && !preg_match( '|^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$|', $ip ) ) { $ipok = false; break; } } if( $ipok ) update_site_option( 'dm_ipaddress', $_POST[ 'ipaddress' ] ); if ( intval( $_POST[ 'always_redirect_admin' ] ) == 0 ) $_POST[ 'dm_remote_login' ] = 0; // disable remote login if redirecting to mapped domain update_site_option( 'dm_remote_login', intval( $_POST[ 'dm_remote_login' ] ) ); if ( ! preg_match( '/(--|\.\.)/', $_POST[ 'cname' ] ) && preg_match( '|^([a-zA-Z0-9-\.])+$|', $_POST[ 'cname' ] ) ) update_site_option( 'dm_cname', stripslashes( $_POST[ 'cname' ] ) ); else update_site_option( 'dm_cname', '' ); update_site_option( 'dm_301_redirect', isset( $_POST[ 'permanent_redirect' ] ) ? intval( $_POST[ 'permanent_redirect' ] ) : 0 ); update_site_option( 'dm_redirect_admin', isset( $_POST[ 'always_redirect_admin' ] ) ? intval( $_POST[ 'always_redirect_admin' ] ) : 0 ); update_site_option( 'dm_user_settings', isset( $_POST[ 'dm_user_settings' ] ) ? intval( $_POST[ 'dm_user_settings' ] ) : 0 ); update_site_option( 'dm_no_primary_domain', isset( $_POST[ 'dm_no_primary_domain' ] ) ? intval( $_POST[ 'dm_no_primary_domain' ] ) : 0 ); } } echo '

' . __( 'Domain Mapping Configuration', 'wordpress-mu-domain-mapping' ) . '

'; echo '
'; echo ''; echo "

" . __( "As a super admin on this network you can set the IP address users need to point their DNS A records at or the domain to point CNAME record at. If you don't know what the IP address is, ping this blog to get it.", 'wordpress-mu-domain-mapping' ) . "

"; echo "

" . __( "If you use round robin DNS or another load balancing technique with more than one IP, enter each address, separating them by commas.", 'wordpress-mu-domain-mapping' ) . "

"; _e( "Server IP Address: ", 'wordpress-mu-domain-mapping' ); echo "
"; // Using a CNAME is a safer method than using IP adresses for some people (IMHO) echo "

" . __( "If you prefer the use of a CNAME record, you can set the domain here. This domain must be configured with an A record or ANAME pointing at an IP address. Visitors may experience problems if it is a CNAME of another domain.", 'wordpress-mu-domain-mapping' ) . "

"; echo "

" . __( "NOTE, this voids the use of any IP address set above", 'wordpress-mu-domain-mapping' ) . "

"; _e( "Server CNAME domain: ", 'wordpress-mu-domain-mapping' ); echo " (" . dm_idn_warning() . ")
"; echo '

' . __( 'The information you enter here will be shown to your users so they can configure their DNS correctly. It is for informational purposes only', 'wordpress-mu-domain-mapping' ) . '

'; echo "

" . __( 'Domain Options', 'wordpress-mu-domain-mapping' ) . "

"; echo "
  1. " . __( 'Remote Login', 'wordpress-mu-domain-mapping' ) . "
  2. "; echo "
  3. " . __( "Permanent redirect (better for your blogger's pagerank)", 'wordpress-mu-domain-mapping' ) . "
  4. "; echo "
  5. " . __( 'User domain mapping page', 'wordpress-mu-domain-mapping' ) . "
  6. "; echo "
  7. " . __( "Redirect administration pages to site's original domain (remote login disabled if this redirect is disabled)", 'wordpress-mu-domain-mapping' ) . "
  8. "; echo "
  9. " . __( "Disable primary domain check. Sites will not redirect to one domain name. May cause duplicate content issues.", 'wordpress-mu-domain-mapping' ) . "
"; wp_nonce_field( 'domain_mapping' ); echo "

"; echo "

"; } function dm_handle_actions() { global $wpdb, $parent_file; $url = add_query_arg( array( 'page' => 'domainmapping' ), admin_url( $parent_file ) ); if ( !empty( $_POST[ 'action' ] ) ) { $domain = $wpdb->escape( $_POST[ 'domain' ] ); if ( $domain == '' ) { wp_die( "You must enter a domain" ); } check_admin_referer( 'domain_mapping' ); do_action('dm_handle_actions_init', $domain); switch( $_POST[ 'action' ] ) { case "add": do_action('dm_handle_actions_add', $domain); if( null == $wpdb->get_row( "SELECT blog_id FROM {$wpdb->blogs} WHERE domain = '$domain'" ) && null == $wpdb->get_row( "SELECT blog_id FROM {$wpdb->dmtable} WHERE domain = '$domain'" ) ) { if ( $_POST[ 'primary' ] ) { $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->dmtable} SET active = 0 WHERE blog_id = %d", $wpdb->blogid ) ); } $wpdb->query( $wpdb->prepare( "INSERT INTO {$wpdb->dmtable} ( `id` , `blog_id` , `domain` , `active` ) VALUES ( NULL, %d, %s, %d )", $wpdb->blogid, $domain, $_POST[ 'primary' ] ) ); wp_redirect( add_query_arg( array( 'updated' => 'add' ), $url ) ); exit; } else { wp_redirect( add_query_arg( array( 'updated' => 'exists' ), $url ) ); exit; } break; case "primary": do_action('dm_handle_actions_primary', $domain); $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->dmtable} SET active = 0 WHERE blog_id = %d", $wpdb->blogid ) ); $orig_url = parse_url( get_original_url( 'siteurl' ) ); if( $domain != $orig_url[ 'host' ] ) { $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->dmtable} SET active = 1 WHERE domain = %s", $domain ) ); } wp_redirect( add_query_arg( array( 'updated' => 'primary' ), $url ) ); exit; break; } } elseif( $_GET[ 'action' ] == 'delete' ) { $domain = $wpdb->escape( $_GET[ 'domain' ] ); if ( $domain == '' ) { wp_die( __( "You must enter a domain", 'wordpress-mu-domain-mapping' ) ); } check_admin_referer( "delete" . $_GET['domain'] ); do_action('dm_handle_actions_del', $domain); $wpdb->query( "DELETE FROM {$wpdb->dmtable} WHERE domain = '$domain'" ); wp_redirect( add_query_arg( array( 'updated' => 'del' ), $url ) ); exit; } } if ( isset( $_GET[ 'page' ] ) && $_GET[ 'page' ] == 'domainmapping' ) add_action( 'admin_init', 'dm_handle_actions' ); function dm_sunrise_warning( $die = true ) { if ( !file_exists( WP_CONTENT_DIR . '/sunrise.php' ) ) { if ( !$die ) return true; if ( dm_site_admin() ) { wp_die( sprintf( __( "Please copy sunrise.php to %s/sunrise.php and ensure the SUNRISE definition is in %swp-config.php", 'wordpress-mu-domain-mapping' ), WP_CONTENT_DIR, ABSPATH ) ); } else { wp_die( __( "This plugin has not been configured correctly yet.", 'wordpress-mu-domain-mapping' ) ); } } elseif ( !defined( 'SUNRISE' ) ) { if ( !$die ) return true; if ( dm_site_admin() ) { wp_die( sprintf( __( "Please uncomment the line define( 'SUNRISE', 'on' ); or add it to your %swp-config.php", 'wordpress-mu-domain-mapping' ), ABSPATH ) ); } else { wp_die( __( "This plugin has not been configured correctly yet.", 'wordpress-mu-domain-mapping' ) ); } } elseif ( !defined( 'SUNRISE_LOADED' ) ) { if ( !$die ) return true; if ( dm_site_admin() ) { wp_die( sprintf( __( "Please edit your %swp-config.php and move the line define( 'SUNRISE', 'on' ); above the last require_once() in that file or make sure you updated sunrise.php.", 'wordpress-mu-domain-mapping' ), ABSPATH ) ); } else { wp_die( __( "This plugin has not been configured correctly yet.", 'wordpress-mu-domain-mapping' ) ); } } return false; } function dm_manage_page() { global $wpdb, $parent_file; if ( isset( $_GET[ 'updated' ] ) ) { do_action('dm_echo_updated_msg'); } dm_sunrise_warning(); echo "

" . __( 'Domain Mapping', 'wordpress-mu-domain-mapping' ) . "

"; if ( false == get_site_option( 'dm_ipaddress' ) && false == get_site_option( 'dm_cname' ) ) { if ( dm_site_admin() ) { _e( "Please set the IP address or CNAME of your server in the site admin page.", 'wordpress-mu-domain-mapping' ); } else { _e( "This plugin has not been configured correctly yet.", 'wordpress-mu-domain-mapping' ); } echo "
"; return false; } $protocol = is_ssl() ? 'https://' : 'http://'; $domains = $wpdb->get_results( "SELECT * FROM {$wpdb->dmtable} WHERE blog_id = '{$wpdb->blogid}'", ARRAY_A ); if ( is_array( $domains ) && !empty( $domains ) ) { $orig_url = parse_url( get_original_url( 'siteurl' ) ); $domains[] = array( 'domain' => $orig_url[ 'host' ], 'path' => $orig_url[ 'path' ], 'active' => 0 ); echo "

" . __( 'Active domains on this blog', 'wordpress-mu-domain-mapping' ) . "

"; echo '
'; echo "\n"; $primary_found = 0; $del_url = add_query_arg( array( 'page' => 'domainmapping', 'action' => 'delete' ), admin_url( $parent_file ) ); foreach( $domains as $details ) { if ( 0 == $primary_found && $details[ 'domain' ] == $orig_url[ 'host' ] ) { $details[ 'active' ] = 1; } echo ""; if ( 0 == $primary_found ) $primary_found = $details[ 'active' ]; } ?>
" . __( 'Primary', 'wordpress-mu-domain-mapping' ) . "" . __( 'Domain', 'wordpress-mu-domain-mapping' ) . "" . __( 'Delete', 'wordpress-mu-domain-mapping' ) . "
"; echo ""; $url = "{$protocol}{$details[ 'domain' ]}{$details[ 'path' ]}"; echo "$url"; if ( $details[ 'domain' ] != $orig_url[ 'host' ] && $details[ 'active' ] != 1 ) { echo " $details[ 'domain' ] ), $del_url ), "delete" . $details[ 'domain' ] ) . "'>Del"; } echo "
'; echo "

"; wp_nonce_field( 'domain_mapping' ); echo "
"; echo "

" . __( "* The primary domain cannot be deleted.", 'wordpress-mu-domain-mapping' ) . "

"; if ( get_site_option( 'dm_no_primary_domain' ) == 1 ) { echo __( 'Warning! Primary domains are currently disabled.', 'wordpress-mu-domain-mapping' ); } } echo "

" . __( 'Add new domain', 'wordpress-mu-domain-mapping' ) . "

"; echo '
'; echo ''; echo "

http:///
"; wp_nonce_field( 'domain_mapping' ); echo " " . __( 'Primary domain for this blog', 'wordpress-mu-domain-mapping' ) . "

"; echo "

"; echo "

"; if ( get_site_option( 'dm_cname' ) ) { $dm_cname = get_site_option( 'dm_cname'); echo "

" . sprintf( __( 'If you want to redirect a domain you will need to add a DNS "CNAME" record pointing to the following domain name for this server: %s', 'wordpress-mu-domain-mapping' ), $dm_cname ) . "

"; echo "

" . __( 'Google have published instructions for creating CNAME records on various hosting platforms such as GoDaddy and others.', 'wordpress-mu-domain-mapping' ) . "

"; } else { echo "

" . __( 'If your domain name includes a hostname like "www", "blog" or some other prefix before the actual domain name you will need to add a CNAME for that hostname in your DNS pointing at this blog URL.', 'wordpress-mu-domain-mapping' ) . "

"; $dm_ipaddress = get_site_option( 'dm_ipaddress', 'IP not set by admin yet.' ); if ( strpos( $dm_ipaddress, ',' ) ) { echo "

" . sprintf( __( 'If you want to redirect a domain you will need to add DNS "A" records pointing at the IP addresses of this server: %s', 'wordpress-mu-domain-mapping' ), $dm_ipaddress ) . "

"; } else { echo "

" . sprintf( __( 'If you want to redirect a domain you will need to add a DNS "A" record pointing at the IP address of this server: %s', 'wordpress-mu-domain-mapping' ), $dm_ipaddress ) . "

"; } } echo '

' . sprintf( __( 'Note: %s', 'wordpress-mu-domain-mapping' ), dm_idn_warning() ) . "

"; echo ""; } 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(); $wpdb->dmtable = $wpdb->base_prefix . 'domain_mapping'; if ( !isset( $return_url[ $wpdb->blogid ] ) ) { $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 ( null == $domain ) { $return_url[ $wpdb->blogid ] = untrailingslashit( get_original_url( "siteurl" ) ); return $return_url[ $wpdb->blogid ]; } } 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 ]; } } $wpdb->suppress_errors( $s ); $protocol = is_ssl() ? '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 $setting; } // url is siteurl or home function get_original_url( $url, $blog_id = 0 ) { global $wpdb; if ( $blog_id != 0 ) { $id = $blog_id; } else { $id = $wpdb->blogid; } static $orig_urls = array(); if ( ! isset( $orig_urls[ $id ] ) ) { if ( defined( 'DOMAIN_MAPPING' ) ) remove_filter( 'pre_option_' . $url, 'domain_mapping_' . $url ); if ( $blog_id == 0 ) { $orig_url = get_option( $url ); } else { $orig_url = get_blog_option( $blog_id, $url ); } if ( is_ssl() ) { $orig_url = str_replace( "http://", "https://", $orig_url ); } else { $orig_url = str_replace( "https://", "http://", $orig_url ); } if ( $blog_id == 0 ) { $orig_urls[ $wpdb->blogid ] = $orig_url; } else { $orig_urls[ $blog_id ] = $orig_url; } if ( defined( 'DOMAIN_MAPPING' ) ) add_filter( 'pre_option_' . $url, 'domain_mapping_' . $url ); } return $orig_urls[ $id ]; } function domain_mapping_adminurl( $url, $path, $blog_id = 0 ) { $index = strpos( $url, '/wp-admin' ); if( $index !== false ) { $url = get_original_url( 'siteurl', $blog_id ) . substr( $url, $index ); // make sure admin_url is ssl if current page is ssl, or admin ssl is forced if( ( is_ssl() || force_ssl_admin() ) && 0 === strpos( $url, 'http://' ) ) { $url = 'https://' . substr( $url, 7 ); } } return $url; } function domain_mapping_post_content( $post_content ) { global $wpdb; $orig_url = get_original_url( 'siteurl' ); $url = domain_mapping_siteurl( 'NA' ); if ( $url == 'NA' ) return $post_content; return str_replace( $orig_url, $url, $post_content ); } function dm_redirect_admin() { // don't redirect admin ajax calls if ( strpos( $_SERVER['REQUEST_URI'], 'wp-admin/admin-ajax.php' ) !== false ) return; if ( get_site_option( 'dm_redirect_admin' ) ) { // redirect mapped domain admin page to original url $url = get_original_url( 'siteurl' ); if ( false === strpos( $url, $_SERVER[ 'HTTP_HOST' ] ) ) { wp_redirect( untrailingslashit( $url ) . $_SERVER[ 'REQUEST_URI' ] ); exit; } } else { global $current_blog; // redirect original url to primary domain wp-admin/ - remote login is disabled! $url = domain_mapping_siteurl( false ); $request_uri = str_replace( $current_blog->path, '/', $_SERVER[ 'REQUEST_URI' ] ); if ( false === strpos( $url, $_SERVER[ 'HTTP_HOST' ] ) ) { wp_redirect( str_replace( '//wp-admin', '/wp-admin', trailingslashit( $url ) . $request_uri ) ); exit; } } } function redirect_login_to_orig() { if ( !get_site_option( 'dm_remote_login' ) || $_GET[ 'action' ] == 'logout' || isset( $_GET[ 'loggedout' ] ) ) { return false; } $url = get_original_url( 'siteurl' ); if ( $url != site_url() ) { $url .= "/wp-login.php"; echo ""; } } // 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 ); } function domain_mapping_themes_uri( $full_url ) { return str_replace( get_original_url ( 'siteurl' ), get_option( 'siteurl' ), $full_url ); } if ( defined( 'DOMAIN_MAPPING' ) ) { add_filter( 'plugins_url', 'domain_mapping_plugins_uri', 1 ); add_filter( 'theme_root_uri', 'domain_mapping_themes_uri', 1 ); add_filter( 'pre_option_siteurl', 'domain_mapping_siteurl' ); add_filter( 'pre_option_home', 'domain_mapping_siteurl' ); add_filter( 'the_content', 'domain_mapping_post_content' ); add_action( 'wp_head', 'remote_login_js_loader' ); add_action( 'login_head', 'redirect_login_to_orig' ); add_action( 'wp_logout', 'remote_logout_loader', 9999 ); add_filter( 'stylesheet_uri', 'domain_mapping_post_content' ); add_filter( 'stylesheet_directory', 'domain_mapping_post_content' ); add_filter( 'stylesheet_directory_uri', 'domain_mapping_post_content' ); add_filter( 'template_directory', 'domain_mapping_post_content' ); add_filter( 'template_directory_uri', 'domain_mapping_post_content' ); add_filter( 'plugins_url', 'domain_mapping_post_content' ); } else { add_filter( 'admin_url', 'domain_mapping_adminurl', 10, 3 ); } add_action( 'admin_init', 'dm_redirect_admin' ); if ( isset( $_GET[ 'dm' ] ) ) add_action( 'template_redirect', 'remote_login_js' ); function remote_logout_loader() { global $current_site, $current_blog, $wpdb; $wpdb->dmtablelogins = $wpdb->base_prefix . 'domain_mapping_logins'; $protocol = is_ssl() ? 'https://' : 'http://'; $hash = get_dm_hash(); $key = md5( time() ); $wpdb->query( $wpdb->prepare( "INSERT INTO {$wpdb->dmtablelogins} ( `id`, `user_id`, `blog_id`, `t` ) VALUES( %s, 0, %d, NOW() )", $key, $current_blog->blog_id ) ); if ( get_site_option( 'dm_redirect_admin' ) ) { wp_redirect( $protocol . $current_site->domain . $current_site->path . "?dm={$hash}&action=logout&blogid={$current_blog->blog_id}&k={$key}&t=" . mt_rand() ); exit; } } function redirect_to_mapped_domain() { global $current_blog, $wpdb; // don't redirect the main site if ( is_main_site() ) return; // don't redirect post previews if ( isset( $_GET['preview'] ) && $_GET['preview'] == 'true' ) return; // don't redirect theme customizer (WP 3.4) if ( isset( $_POST['customize'] ) && isset( $_POST['theme'] ) && $_POST['customize'] == 'on' ) return; $protocol = is_ssl() ? 'https://' : 'http://'; $url = domain_mapping_siteurl( false ); if ( $url && $url != untrailingslashit( $protocol . $current_blog->domain . $current_blog->path ) ) { $redirect = get_site_option( 'dm_301_redirect' ) ? '301' : '302'; if ( ( defined( 'VHOST' ) && constant( "VHOST" ) != 'yes' ) || ( defined( 'SUBDOMAIN_INSTALL' ) && constant( 'SUBDOMAIN_INSTALL' ) == false ) ) { $_SERVER[ 'REQUEST_URI' ] = str_replace( $current_blog->path, '/', $_SERVER[ 'REQUEST_URI' ] ); } header( "Location: {$url}{$_SERVER[ 'REQUEST_URI' ]}", true, $redirect ); exit; } } add_action( 'template_redirect', 'redirect_to_mapped_domain' ); function get_dm_hash() { $remote_login_hash = get_site_option( 'dm_hash' ); if ( null == $remote_login_hash ) { $remote_login_hash = md5( time() ); update_site_option( 'dm_hash', $remote_login_hash ); } return $remote_login_hash; } function remote_login_js() { global $current_blog, $current_user, $wpdb; if ( 0 == get_site_option( 'dm_remote_login' ) ) return false; $wpdb->dmtablelogins = $wpdb->base_prefix . 'domain_mapping_logins'; $hash = get_dm_hash(); $protocol = is_ssl() ? 'https://' : 'http://'; if ( $_GET[ 'dm' ] == $hash ) { if ( $_GET[ 'action' ] == 'load' ) { if ( !is_user_logged_in() ) exit; $key = md5( time() . mt_rand() ); $wpdb->query( $wpdb->prepare( "INSERT INTO {$wpdb->dmtablelogins} ( `id`, `user_id`, `blog_id`, `t` ) VALUES( %s, %d, %d, NOW() )", $key, $current_user->ID, $_GET[ 'blogid' ] ) ); $url = add_query_arg( array( 'action' => 'login', 'dm' => $hash, 'k' => $key, 't' => mt_rand() ), $_GET[ 'back' ] ); echo "window.location = '$url'"; exit; } elseif ( $_GET[ 'action' ] == 'login' ) { if ( $details = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->dmtablelogins} WHERE id = %s AND blog_id = %d", $_GET[ 'k' ], $wpdb->blogid ) ) ) { if ( $details->blog_id == $wpdb->blogid ) { $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->dmtablelogins} WHERE id = %s", $_GET[ 'k' ] ) ); $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->dmtablelogins} WHERE t < %d", ( time() - 120 ) ) ); // remote logins survive for only 2 minutes if not used. wp_set_auth_cookie( $details->user_id ); wp_redirect( remove_query_arg( array( 'dm', 'action', 'k', 't', $protocol . $current_blog->domain . $_SERVER[ 'REQUEST_URI' ] ) ) ); exit; } else { wp_die( __( "Incorrect or out of date login key", 'wordpress-mu-domain-mapping' ) ); } } else { wp_die( __( "Unknown login key", 'wordpress-mu-domain-mapping' ) ); } } elseif ( $_GET[ 'action' ] == 'logout' ) { if ( $details = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->dmtablelogins} WHERE id = %d AND blog_id = %d", $_GET[ 'k' ], $_GET[ 'blogid' ] ) ) ) { $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->dmtablelogins} WHERE id = %s", $_GET[ 'k' ] ) ); $blog = get_blog_details( $_GET[ 'blogid' ] ); wp_clear_auth_cookie(); wp_redirect( trailingslashit( $blog->siteurl ) . "wp-login.php?loggedout=true" ); exit; } else { wp_die( __( "Unknown logout key", 'wordpress-mu-domain-mapping' ) ); } } } } function remote_login_js_loader() { global $current_site, $current_blog; if ( 0 == get_site_option( 'dm_remote_login' ) || is_user_logged_in() ) return false; $protocol = is_ssl() ? 'https://' : 'http://'; $hash = get_dm_hash(); echo ""; } // delete mapping if blog is deleted function delete_blog_domain_mapping( $blog_id, $drop ) { global $wpdb; $wpdb->dmtable = $wpdb->base_prefix . 'domain_mapping'; if ( $blog_id && $drop ) { // Get an array of domain names to pass onto any delete_blog_domain_mapping actions $domains = $wpdb->get_col( $wpdb->prepare( "SELECT domain FROM {$wpdb->dmtable} WHERE blog_id = %d", $blog_id ) ); do_action('dm_delete_blog_domain_mappings', $domains); $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->dmtable} WHERE blog_id = %d", $blog_id ) ); } } add_action( 'delete_blog', 'delete_blog_domain_mapping', 1, 2 ); // show mapping on site admin blogs screen function ra_domain_mapping_columns( $columns ) { $columns[ 'map' ] = __( 'Mapping' ); return $columns; } add_filter( 'wpmu_blogs_columns', 'ra_domain_mapping_columns' ); function ra_domain_mapping_field( $column, $blog_id ) { global $wpdb; static $maps = false; if ( $column == 'map' ) { if ( $maps === false ) { $wpdb->dmtable = $wpdb->base_prefix . 'domain_mapping'; $work = $wpdb->get_results( "SELECT blog_id, domain FROM {$wpdb->dmtable} ORDER BY blog_id" ); $maps = array(); if($work) { foreach( $work as $blog ) { $maps[ $blog->blog_id ][] = $blog->domain; } } } if( !empty( $maps[ $blog_id ] ) && is_array( $maps[ $blog_id ] ) ) { foreach( $maps[ $blog_id ] as $blog ) { echo $blog . '
'; } } } } add_action( 'manage_blogs_custom_column', 'ra_domain_mapping_field', 1, 3 ); add_action( 'manage_sites_custom_column', 'ra_domain_mapping_field', 1, 3 ); function dm_site_admin() { if ( function_exists( 'is_super_admin' ) ) { return is_super_admin(); } elseif ( function_exists( 'is_site_admin' ) ) { return is_site_admin(); } else { return true; } } function dm_idn_warning() { return sprintf( __( 'International Domain Names should be in punycode format.', 'wordpress-mu-domain-mapping' ), "http://api.webnic.cc/idnconversion.html" ); } ?>