2010-01-10 13:10:51 -05:00
< ? php
/**
2010-01-28 11:09:52 -05:00
* These functions are needed to load Multisite .
2010-01-10 13:10:51 -05:00
*
2010-01-28 11:09:52 -05:00
* @ since 3.0 . 0
2010-01-10 13:10:51 -05:00
*
* @ package WordPress
2010-01-28 11:09:52 -05:00
* @ subpackage Multisite
2010-01-10 13:10:51 -05:00
*/
2010-01-28 11:09:52 -05:00
/**
2010-02-01 15:26:08 -05:00
* Whether a subdomain configuration is enabled .
2010-01-28 11:09:52 -05:00
*
2010-03-26 15:13:36 -04:00
* @ since 3.0 . 0
2010-01-28 11:09:52 -05:00
*
* @ return bool True if subdomain configuration is enabled , false otherwise .
*/
function is_subdomain_install () {
2010-05-04 16:48:28 -04:00
if ( defined ( 'SUBDOMAIN_INSTALL' ) )
return SUBDOMAIN_INSTALL ;
2010-01-28 11:09:52 -05:00
if ( defined ( 'VHOST' ) && VHOST == 'yes' )
return true ;
2010-01-10 13:10:51 -05:00
2010-01-28 11:09:52 -05:00
return false ;
}
2010-01-10 13:10:51 -05:00
2010-11-23 19:19:38 -05:00
/**
* Returns array of network plugin files to be included in global scope .
*
* The default directory is wp - content / plugins . To change the default directory
* manually , define < code > WP_PLUGIN_DIR </ code > and < code > WP_PLUGIN_URL </ code >
* in wp - config . php .
*
* @ access private
* @ since 3.1 . 0
* @ return array Files to include
*/
function wp_get_active_network_plugins () {
$active_plugins = ( array ) get_site_option ( 'active_sitewide_plugins' , array () );
if ( empty ( $active_plugins ) )
return array ();
2010-12-07 20:03:12 -05:00
$plugins = array ();
2010-11-23 19:19:38 -05:00
$active_plugins = array_keys ( $active_plugins );
sort ( $active_plugins );
foreach ( $active_plugins as $plugin ) {
if ( ! validate_file ( $plugin ) // $plugin must validate as file
&& '.php' == substr ( $plugin , - 4 ) // $plugin must end with '.php'
&& file_exists ( WP_PLUGIN_DIR . '/' . $plugin ) // $plugin must exist
)
$plugins [] = WP_PLUGIN_DIR . '/' . $plugin ;
}
return $plugins ;
}
2010-02-01 15:26:08 -05:00
/**
* Checks status of current blog .
*
* Checks if the blog is deleted , inactive , archived , or spammed .
*
* Dies with a default message if the blog does not pass the check .
*
* To change the default message when a blog does not pass the check ,
* use the wp - content / blog - deleted . php , blog - inactive . php and
* blog - suspended . php drop - ins .
*
2013-10-30 10:39:10 -04:00
* @ since 3.0 . 0
*
2010-02-01 15:26:08 -05:00
* @ return bool | string Returns true on success , or drop - in file to include .
*/
2010-01-10 13:10:51 -05:00
function ms_site_check () {
2012-10-04 08:40:09 -04:00
$blog = get_blog_details ();
2010-01-20 02:44:47 -05:00
2013-10-08 16:01:09 -04:00
/**
* Filter checking the status of the current blog .
2013-10-24 22:29:52 -04:00
*
2013-10-30 10:39:10 -04:00
* @ since 3.0 . 0
2013-10-24 22:29:52 -04:00
*
2013-10-08 16:01:09 -04:00
* @ param bool null Whether to skip the blog status check . Default null .
*/
$check = apply_filters ( 'ms_site_check' , null );
2010-04-23 12:18:33 -04:00
if ( null !== $check )
2010-04-23 12:50:01 -04:00
return true ;
2010-04-23 12:18:33 -04:00
// Allow super admins to see blocked sites
if ( is_super_admin () )
return true ;
2012-10-04 08:40:09 -04:00
if ( '1' == $blog -> deleted ) {
2010-12-14 03:38:01 -05:00
if ( file_exists ( WP_CONTENT_DIR . '/blog-deleted.php' ) )
2010-02-01 15:26:08 -05:00
return WP_CONTENT_DIR . '/blog-deleted.php' ;
2010-12-14 03:38:01 -05:00
else
wp_die ( __ ( 'This user has elected to delete their account and the content is no longer available.' ), '' , array ( 'response' => 410 ) );
2010-02-01 15:26:08 -05:00
}
2012-10-04 08:40:09 -04:00
if ( '2' == $blog -> deleted ) {
2010-02-01 15:26:08 -05:00
if ( file_exists ( WP_CONTENT_DIR . '/blog-inactive.php' ) )
return WP_CONTENT_DIR . '/blog-inactive.php' ;
else
2013-11-12 22:23:10 -05:00
wp_die ( sprintf ( __ ( 'This site has not been activated yet. If you are having problems activating your site, please contact <a href="mailto:%1$s">%1$s</a>.' ), str_replace ( '@' , ' AT ' , get_site_option ( 'admin_email' , 'support@' . get_current_site () -> domain ) ) ) );
2010-01-20 02:44:47 -05:00
}
2012-10-04 08:40:09 -04:00
if ( $blog -> archived == '1' || $blog -> spam == '1' ) {
2010-12-14 03:38:01 -05:00
if ( file_exists ( WP_CONTENT_DIR . '/blog-suspended.php' ) )
2010-02-01 15:26:08 -05:00
return WP_CONTENT_DIR . '/blog-suspended.php' ;
2010-12-14 03:38:01 -05:00
else
wp_die ( __ ( 'This site has been archived or suspended.' ), '' , array ( 'response' => 410 ) );
2010-01-20 02:44:47 -05:00
}
2010-01-25 17:09:43 -05:00
2010-01-20 02:44:47 -05:00
return true ;
2010-01-10 13:10:51 -05:00
}
2010-02-01 15:26:08 -05:00
/**
* Sets current site name .
*
* @ access private
* @ since 3.0 . 0
* @ return object $current_site object with site_name
*/
2010-01-28 11:09:52 -05:00
function get_current_site_name ( $current_site ) {
global $wpdb ;
2010-08-31 14:17:20 -04:00
$current_site -> site_name = wp_cache_get ( $current_site -> id . ':site_name' , 'site-options' );
2010-02-01 15:26:08 -05:00
if ( ! $current_site -> site_name ) {
2010-08-31 14:17:20 -04:00
$current_site -> site_name = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT meta_value FROM $wpdb->sitemeta WHERE site_id = %d AND meta_key = 'site_name' " , $current_site -> id ) );
if ( ! $current_site -> site_name )
$current_site -> site_name = ucfirst ( $current_site -> domain );
2011-08-25 15:29:47 -04:00
wp_cache_set ( $current_site -> id . ':site_name' , $current_site -> site_name , 'site-options' );
2010-01-28 11:09:52 -05:00
}
2010-08-31 14:17:20 -04:00
2010-01-28 11:09:52 -05:00
return $current_site ;
}
2014-02-13 18:07:14 -05:00
/**
* Retrieve a network object by its domain and path .
*
* @ since 3.9 . 0
*
* @ param string $domain Domain to check .
* @ param string $path Path to check .
* @ return object | bool Network object if successful . False when no network is found .
*/
function get_network_by_path ( $domain , $path ) {
global $wpdb ;
$network_id = false ;
$domains = $exact_domains = array ( $domain );
$pieces = explode ( '.' , $domain );
// It's possible one domain to search is 'com', but it might as well
// be 'localhost' or some other locally mapped domain.
while ( array_shift ( $pieces ) ) {
if ( $pieces ) {
$domains [] = implode ( '.' , $pieces );
}
}
if ( '/' !== $path ) {
$paths = array ( '/' , $path );
} else {
$paths = array ( '/' );
}
$search_domains = " ' " . implode ( " ', ' " , $wpdb -> _escape ( $domains ) ) . " ' " ;
$paths = " ' " . implode ( " ', ' " , $wpdb -> _escape ( $paths ) ) . " ' " ;
$networks = $wpdb -> get_results ( " SELECT id, domain, path FROM $wpdb->site
WHERE domain IN ( $search_domains ) AND path IN ( $paths )
ORDER BY CHAR_LENGTH ( domain ) DESC , CHAR_LENGTH ( path ) DESC " );
/*
* Domains are sorted by length of domain , then by length of path .
* The domain must match for the path to be considered . Otherwise ,
* a network with the path of / will suffice .
*/
$found = false ;
foreach ( $networks as $network ) {
if ( $network -> domain === $domain || " www. $network->domain " === $domain ) {
if ( $network -> path === $path ) {
$found = true ;
break ;
}
}
if ( $network -> path === '/' ) {
$found = true ;
break ;
}
}
if ( $found ) {
$network = wp_get_network ( $network );
return $network ;
}
return false ;
}
/**
* Retrieve an object containing information about the requested network .
*
* @ since 3.9 . 0
*
* @ param int $network_id The network ' s DB row or ID .
* @ return mixed Object containing network information if found , false if not .
*/
function wp_get_network ( $network ) {
global $wpdb ;
if ( ! is_object ( $network ) ) {
$network = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->site WHERE id = %d " , $network ) );
if ( ! $network ) {
return false ;
}
}
return $network ;
}
2010-02-01 15:26:08 -05:00
/**
* Sets current_site object .
*
* @ access private
* @ since 3.0 . 0
* @ return object $current_site object
*/
2010-01-28 11:09:52 -05:00
function wpmu_current_site () {
2014-02-13 18:07:14 -05:00
global $wpdb , $current_site , $domain , $path ;
2011-10-31 15:38:46 -04:00
if ( empty ( $current_site ) )
$current_site = new stdClass ;
2014-02-13 18:07:14 -05:00
// 1. If constants are defined, that's our network.
2010-01-28 11:09:52 -05:00
if ( defined ( 'DOMAIN_CURRENT_SITE' ) && defined ( 'PATH_CURRENT_SITE' ) ) {
2010-02-18 20:03:58 -05:00
$current_site -> id = defined ( 'SITE_ID_CURRENT_SITE' ) ? SITE_ID_CURRENT_SITE : 1 ;
2010-01-28 11:09:52 -05:00
$current_site -> domain = DOMAIN_CURRENT_SITE ;
$current_site -> path = $path = PATH_CURRENT_SITE ;
2010-03-06 15:01:32 -05:00
if ( defined ( 'BLOG_ID_CURRENT_SITE' ) )
$current_site -> blog_id = BLOG_ID_CURRENT_SITE ;
elseif ( defined ( 'BLOGID_CURRENT_SITE' ) ) // deprecated.
2010-01-28 11:09:52 -05:00
$current_site -> blog_id = BLOGID_CURRENT_SITE ;
2014-02-13 18:07:14 -05:00
// 2. Pull the network from cache, if possible.
} elseif ( ! $current_site = wp_cache_get ( 'current_site' , 'site-options' ) ) {
2010-02-12 12:06:43 -05:00
2014-02-13 18:07:14 -05:00
// 3. See if they have only one network.
$networks = $wpdb -> get_col ( " SELECT id FROM $wpdb->site LIMIT 2 " );
2010-01-28 11:09:52 -05:00
2014-02-13 18:07:14 -05:00
if ( count ( $networks ) <= 1 ) {
$current_site = wp_get_network ( $networks [ 0 ] -> id );
2010-01-28 11:09:52 -05:00
2014-02-13 18:07:14 -05:00
$current_site -> blog_id = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT blog_id
FROM $wpdb -> blogs WHERE domain = % s AND path = % s " ,
$current_site -> domain , $current_site -> path ) );
2010-02-01 15:26:08 -05:00
2014-02-13 18:07:14 -05:00
wp_cache_set ( 'current_site' , 'site-options' );
2010-02-01 15:26:08 -05:00
2014-02-13 18:07:14 -05:00
// 4. Multiple networks are in play. Determine which via domain and path.
} else {
// Find the first path segment.
$path = substr ( $_SERVER [ 'REQUEST_URI' ], 0 , 1 + strpos ( $_SERVER [ 'REQUEST_URI' ], '/' , 1 ) );
$current_site = get_network_by_path ( $domain , $path );
2010-02-08 13:02:23 -05:00
2014-02-13 18:07:14 -05:00
// Option 1. We did not find anything.
if ( ! $current_site ) {
wp_load_translations_early ();
wp_die ( __ ( 'No site defined on this host. If you are the owner of this site, please check <a href="http://codex.wordpress.org/Debugging_a_WordPress_Network">Debugging a WordPress Network</a> for help.' ) );
}
2010-01-28 11:09:52 -05:00
}
2010-02-01 15:26:08 -05:00
}
2014-02-13 18:07:14 -05:00
// Option 2. We found something. Load up site meta and return.
wp_load_core_site_options ();
$current_site = get_current_site_name ( $current_site );
return $current_site ;
2010-01-10 13:10:51 -05:00
}
2010-01-28 11:09:52 -05:00
2010-02-01 15:26:08 -05:00
/**
2010-02-20 08:51:32 -05:00
* Displays a failure message .
2010-02-01 15:26:08 -05:00
*
2010-04-30 11:21:10 -04:00
* Used when a blog ' s tables do not exist . Checks for a missing $wpdb -> site table as well .
2010-02-01 15:26:08 -05:00
*
* @ access private
* @ since 3.0 . 0
*/
2010-02-20 08:51:32 -05:00
function ms_not_installed () {
2010-01-28 11:09:52 -05:00
global $wpdb , $domain , $path ;
2010-02-01 15:26:08 -05:00
2012-01-26 15:34:27 -05:00
wp_load_translations_early ();
2012-11-07 17:03:23 -05:00
$title = __ ( 'Error establishing a database connection' );
2010-05-03 05:51:40 -04:00
$msg = '<h1>' . $title . '</h1>' ;
2010-04-30 11:21:10 -04:00
if ( ! is_admin () )
die ( $msg );
2012-01-26 15:34:27 -05:00
$msg .= '<p>' . __ ( 'If your site does not display, please contact the owner of this network.' ) . '' ;
$msg .= ' ' . __ ( 'If you are the owner of this network please check that MySQL is running properly and all tables are error free.' ) . '</p>' ;
2013-06-26 15:33:58 -04:00
if ( ! $wpdb -> get_var ( " SHOW TABLES LIKE ' $wpdb->site ' " ) )
2012-01-26 15:34:27 -05:00
$msg .= '<p>' . sprintf ( __ ( '<strong>Database tables are missing.</strong> This means that MySQL is not running, WordPress was not installed properly, or someone deleted <code>%s</code>. You really should look at your database now.' ), $wpdb -> site ) . '</p>' ;
2010-02-01 15:26:08 -05:00
else
2012-01-26 15:34:27 -05:00
$msg .= '<p>' . sprintf ( __ ( '<strong>Could not find site <code>%1$s</code>.</strong> Searched for table <code>%2$s</code> in database <code>%3$s</code>. Is that right?' ), rtrim ( $domain . $path , '/' ), $wpdb -> blogs , DB_NAME ) . '</p>' ;
$msg .= '<p><strong>' . __ ( 'What do I do now?' ) . '</strong> ' ;
$msg .= __ ( 'Read the <a target="_blank" href="http://codex.wordpress.org/Debugging_a_WordPress_Network">bug report</a> page. Some of the guidelines there may help you figure out what went wrong.' );
$msg .= ' ' . __ ( 'If you’re still stuck with this message, then check that your database contains the following tables:' ) . '</p><ul>' ;
2010-04-30 11:21:10 -04:00
foreach ( $wpdb -> tables ( 'global' ) as $t => $table ) {
if ( 'sitecategories' == $t )
continue ;
$msg .= '<li>' . $table . '</li>' ;
2010-02-01 15:26:08 -05:00
}
$msg .= '</ul>' ;
2010-04-30 11:21:10 -04:00
wp_die ( $msg , $title );
2010-03-26 15:13:36 -04:00
}