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

'; } // Add admin pages function dm_add_pages() { global $current_site, $wpdb, $wp_db_version; if (!isset($current_site) && $wp_db_version >= 15260) { 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.", 'wp-domain-mapping')); } if (get_site_option('dm_user_settings') && $current_site->blog_id != $wpdb->blogid && !dm_sunrise_warning(false)) { add_management_page(__('Domain Mapping', 'wp-domain-mapping'), __('Domain Mapping', 'wp-domain-mapping'), 'manage_options', 'domainmapping', 'dm_manage_page'); } } add_action('admin_menu', 'dm_add_pages'); // Add network admin pages function dm_network_pages() { add_submenu_page('settings.php', __('Domain Mapping', 'wp-domain-mapping'), __('Domain Mapping', 'wp-domain-mapping'), 'manage_network', 'domain-mapping', 'dm_admin_page'); add_submenu_page('sites.php', __('Domains', 'wp-domain-mapping'), __('Domains', 'wp-domain-mapping'), 'manage_network', 'domains', 'dm_domains_admin'); } add_action('network_admin_menu', 'dm_network_pages'); // Default update messages function dm_echo_default_updated_msg() { switch ($_GET['updated']) { case "add": $msg = __('New domain added.', 'wp-domain-mapping'); break; case "exists": $msg = __('New domain already exists.', 'wp-domain-mapping'); break; case "primary": $msg = __('New primary domain.', 'wp-domain-mapping'); break; case "del": $msg = __('Domain deleted.', 'wp-domain-mapping'); break; } echo "

$msg

"; } add_action('dm_echo_updated_msg', 'dm_echo_default_updated_msg'); // Create database tables function maybe_create_db() { global $wpdb; // Initialize remote login hash get_dm_hash(); // Set global table names $wpdb->dmtable = $wpdb->base_prefix . 'domain_mapping'; $wpdb->dmtablelogins = $wpdb->base_prefix . 'domain_mapping_logins'; $wpdb->dmtablelogs = $wpdb->base_prefix . 'domain_mapping_logs'; // Only network admins can create tables if (!dm_site_admin()) { return; } // Use static variable to prevent repeated creation static $tables_created = false; if ($tables_created) { return; } $created = 0; // Create domain_mapping table 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; } // Create domain_mapping_logins table 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; } // Create domain_mapping_logs table if ($wpdb->get_var("SHOW TABLES LIKE '{$wpdb->dmtablelogs}'") != $wpdb->dmtablelogs) { $wpdb->query("CREATE TABLE IF NOT EXISTS `{$wpdb->dmtablelogs}` ( `id` bigint(20) NOT NULL auto_increment, `user_id` bigint(20) NOT NULL, `action` varchar(50) NOT NULL, `domain` varchar(255) NOT NULL, `blog_id` bigint(20) NOT NULL, `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP, PRIMARY KEY (`id`) );"); $created = 1; } // If any table was created, show success message and mark as created if ($created) { echo '

' . __('Domain mapping database table created.', 'wp-domain-mapping') . '

'; $tables_created = true; } } // Ajax handler for domain actions function dm_ajax_handle_actions() { check_ajax_referer('domain_mapping', 'nonce'); if (!current_user_can('manage_network')) { wp_send_json_error(__('Permission denied.', 'wp-domain-mapping')); } global $wpdb; $wpdb->dmtable = $wpdb->base_prefix . 'domain_mapping'; $wpdb->dmtablelogs = $wpdb->base_prefix . 'domain_mapping_logs'; $action = sanitize_text_field($_POST['action_type']); $domain = dm_clean_domain(sanitize_text_field(strtolower($_POST['domain']))); $blog_id = absint($_POST['blog_id']); $active = isset($_POST['active']) ? absint($_POST['active']) : 0; $orig_domain = dm_clean_domain(sanitize_text_field($_POST['orig_domain'])); $current_user_id = get_current_user_id(); switch ($action) { case 'save': if ($blog_id != 0 && $blog_id != 1 && null == $wpdb->get_var($wpdb->prepare("SELECT domain FROM {$wpdb->dmtable} WHERE blog_id != %d AND domain = %s", $blog_id, $domain))) { if (empty($orig_domain)) { $wpdb->query($wpdb->prepare("INSERT INTO {$wpdb->dmtable} ( `blog_id`, `domain`, `active` ) VALUES ( %d, %s, %d )", $blog_id, $domain, $active)); $wpdb->insert($wpdb->dmtablelogs, array('user_id' => $current_user_id, 'action' => 'add', 'domain' => $domain, 'blog_id' => $blog_id)); wp_send_json_success(__('Domain added successfully.', 'wp-domain-mapping')); } else { $wpdb->query($wpdb->prepare("UPDATE {$wpdb->dmtable} SET blog_id = %d, domain = %s, active = %d WHERE domain = %s", $blog_id, $domain, $active, $orig_domain)); $wpdb->insert($wpdb->dmtablelogs, array('user_id' => $current_user_id, 'action' => 'edit', 'domain' => $domain, 'blog_id' => $blog_id)); wp_send_json_success(__('Domain updated successfully.', 'wp-domain-mapping')); } } else { wp_send_json_error(__('Invalid site ID or domain already exists.', 'wp-domain-mapping')); } break; case 'delete': $domains = isset($_POST['domains']) ? array_map('sanitize_text_field', (array)$_POST['domains']) : array($domain); foreach ($domains as $del_domain) { $affected_blog_id = $wpdb->get_var($wpdb->prepare("SELECT blog_id FROM {$wpdb->dmtable} WHERE domain = %s", $del_domain)); $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->dmtable} WHERE domain = %s", $del_domain)); $wpdb->insert($wpdb->dmtablelogs, array('user_id' => $current_user_id, 'action' => 'delete', 'domain' => $del_domain, 'blog_id' => $affected_blog_id)); } wp_send_json_success(__('Selected domains deleted successfully.', 'wp-domain-mapping')); break; default: wp_send_json_error(__('Invalid action.', 'wp-domain-mapping')); } } add_action('wp_ajax_dm_handle_actions', 'dm_ajax_handle_actions'); // Domains admin page function dm_domains_admin() { global $wpdb, $current_site; if (!dm_site_admin()) { 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’.", "wp-domain-mapping"), $current_site->path)); } $wpdb->dmtable = $wpdb->base_prefix . 'domain_mapping'; $total_domains = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->dmtable}"); $primary_domains = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->dmtable} WHERE active = 1"); $edit_row = false; if (isset($_GET['edit_domain'])) { $edit_domain = sanitize_text_field($_GET['edit_domain']); $edit_row = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->dmtable} WHERE domain = %s", $edit_domain)); } ?>

prepare("domain LIKE %s", '%' . $wpdb->esc_like($_GET['s']) . '%'); if (!empty($_GET['blog_id'])) $where[] = $wpdb->prepare("blog_id = %d", $_GET['blog_id']); if (isset($_GET['active']) && $_GET['active'] !== '') $where[] = $wpdb->prepare("active = %d", $_GET['active']); $where_sql = $where ? ' WHERE ' . implode(' AND ', $where) : ''; $total_items = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->dmtable}" . $where_sql); $total_pages = ceil($total_items / $per_page); $rows = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->dmtable}" . $where_sql . " ORDER BY id DESC LIMIT %d, %d", $offset, $per_page)); dm_domain_listing($rows); echo '
'; echo '
'; echo paginate_links(array( 'base' => add_query_arg('paged', '%#%'), 'format' => '', 'prev_text' => __('«'), 'next_text' => __('»'), 'total' => $total_pages, 'current' => $paged, 'mid_size' => 2, 'end_size' => 1, )); echo '' . sprintf(_n('%s item', '%s items', $total_items, 'wp-domain-mapping'), number_format_i18n($total_items)) . ''; echo '
'; echo '
'; ?>

Note: %s', 'wp-domain-mapping'), dm_idn_warning()); ?>

blog_id = ''; $row->domain = ''; $row->active = 1; } ?>

active, 1); ?> />
Warning! Primary domains are currently disabled.', 'wp-domain-mapping'); ?>

dmtable = $wpdb->base_prefix . 'domain_mapping'; if (!$rows) { echo '

' . __('No domains found.', 'wp-domain-mapping') . '

'; return; } $edit_url = network_admin_url(file_exists(ABSPATH . 'wp-admin/network/site-info.php') ? 'site-info.php' : (file_exists(ABSPATH . 'wp-admin/ms-sites.php') ? 'ms-sites.php' : 'wpmu-blogs.php')); ?>
blog_id); ?> domain); ?> active == 1): ?>
" . __('Warning! Primary domains are currently disabled.', 'wp-domain-mapping') . "

"; } } function dm_ensure_protocol($domain) { if (preg_match('#^https?://#', $domain)) { return $domain; } return 'http://' . $domain; } function dm_clean_domain($domain) { $domain = preg_replace('#^https?://#', '', $domain); $domain = rtrim($domain, '/'); return $domain; } // Domain logs display function dm_domain_logs() { global $wpdb; $wpdb->dmtablelogs = $wpdb->base_prefix . 'domain_mapping_logs'; $logs = $wpdb->get_results("SELECT * FROM {$wpdb->dmtablelogs} ORDER BY timestamp DESC LIMIT 20"); if (!$logs) { echo '

' . __('No logs available.', 'wp-domain-mapping') . '

'; return; } ?>
user_id)->user_login); ?> action); ?> domain); ?> blog_id); ?> timestamp); ?>
'domains', 'blog_id' => $blog_id), admin_url('network/sites.php')); $actions['domains'] = '' . __('Domains', 'wp-domain-mapping') . ''; return $actions; } add_filter('manage_sites_action_links', 'dm_add_domain_link_to_sites', 10, 2); // Configuration page function dm_admin_page() { global $wpdb, $current_site; if (!dm_site_admin()) { 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’.", "wp-domain-mapping"), $current_site->path)); } 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']) && $_POST['action'] == 'update') { check_admin_referer('domain_mapping'); $ipok = true; $ipaddresses = explode(',', sanitize_text_field($_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; 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', sanitize_text_field($_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); } ?>

/>
/>
/>
/>
/>

site admin page.", 'wp-domain-mapping'); } else { _e("This plugin has not been configured correctly yet.", 'wp-domain-mapping'); } return false; } $protocol = is_ssl() ? 'https://' : 'http://'; $domains = $wpdb->get_results("SELECT * FROM {$wpdb->dmtable} WHERE blog_id = '{$wpdb->blogid}'", ARRAY_A); ?>

$orig_url['host'], 'path' => $orig_url['path'], 'active' => 0); ?>
'domainmapping', 'action' => 'delete'), admin_url($parent_file)); foreach ($domains as $details): if (0 == $primary_found && $details['domain'] == $orig_url['host']) $details['active'] = 1; ?>
/>

Warning! Primary domains are currently disabled.', 'wp-domain-mapping'); ?>

" . sprintf(__('Add a DNS "CNAME" record pointing to: %s', 'wp-domain-mapping'), esc_html(get_site_option('dm_cname'))) . "

"; } else { $dm_ipaddress = get_site_option('dm_ipaddress', 'IP not set.'); echo "

" . sprintf(__('Add a DNS "A" record pointing to: %s', 'wp-domain-mapping'), esc_html($dm_ipaddress)) . "

"; } ?>

Note: %s', 'wp-domain-mapping'), dm_idn_warning()); ?>

'domainmapping'), admin_url($parent_file)); if (!empty($_POST['action'])) { $domain = sanitize_text_field($_POST['domain']); if (empty($domain)) wp_die(__("You must enter a domain", 'wp-domain-mapping')); 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; } 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; } } elseif ($_GET['action'] == 'delete') { $domain = sanitize_text_field($_GET['domain']); if (empty($domain)) wp_die(__("You must enter a domain", 'wp-domain-mapping')); check_admin_referer("delete" . $_GET['domain']); do_action('dm_handle_actions_del', $domain); $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->dmtable} WHERE domain = %s", $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'); } // Sunrise check 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", 'wp-domain-mapping'), WP_CONTENT_DIR, ABSPATH)); } else { wp_die(__("This plugin has not been configured correctly yet.", 'wp-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", 'wp-domain-mapping'), ABSPATH)); } else { wp_die(__("This plugin has not been configured correctly yet.", 'wp-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.", 'wp-domain-mapping'), ABSPATH)); } else { wp_die(__("This plugin has not been configured correctly yet.", 'wp-domain-mapping')); } } return false; } // Core domain mapping functions function domain_mapping_siteurl($setting) { global $wpdb, $current_blog; 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($wpdb->prepare("SELECT domain FROM {$wpdb->dmtable} WHERE blog_id = %d AND domain = %s LIMIT 1", $wpdb->blogid, $_SERVER['HTTP_HOST'])); if (null == $domain) { $return_url[$wpdb->blogid] = untrailingslashit(get_original_url("siteurl")); return $return_url[$wpdb->blogid]; } } else { $domain = $wpdb->get_var($wpdb->prepare("SELECT domain FROM {$wpdb->dmtable} WHERE blog_id = %d AND active = 1 LIMIT 1", $wpdb->blogid)); 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; } function get_original_url($url, $blog_id = 0) { global $wpdb; $id = $blog_id ?: $wpdb->blogid; static $orig_urls = array(); if (!isset($orig_urls[$id])) { if (defined('DOMAIN_MAPPING')) remove_filter('pre_option_' . $url, 'domain_mapping_' . $url); $orig_url = $blog_id == 0 ? get_option($url) : get_blog_option($blog_id, $url); $orig_url = is_ssl() ? str_replace("http://", "https://", $orig_url) : str_replace("https://", "http://", $orig_url); $orig_urls[$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); if ((is_ssl() || force_ssl_admin()) && 0 === strpos($url, 'http://')) { $url = 'https://' . substr($url, 7); } } return $url; } function domain_mapping_post_content($post_content) { $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() { if (strpos($_SERVER['REQUEST_URI'], 'wp-admin/admin-ajax.php') !== false) return; if (get_site_option('dm_redirect_admin')) { $url = get_original_url('siteurl'); if (false === strpos($url, $_SERVER['HTTP_HOST'])) { wp_redirect(untrailingslashit($url) . $_SERVER['REQUEST_URI']); exit; } } else { global $current_blog; $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; $url = get_original_url('siteurl'); if ($url != site_url()) { $url .= "/wp-login.php"; echo ""; } } 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; if (is_main_site() || (isset($_GET['preview']) && $_GET['preview'] == 'true') || (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; $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))); 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", 'wp-domain-mapping')); } } else { wp_die(__("Unknown login key", 'wp-domain-mapping')); } } elseif ($_GET['action'] == 'logout') { if ($details = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->dmtablelogins} WHERE id = %s 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", 'wp-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; $protocol = is_ssl() ? 'https://' : 'http://'; $hash = get_dm_hash(); echo ""; } function delete_blog_domain_mapping($blog_id, $drop) { global $wpdb; $wpdb->dmtable = $wpdb->base_prefix . 'domain_mapping'; if ($blog_id && $drop) { $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); 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 esc_html($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() { return current_user_can('manage_network'); } function dm_idn_warning() { return sprintf(__('International Domain Names should be in punycode format.', 'wp-domain-mapping'), "https://www.punycoder.com/"); } ?>