/** * Checks that current theme files 'index.php' and 'style.css' exists. * * Does not initially check the default theme, which is the fallback and should always exist. * But if it doesn't exist, it'll fall back to the latest core default theme that does exist. * Will switch theme to the fallback theme if current theme does not validate. * * You can use the 'validate_current_theme' filter to return false to * disable this functionality. * * @since 1.5.0 * @see WP_DEFAULT_THEME * * @return bool */ function validate_current_theme() { /** * Filter whether to validate the current theme. * * @since 2.7.0 * * @param bool $validate Whether to validate the current theme. Default true. */ if (wp_installing() || !apply_filters('validate_current_theme', true)) { return true; } if (!file_exists(get_template_directory() . '/index.php')) { // Invalid. } elseif (!file_exists(get_template_directory() . '/style.css')) { // Invalid. } elseif (is_child_theme() && !file_exists(get_stylesheet_directory() . '/style.css')) { // Invalid. } else { // Valid. return true; } $default = wp_get_theme(WP_DEFAULT_THEME); if ($default->exists()) { switch_theme(WP_DEFAULT_THEME); return false; } /** * If we're in an invalid state but WP_DEFAULT_THEME doesn't exist, * switch to the latest core default theme that's installed. * If it turns out that this latest core default theme is our current * theme, then there's nothing we can do about that, so we have to bail, * rather than going into an infinite loop. (This is why there are * checks against WP_DEFAULT_THEME above, also.) We also can't do anything * if it turns out there is no default theme installed. (That's `false`.) */ $default = WP_Theme::get_core_default_theme(); if (false === $default || get_stylesheet() == $default->get_stylesheet()) { return true; } switch_theme($default->get_stylesheet()); return false; }
/** * Populate network settings. * * @since 3.0.0 * * @global wpdb $wpdb * @global object $current_site * @global int $wp_db_version * @global WP_Rewrite $wp_rewrite * * @param int $network_id ID of network to populate. * @return bool|WP_Error True on success, or WP_Error on warning (with the install otherwise successful, * so the error code must be checked) or failure. */ function populate_network($network_id = 1, $domain = '', $email = '', $site_name = '', $path = '/', $subdomain_install = false) { global $wpdb, $current_site, $wp_db_version, $wp_rewrite; $errors = new WP_Error(); if ('' == $domain) { $errors->add('empty_domain', __('You must provide a domain name.')); } if ('' == $site_name) { $errors->add('empty_sitename', __('You must provide a name for your network of sites.')); } // Check for network collision. if ($network_id == $wpdb->get_var($wpdb->prepare("SELECT id FROM {$wpdb->site} WHERE id = %d", $network_id))) { $errors->add('siteid_exists', __('The network already exists.')); } if (!is_email($email)) { $errors->add('invalid_email', __('You must provide a valid email address.')); } if ($errors->get_error_code()) { return $errors; } // If a user with the provided email does not exist, default to the current user as the new network admin. $site_user = get_user_by('email', $email); if (false === $site_user) { $site_user = wp_get_current_user(); } // Set up site tables. $template = get_option('template'); $stylesheet = get_option('stylesheet'); $allowed_themes = array($stylesheet => true); if ($template != $stylesheet) { $allowed_themes[$template] = true; } if (WP_DEFAULT_THEME != $stylesheet && WP_DEFAULT_THEME != $template) { $allowed_themes[WP_DEFAULT_THEME] = true; } // If WP_DEFAULT_THEME doesn't exist, also whitelist the latest core default theme. if (!wp_get_theme(WP_DEFAULT_THEME)->exists()) { if ($core_default = WP_Theme::get_core_default_theme()) { $allowed_themes[$core_default->get_stylesheet()] = true; } } if (1 == $network_id) { $wpdb->insert($wpdb->site, array('domain' => $domain, 'path' => $path)); $network_id = $wpdb->insert_id; } else { $wpdb->insert($wpdb->site, array('domain' => $domain, 'path' => $path, 'id' => $network_id)); } wp_cache_delete('networks_have_paths', 'site-options'); if (!is_multisite()) { $site_admins = array($site_user->user_login); $users = get_users(array('fields' => array('ID', 'user_login'))); if ($users) { foreach ($users as $user) { if (is_super_admin($user->ID) && !in_array($user->user_login, $site_admins)) { $site_admins[] = $user->user_login; } } } } else { $site_admins = get_site_option('site_admins'); } /* translators: Do not translate USERNAME, SITE_NAME, BLOG_URL, PASSWORD: those are placeholders. */ $welcome_email = __('Howdy USERNAME, Your new SITE_NAME site has been successfully set up at: BLOG_URL You can log in to the administrator account with the following information: Username: USERNAME Password: PASSWORD Log in here: BLOG_URLwp-login.php We hope you enjoy your new site. Thanks! --The Team @ SITE_NAME'); $misc_exts = array('jpg', 'jpeg', 'png', 'gif', 'mov', 'avi', 'mpg', '3gp', '3g2', 'midi', 'mid', 'pdf', 'doc', 'ppt', 'odt', 'pptx', 'docx', 'pps', 'ppsx', 'xls', 'xlsx', 'key'); $audio_exts = wp_get_audio_extensions(); $video_exts = wp_get_video_extensions(); $upload_filetypes = array_unique(array_merge($misc_exts, $audio_exts, $video_exts)); $sitemeta = array('site_name' => $site_name, 'admin_email' => $email, 'admin_user_id' => $site_user->ID, 'registration' => 'none', 'upload_filetypes' => implode(' ', $upload_filetypes), 'blog_upload_space' => 100, 'fileupload_maxk' => 1500, 'site_admins' => $site_admins, 'allowedthemes' => $allowed_themes, 'illegal_names' => array('www', 'web', 'root', 'admin', 'main', 'invite', 'administrator', 'files'), 'wpmu_upgrade_site' => $wp_db_version, 'welcome_email' => $welcome_email, 'first_post' => __('Welcome to %s. This is your first post. Edit or delete it, then start blogging!'), 'siteurl' => get_option('siteurl') . '/', 'add_new_users' => '0', 'upload_space_check_disabled' => is_multisite() ? get_site_option('upload_space_check_disabled') : '1', 'subdomain_install' => intval($subdomain_install), 'global_terms_enabled' => global_terms_enabled() ? '1' : '0', 'ms_files_rewriting' => is_multisite() ? get_site_option('ms_files_rewriting') : '0', 'initial_db_version' => get_option('initial_db_version'), 'active_sitewide_plugins' => array(), 'WPLANG' => get_locale()); if (!$subdomain_install) { $sitemeta['illegal_names'][] = 'blog'; } /** * Filter meta for a network on creation. * * @since 3.7.0 * * @param array $sitemeta Associative array of network meta keys and values to be inserted. * @param int $network_id ID of network to populate. */ $sitemeta = apply_filters('populate_network_meta', $sitemeta, $network_id); $insert = ''; foreach ($sitemeta as $meta_key => $meta_value) { if (is_array($meta_value)) { $meta_value = serialize($meta_value); } if (!empty($insert)) { $insert .= ', '; } $insert .= $wpdb->prepare("( %d, %s, %s)", $network_id, $meta_key, $meta_value); } $wpdb->query("INSERT INTO {$wpdb->sitemeta} ( site_id, meta_key, meta_value ) VALUES " . $insert); /* * When upgrading from single to multisite, assume the current site will * become the main site of the network. When using populate_network() * to create another network in an existing multisite environment, skip * these steps since the main site of the new network has not yet been * created. */ if (!is_multisite()) { $current_site = new stdClass(); $current_site->domain = $domain; $current_site->path = $path; $current_site->site_name = ucfirst($domain); $wpdb->insert($wpdb->blogs, array('site_id' => $network_id, 'blog_id' => 1, 'domain' => $domain, 'path' => $path, 'registered' => current_time('mysql'))); $current_site->blog_id = $blog_id = $wpdb->insert_id; update_user_meta($site_user->ID, 'source_domain', $domain); update_user_meta($site_user->ID, 'primary_blog', $blog_id); if ($subdomain_install) { $wp_rewrite->set_permalink_structure('/%year%/%monthnum%/%day%/%postname%/'); } else { $wp_rewrite->set_permalink_structure('/blog/%year%/%monthnum%/%day%/%postname%/'); } flush_rewrite_rules(); if (!$subdomain_install) { return true; } $vhost_ok = false; $errstr = ''; $hostname = substr(md5(time()), 0, 6) . '.' . $domain; // Very random hostname! $page = wp_remote_get('http://' . $hostname, array('timeout' => 5, 'httpversion' => '1.1')); if (is_wp_error($page)) { $errstr = $page->get_error_message(); } elseif (200 == wp_remote_retrieve_response_code($page)) { $vhost_ok = true; } if (!$vhost_ok) { $msg = '<p><strong>' . __('Warning! Wildcard DNS may not be configured correctly!') . '</strong></p>'; $msg .= '<p>' . sprintf(__('The installer attempted to contact a random hostname (%s) on your domain.'), '<code>' . $hostname . '</code>'); if (!empty($errstr)) { /* translators: %s: error message */ $msg .= ' ' . sprintf(__('This resulted in an error message: %s'), '<code>' . $errstr . '</code>'); } $msg .= '</p>'; $msg .= '<p>' . sprintf(__('To use a subdomain configuration, you must have a wildcard entry in your DNS. This usually means adding a %s hostname record pointing at your web server in your DNS configuration tool.'), '<code>*</code>') . '</p>'; $msg .= '<p>' . __('You can still use your site but any subdomain you create may not be accessible. If you know your DNS is correct, ignore this message.') . '</p>'; return new WP_Error('no_wildcard_dns', $msg); } } return true; }
/** * Make sure we update the default theme list to include the latest default theme. * * @ticket 29925 */ function test_default_theme_in_default_theme_list() { $latest_default_theme = WP_Theme::get_core_default_theme(); if (!$latest_default_theme->exists() || 'twenty' !== substr($latest_default_theme->get_stylesheet(), 0, 6)) { $this->markTestSkipped('No Twenty* series default themes are installed'); } $this->assertContains($latest_default_theme->get_stylesheet(), $this->default_themes); }