".__( '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
" . __( '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 "' . sprintf( __( 'Note: %s', 'wordpress-mu-domain-mapping' ), dm_idn_warning() ) . "
"; } function dm_edit_domain( $row = false ) { if ( is_object( $row ) ) { 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 " | "; 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 '" . __( "* 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 "" . 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 . '