2010-01-05 23:02:57 -05:00
< ? php
2010-01-22 17:14:22 -05:00
/**
2011-11-30 19:36:19 -05:00
* Multisite WordPress API
2010-01-22 17:14:22 -05:00
*
* @ package WordPress
2010-04-04 09:29:35 -04:00
* @ subpackage Multisite
* @ since 3.0 . 0
2010-01-22 17:14:22 -05:00
*/
2010-09-29 19:44:34 -04:00
/**
* Gets the network ' s site and user counts .
*
* @ since MU 1.0
* @ uses get_blog_count ()
* @ uses get_user_count ()
*
* @ return array Site and user count for the network .
*/
2010-01-05 23:02:57 -05:00
function get_sitestats () {
global $wpdb ;
2011-08-17 13:49:57 -04:00
$stats = array (
'blogs' => get_blog_count (),
'users' => get_user_count (),
);
2010-01-05 23:02:57 -05:00
return $stats ;
}
2010-09-29 19:44:34 -04:00
/**
* Get the admin for a domain / path combination .
*
* @ since MU 1.0
*
* @ param string $sitedomain Optional . Site domain .
* @ param string $path Optional . Site path .
* @ return array The network admins
*/
2010-01-05 23:02:57 -05:00
function get_admin_users_for_domain ( $sitedomain = '' , $path = '' ) {
global $wpdb ;
2010-01-06 23:27:46 -05:00
2010-02-04 13:57:32 -05:00
if ( ! $sitedomain )
2010-01-05 23:02:57 -05:00
$site_id = $wpdb -> siteid ;
2010-01-12 13:40:40 -05:00
else
2010-02-04 13:57:32 -05:00
$site_id = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT id FROM $wpdb->site WHERE domain = %s AND path = %s " , $sitedomain , $path ) );
2010-01-05 23:02:57 -05:00
2010-02-04 13:57:32 -05:00
if ( $site_id )
return $wpdb -> get_results ( $wpdb -> prepare ( " SELECT u.ID, u.user_login, u.user_pass FROM $wpdb->users AS u, $wpdb->sitemeta AS sm WHERE sm.meta_key = 'admin_user_id' AND u.ID = sm.meta_value AND sm.site_id = %d " , $site_id ), ARRAY_A );
2010-01-12 13:40:40 -05:00
2010-01-05 23:02:57 -05:00
return false ;
}
2010-09-29 19:44:34 -04:00
/**
* Get one of a user ' s active blogs
*
* Returns the user ' s primary blog , if she has one and
* it is active . If it ' s inactive , function returns another
* active blog of the user . If none are found , the user
* is added as a Subscriber to the Dashboard Blog and that blog
* is returned .
*
* @ since MU 1.0
* @ uses get_blogs_of_user ()
* @ uses add_user_to_blog ()
* @ uses get_blog_details ()
*
* @ param int $user_id The unique ID of the user
* @ return object The blog object
*/
function get_active_blog_for_user ( $user_id ) {
2010-01-05 23:02:57 -05:00
global $wpdb ;
$blogs = get_blogs_of_user ( $user_id );
2010-10-07 15:34:18 -04:00
if ( empty ( $blogs ) )
return null ;
if ( ! is_multisite () )
return $blogs [ $wpdb -> blogid ];
2010-01-05 23:02:57 -05:00
2010-02-23 05:42:40 -05:00
$primary_blog = get_user_meta ( $user_id , 'primary_blog' , true );
2010-10-07 15:34:18 -04:00
$first_blog = current ( $blogs );
2010-11-04 05:31:58 -04:00
if ( false !== $primary_blog ) {
2010-10-07 15:34:18 -04:00
if ( ! isset ( $blogs [ $primary_blog ] ) ) {
2010-11-04 05:31:58 -04:00
update_user_meta ( $user_id , 'primary_blog' , $first_blog -> userblog_id );
2011-09-27 03:36:36 -04:00
$primary = get_blog_details ( $first_blog -> userblog_id );
2010-01-05 23:02:57 -05:00
} else {
2010-10-07 15:34:18 -04:00
$primary = get_blog_details ( $primary_blog );
2010-01-05 23:02:57 -05:00
}
} else {
2010-11-04 05:31:58 -04:00
//TODO Review this call to add_user_to_blog too - to get here the user must have a role on this blog?
add_user_to_blog ( $first_blog -> userblog_id , $user_id , 'subscriber' );
update_user_meta ( $user_id , 'primary_blog' , $first_blog -> userblog_id );
2010-10-07 15:34:18 -04:00
$primary = $first_blog ;
2010-01-05 23:02:57 -05:00
}
2011-09-27 03:36:36 -04:00
if ( ( ! is_object ( $primary ) ) || ( $primary -> archived == 1 || $primary -> spam == 1 || $primary -> deleted == 1 ) ) {
2010-01-05 23:02:57 -05:00
$blogs = get_blogs_of_user ( $user_id , true ); // if a user's primary blog is shut down, check their other blogs.
$ret = false ;
if ( is_array ( $blogs ) && count ( $blogs ) > 0 ) {
2010-01-19 12:01:39 -05:00
foreach ( ( array ) $blogs as $blog_id => $blog ) {
2010-01-05 23:02:57 -05:00
if ( $blog -> site_id != $wpdb -> siteid )
continue ;
$details = get_blog_details ( $blog_id );
if ( is_object ( $details ) && $details -> archived == 0 && $details -> spam == 0 && $details -> deleted == 0 ) {
$ret = $blog ;
2010-10-07 15:34:18 -04:00
if ( get_user_meta ( $user_id , 'primary_blog' , true ) != $blog_id )
2010-02-22 16:25:32 -05:00
update_user_meta ( $user_id , 'primary_blog' , $blog_id );
2010-10-07 15:34:18 -04:00
if ( ! get_user_meta ( $user_id , 'source_domain' , true ) )
2010-02-22 16:25:32 -05:00
update_user_meta ( $user_id , 'source_domain' , $blog -> domain );
2010-01-05 23:02:57 -05:00
break ;
}
}
} else {
2010-10-07 15:34:18 -04:00
return null ;
2010-01-05 23:02:57 -05:00
}
return $ret ;
} else {
2010-10-07 15:34:18 -04:00
return $primary ;
2010-01-05 23:02:57 -05:00
}
}
2010-09-29 19:44:34 -04:00
/**
* The number of active users in your installation .
*
2010-10-20 16:22:14 -04:00
* The count is cached and updated twice daily . This is not a live count .
2010-09-29 19:44:34 -04:00
*
* @ since MU 2.7
*
* @ return int
*/
2010-01-05 23:02:57 -05:00
function get_user_count () {
2010-10-20 16:22:14 -04:00
return get_site_option ( 'user_count' );
2010-01-05 23:02:57 -05:00
}
2010-09-29 19:44:34 -04:00
/**
* The number of active sites on your installation .
*
2010-10-20 16:22:14 -04:00
* The count is cached and updated twice daily . This is not a live count .
2010-09-29 19:44:34 -04:00
*
* @ since MU 1.0
*
* @ param int $id Optional . A site_id .
* @ return int
*/
2010-01-05 23:02:57 -05:00
function get_blog_count ( $id = 0 ) {
2010-10-20 16:22:14 -04:00
return get_site_option ( 'blog_count' );
2010-01-05 23:02:57 -05:00
}
2010-09-29 19:44:34 -04:00
/**
* Get a blog post from any site on the network .
*
* @ since MU 1.0
*
* @ param int $blog_id ID of the blog .
* @ param int $post_id ID of the post you ' re looking for .
2012-08-27 12:22:45 -04:00
* @ return WP_Post | null WP_Post on success or null on failure
2010-09-29 19:44:34 -04:00
*/
2010-01-05 23:02:57 -05:00
function get_blog_post ( $blog_id , $post_id ) {
2012-08-27 12:22:45 -04:00
switch_to_blog ( $blog_id );
$post = get_post ( $post_id );
restore_current_blog ();
2010-01-05 23:02:57 -05:00
return $post ;
}
2010-09-29 19:44:34 -04:00
/**
* Add a user to a blog .
*
* Use the 'add_user_to_blog' action to fire an event when
* users are added to a blog .
*
* @ since MU 1.0
*
* @ param int $blog_id ID of the blog you ' re adding the user to .
* @ param int $user_id ID of the user you ' re adding .
* @ param string $role The role you want the user to have
* @ return bool
*/
2010-01-05 23:02:57 -05:00
function add_user_to_blog ( $blog_id , $user_id , $role ) {
switch_to_blog ( $blog_id );
2012-08-02 21:06:05 -04:00
$user = get_userdata ( $user_id );
2010-01-05 23:02:57 -05:00
2012-08-02 21:06:05 -04:00
if ( ! $user ) {
2011-02-02 19:17:30 -05:00
restore_current_blog ();
2010-01-05 23:02:57 -05:00
return new WP_Error ( 'user_does_not_exist' , __ ( 'That user does not exist.' ));
2011-02-02 19:17:30 -05:00
}
2010-01-05 23:02:57 -05:00
2010-02-23 05:42:40 -05:00
if ( ! get_user_meta ( $user_id , 'primary_blog' , true ) ) {
2010-02-22 16:25:32 -05:00
update_user_meta ( $user_id , 'primary_blog' , $blog_id );
2010-01-05 23:02:57 -05:00
$details = get_blog_details ( $blog_id );
2010-02-22 16:25:32 -05:00
update_user_meta ( $user_id , 'source_domain' , $details -> domain );
2010-01-05 23:02:57 -05:00
}
$user -> set_role ( $role );
do_action ( 'add_user_to_blog' , $user_id , $role , $blog_id );
wp_cache_delete ( $user_id , 'users' );
restore_current_blog ();
return true ;
}
2010-09-29 19:44:34 -04:00
/**
* Remove a user from a blog .
*
* Use the 'remove_user_from_blog' action to fire an event when
* users are removed from a blog .
*
2010-10-19 03:48:22 -04:00
* Accepts an optional $reassign parameter , if you want to
2010-09-29 19:44:34 -04:00
* reassign the user ' s blog posts to another user upon removal .
*
* @ since MU 1.0
*
* @ param int $user_id ID of the user you ' re removing .
* @ param int $blog_id ID of the blog you ' re removing the user from .
* @ param string $reassign Optional . A user to whom to reassign posts .
* @ return bool
*/
2010-01-05 23:02:57 -05:00
function remove_user_from_blog ( $user_id , $blog_id = '' , $reassign = '' ) {
global $wpdb ;
switch_to_blog ( $blog_id );
$user_id = ( int ) $user_id ;
do_action ( 'remove_user_from_blog' , $user_id , $blog_id );
// If being removed from the primary blog, set a new primary if the user is assigned
// to multiple blogs.
2010-02-23 05:42:40 -05:00
$primary_blog = get_user_meta ( $user_id , 'primary_blog' , true );
2010-01-05 23:02:57 -05:00
if ( $primary_blog == $blog_id ) {
$new_id = '' ;
$new_domain = '' ;
$blogs = get_blogs_of_user ( $user_id );
foreach ( ( array ) $blogs as $blog ) {
if ( $blog -> userblog_id == $blog_id )
continue ;
$new_id = $blog -> userblog_id ;
$new_domain = $blog -> domain ;
break ;
}
2010-02-22 16:25:32 -05:00
update_user_meta ( $user_id , 'primary_blog' , $new_id );
update_user_meta ( $user_id , 'source_domain' , $new_domain );
2010-01-05 23:02:57 -05:00
}
// wp_revoke_user($user_id);
2012-08-02 21:06:05 -04:00
$user = get_userdata ( $user_id );
if ( ! $user ) {
2011-02-02 19:17:30 -05:00
restore_current_blog ();
2010-07-13 17:27:05 -04:00
return new WP_Error ( 'user_does_not_exist' , __ ( 'That user does not exist.' ));
2011-02-02 19:17:30 -05:00
}
2010-07-13 17:27:05 -04:00
2010-01-05 23:02:57 -05:00
$user -> remove_all_caps ();
$blogs = get_blogs_of_user ( $user_id );
if ( count ( $blogs ) == 0 ) {
2010-02-22 16:25:32 -05:00
update_user_meta ( $user_id , 'primary_blog' , '' );
update_user_meta ( $user_id , 'source_domain' , '' );
2010-01-05 23:02:57 -05:00
}
2010-01-12 13:40:40 -05:00
if ( $reassign != '' ) {
2010-01-05 23:02:57 -05:00
$reassign = ( int ) $reassign ;
$wpdb -> query ( $wpdb -> prepare ( " UPDATE $wpdb->posts SET post_author = %d WHERE post_author = %d " , $reassign , $user_id ) );
$wpdb -> query ( $wpdb -> prepare ( " UPDATE $wpdb->links SET link_owner = %d WHERE link_owner = %d " , $reassign , $user_id ) );
}
restore_current_blog ();
2011-08-04 12:36:50 -04:00
return true ;
2010-01-05 23:02:57 -05:00
}
2010-09-29 19:44:34 -04:00
/**
* Create an empty blog .
*
* @ since MU 1.0
* @ uses install_blog ()
*
* @ param string $domain The new blog ' s domain .
* @ param string $path The new blog ' s path .
2012-01-06 06:42:00 -05:00
* @ param string $weblog_title The new blog ' s title .
* @ param int $site_id Optional . Defaults to 1.
2011-01-04 04:02:38 -05:00
* @ return int The ID of the newly created blog
2010-09-29 19:44:34 -04:00
*/
2010-01-05 23:02:57 -05:00
function create_empty_blog ( $domain , $path , $weblog_title , $site_id = 1 ) {
2010-01-12 13:40:40 -05:00
$domain = addslashes ( $domain );
$weblog_title = addslashes ( $weblog_title );
2010-01-05 23:02:57 -05:00
2010-01-12 13:40:40 -05:00
if ( empty ( $path ) )
2010-01-05 23:02:57 -05:00
$path = '/' ;
// Check if the domain has been used already. We should return an error message.
if ( domain_exists ( $domain , $path , $site_id ) )
2011-09-30 13:18:35 -04:00
return __ ( '<strong>ERROR</strong>: Site URL already taken.' );
2010-01-05 23:02:57 -05:00
2010-07-27 14:02:45 -04:00
// Need to back up wpdb table names, and create a new wp_blogs entry for new blog.
2010-01-05 23:02:57 -05:00
// Need to get blog_id from wp_blogs, and create new table names.
// Must restore table names at the end of function.
if ( ! $blog_id = insert_blog ( $domain , $path , $site_id ) )
2011-09-30 13:18:35 -04:00
return __ ( '<strong>ERROR</strong>: problem creating site entry.' );
2010-01-05 23:02:57 -05:00
switch_to_blog ( $blog_id );
install_blog ( $blog_id );
restore_current_blog ();
return $blog_id ;
}
2010-09-29 19:44:34 -04:00
/**
* Get the permalink for a post on another blog .
*
* @ since MU 1.0
*
2012-08-27 12:22:45 -04:00
* @ param int $blog_id ID of the source blog .
2010-09-29 19:44:34 -04:00
* @ param int $post_id ID of the desired post .
2011-01-04 04:02:38 -05:00
* @ return string The post ' s permalink
2010-09-29 19:44:34 -04:00
*/
2012-08-27 12:22:45 -04:00
function get_blog_permalink ( $blog_id , $post_id ) {
switch_to_blog ( $blog_id );
$link = get_permalink ( $post_id );
restore_current_blog ();
2010-01-05 23:02:57 -05:00
return $link ;
}
2010-09-29 19:44:34 -04:00
/**
* Get a blog ' s numeric ID from its URL .
*
* On a subdirectory installation like example . com / blog1 / ,
* $domain will be the root 'example.com' and $path the
* subdirectory '/blog1/' . With subdomains like blog1 . example . com ,
* $domain is 'blog1.example.com' and $path is '/' .
*
* @ since MU 2.6 . 5
*
* @ param string $domain
* @ param string $path Optional . Not required for subdomain installations .
2011-01-04 04:02:38 -05:00
* @ return int
2010-09-29 19:44:34 -04:00
*/
2010-01-05 23:02:57 -05:00
function get_blog_id_from_url ( $domain , $path = '/' ) {
global $wpdb ;
$domain = strtolower ( $wpdb -> escape ( $domain ) );
$path = strtolower ( $wpdb -> escape ( $path ) );
$id = wp_cache_get ( md5 ( $domain . $path ), 'blog-id-cache' );
2010-01-12 13:40:40 -05:00
if ( $id == - 1 ) { // blog does not exist
2010-01-05 23:02:57 -05:00
return 0 ;
2010-01-12 13:40:40 -05:00
} elseif ( $id ) {
2010-01-05 23:02:57 -05:00
return ( int ) $id ;
}
$id = $wpdb -> get_var ( " SELECT blog_id FROM $wpdb->blogs WHERE domain = ' $domain ' and path = ' $path ' /* get_blog_id_from_url */ " );
if ( ! $id ) {
wp_cache_set ( md5 ( $domain . $path ), - 1 , 'blog-id-cache' );
return false ;
}
wp_cache_set ( md5 ( $domain . $path ), $id , 'blog-id-cache' );
return $id ;
}
2011-01-04 04:02:38 -05:00
// Admin functions
2010-01-05 23:02:57 -05:00
2011-01-04 04:02:38 -05:00
/**
* Checks an email address against a list of banned domains .
*
* This function checks against the Banned Email Domains list
* at wp - admin / network / settings . php . The check is only run on
* self - registrations ; user creation at wp - admin / network / users . php
2011-01-05 23:11:14 -05:00
* bypasses this check .
2011-01-04 04:02:38 -05:00
*
* @ since MU
*
* @ param string $user_email The email provided by the user at registration .
* @ return bool Returns true when the email address is banned .
*/
2010-01-05 23:02:57 -05:00
function is_email_address_unsafe ( $user_email ) {
2010-04-24 13:49:08 -04:00
$banned_names = get_site_option ( 'banned_email_domains' );
2010-01-12 13:40:40 -05:00
if ( $banned_names && ! is_array ( $banned_names ))
2010-01-06 23:27:46 -05:00
$banned_names = explode ( " \n " , $banned_names );
2010-01-12 13:40:40 -05:00
2010-01-05 23:02:57 -05:00
if ( is_array ( $banned_names ) && empty ( $banned_names ) == false ) {
$email_domain = strtolower ( substr ( $user_email , 1 + strpos ( $user_email , '@' ) ) );
2010-01-19 12:01:39 -05:00
foreach ( ( array ) $banned_names as $banned_domain ) {
2010-01-12 13:40:40 -05:00
if ( $banned_domain == '' )
2010-01-05 23:02:57 -05:00
continue ;
if (
strstr ( $email_domain , $banned_domain ) ||
(
strstr ( $banned_domain , '/' ) &&
preg_match ( $banned_domain , $email_domain )
)
)
return true ;
}
}
return false ;
}
2011-01-04 04:02:38 -05:00
/**
* Processes new user registrations .
*
* Checks the data provided by the user during signup . Verifies
* the validity and uniqueness of user names and user email addresses ,
* and checks email addresses against admin - provided domain
* whitelists and blacklists .
*
* The hook 'wpmu_validate_user_signup' provides an easy way
* to modify the signup process . The value $result , which is passed
* to the hook , contains both the user - provided info and the error
* messages created by the function . 'wpmu_validate_user_signup' allows
* you to process the data in any way you ' d like , and unset the
* relevant errors if necessary .
*
* @ since MU
* @ uses is_email_address_unsafe ()
* @ uses username_exists ()
* @ uses email_exists ()
*
* @ param string $user_name The login name provided by the user .
* @ param string $user_email The email provided by the user .
* @ return array Contains username , email , and error messages .
*/
2010-01-05 23:02:57 -05:00
function wpmu_validate_user_signup ( $user_name , $user_email ) {
global $wpdb ;
$errors = new WP_Error ();
2010-04-29 12:05:33 -04:00
$orig_username = $user_name ;
2010-04-24 13:49:08 -04:00
$user_name = preg_replace ( '/\s+/' , '' , sanitize_user ( $user_name , true ) );
2010-04-29 12:05:33 -04:00
2012-02-07 12:44:29 -05:00
if ( $user_name != $orig_username || preg_match ( '/[^a-z0-9]/' , $user_name ) ) {
2010-09-07 13:52:43 -04:00
$errors -> add ( 'user_name' , __ ( 'Only lowercase letters (a-z) and numbers are allowed.' ) );
2010-04-29 12:05:33 -04:00
$user_name = $orig_username ;
}
2010-01-05 23:02:57 -05:00
$user_email = sanitize_email ( $user_email );
if ( empty ( $user_name ) )
2012-04-11 16:41:59 -04:00
$errors -> add ( 'user_name' , __ ( 'Please enter a username.' ) );
2010-01-05 23:02:57 -05:00
2010-04-24 13:49:08 -04:00
$illegal_names = get_site_option ( 'illegal_names' );
2010-01-12 13:40:40 -05:00
if ( is_array ( $illegal_names ) == false ) {
2010-04-24 13:49:08 -04:00
$illegal_names = array ( 'www' , 'web' , 'root' , 'admin' , 'main' , 'invite' , 'administrator' );
add_site_option ( 'illegal_names' , $illegal_names );
2010-01-05 23:02:57 -05:00
}
2010-01-12 13:40:40 -05:00
if ( in_array ( $user_name , $illegal_names ) == true )
2012-04-11 16:41:59 -04:00
$errors -> add ( 'user_name' , __ ( 'That username is not allowed.' ) );
2010-01-05 23:02:57 -05:00
2010-01-12 13:40:40 -05:00
if ( is_email_address_unsafe ( $user_email ) )
2010-04-24 13:49:08 -04:00
$errors -> add ( 'user_email' , __ ( 'You cannot use that email address to signup. We are having problems with them blocking some of our email. Please use another email provider.' ));
2010-01-05 23:02:57 -05:00
2010-01-12 13:40:40 -05:00
if ( strlen ( $user_name ) < 4 )
2012-04-11 16:41:59 -04:00
$errors -> add ( 'user_name' , __ ( 'Username must be at least 4 characters.' ) );
2010-01-05 23:02:57 -05:00
2010-04-24 13:49:08 -04:00
if ( strpos ( ' ' . $user_name , '_' ) != false )
2010-04-11 06:41:54 -04:00
$errors -> add ( 'user_name' , __ ( 'Sorry, usernames may not contain the character “_”!' ) );
2010-01-05 23:02:57 -05:00
// all numeric?
$match = array ();
preg_match ( '/[0-9]*/' , $user_name , $match );
if ( $match [ 0 ] == $user_name )
2010-04-24 13:49:08 -04:00
$errors -> add ( 'user_name' , __ ( 'Sorry, usernames must have letters too!' ));
2010-01-05 23:02:57 -05:00
if ( ! is_email ( $user_email ) )
2012-04-11 16:41:59 -04:00
$errors -> add ( 'user_email' , __ ( 'Please enter a correct email address.' ) );
2010-01-05 23:02:57 -05:00
$limited_email_domains = get_site_option ( 'limited_email_domains' );
if ( is_array ( $limited_email_domains ) && empty ( $limited_email_domains ) == false ) {
$emaildomain = substr ( $user_email , 1 + strpos ( $user_email , '@' ) );
2010-01-12 13:40:40 -05:00
if ( in_array ( $emaildomain , $limited_email_domains ) == false )
2010-04-24 13:49:08 -04:00
$errors -> add ( 'user_email' , __ ( 'Sorry, that email address is not allowed!' ));
2010-01-05 23:02:57 -05:00
}
// Check if the username has been used already.
if ( username_exists ( $user_name ) )
2010-04-24 13:49:08 -04:00
$errors -> add ( 'user_name' , __ ( 'Sorry, that username already exists!' ));
2010-01-05 23:02:57 -05:00
// Check if the email address has been used already.
if ( email_exists ( $user_email ) )
2010-04-24 13:49:08 -04:00
$errors -> add ( 'user_email' , __ ( 'Sorry, that email address is already used!' ));
2010-01-05 23:02:57 -05:00
// Has someone already signed up for this username?
$signup = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->signups WHERE user_login = %s " , $user_name ) );
if ( $signup != null ) {
$registered_at = mysql2date ( 'U' , $signup -> registered );
$now = current_time ( 'timestamp' , true );
$diff = $now - $registered_at ;
// If registered more than two days ago, cancel registration and let this signup go through.
2010-01-12 13:40:40 -05:00
if ( $diff > 172800 )
2012-03-24 11:24:31 -04:00
$wpdb -> delete ( $wpdb -> signups , array ( 'user_login' => $user_name ) );
2010-01-12 13:40:40 -05:00
else
2010-04-24 13:49:08 -04:00
$errors -> add ( 'user_name' , __ ( 'That username is currently reserved but may be available in a couple of days.' ));
2010-01-12 13:40:40 -05:00
if ( $signup -> active == 0 && $signup -> user_email == $user_email )
2010-04-24 13:49:08 -04:00
$errors -> add ( 'user_email_used' , __ ( 'username and email used' ));
2010-01-05 23:02:57 -05:00
}
$signup = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->signups WHERE user_email = %s " , $user_email ) );
if ( $signup != null ) {
$diff = current_time ( 'timestamp' , true ) - mysql2date ( 'U' , $signup -> registered );
// If registered more than two days ago, cancel registration and let this signup go through.
2010-01-12 13:40:40 -05:00
if ( $diff > 172800 )
2012-03-24 11:24:31 -04:00
$wpdb -> delete ( $wpdb -> signups , array ( 'user_email' => $user_email ) );
2010-01-12 13:40:40 -05:00
else
2010-04-24 13:49:08 -04:00
$errors -> add ( 'user_email' , __ ( 'That email address has already been used. Please check your inbox for an activation email. It will become available in a couple of days if you do nothing.' ));
2010-01-05 23:02:57 -05:00
}
2010-04-29 12:05:33 -04:00
$result = array ( 'user_name' => $user_name , 'orig_username' => $orig_username , 'user_email' => $user_email , 'errors' => $errors );
2010-01-05 23:02:57 -05:00
return apply_filters ( 'wpmu_validate_user_signup' , $result );
}
2011-01-04 04:02:38 -05:00
/**
* Processes new site registrations .
*
* Checks the data provided by the user during blog signup . Verifies
* the validity and uniqueness of blog paths and domains .
*
* This function prevents the current user from registering a new site
* with a blogname equivalent to another user ' s login name . Passing the
* $user parameter to the function , where $user is the other user , is
* effectively an override of this limitation .
*
2011-01-05 23:11:14 -05:00
* Filter 'wpmu_validate_blog_signup' if you want to modify
2011-01-04 04:02:38 -05:00
* the way that WordPress validates new site signups .
*
* @ since MU
* @ uses domain_exists ()
* @ uses username_exists ()
*
* @ param string $blogname The blog name provided by the user . Must be unique .
* @ param string $blog_title The blog title provided by the user .
* @ return array Contains the new site data and error messages .
*/
2010-01-05 23:02:57 -05:00
function wpmu_validate_blog_signup ( $blogname , $blog_title , $user = '' ) {
global $wpdb , $domain , $base , $current_site ;
$blog_title = strip_tags ( $blog_title );
$blog_title = substr ( $blog_title , 0 , 50 );
$errors = new WP_Error ();
2010-04-24 13:49:08 -04:00
$illegal_names = get_site_option ( 'illegal_names' );
2010-01-12 13:40:40 -05:00
if ( $illegal_names == false ) {
2010-04-24 13:49:08 -04:00
$illegal_names = array ( 'www' , 'web' , 'root' , 'admin' , 'main' , 'invite' , 'administrator' );
add_site_option ( 'illegal_names' , $illegal_names );
2010-01-05 23:02:57 -05:00
}
2010-05-25 23:13:16 -04:00
// On sub dir installs, Some names are so illegal, only a filter can spring them from jail
if ( ! is_subdomain_install () )
$illegal_names = array_merge ( $illegal_names , apply_filters ( 'subdirectory_reserved_names' , array ( 'page' , 'comments' , 'blog' , 'files' , 'feed' ) ) );
2010-01-05 23:02:57 -05:00
if ( empty ( $blogname ) )
2012-04-11 16:41:59 -04:00
$errors -> add ( 'blogname' , __ ( 'Please enter a site name.' ) );
2010-01-05 23:02:57 -05:00
2011-08-10 15:18:18 -04:00
if ( preg_match ( '/[^a-z0-9]+/' , $blogname ) )
2012-04-11 16:41:59 -04:00
$errors -> add ( 'blogname' , __ ( 'Only lowercase letters and numbers allowed.' ) );
2010-01-12 13:40:40 -05:00
if ( in_array ( $blogname , $illegal_names ) == true )
2012-04-11 16:41:59 -04:00
$errors -> add ( 'blogname' , __ ( 'That name is not allowed.' ) );
2010-01-12 13:40:40 -05:00
if ( strlen ( $blogname ) < 4 && ! is_super_admin () )
2012-04-11 16:41:59 -04:00
$errors -> add ( 'blogname' , __ ( 'Site name must be at least 4 characters.' ) );
2010-01-05 23:02:57 -05:00
2010-04-24 13:49:08 -04:00
if ( strpos ( ' ' . $blogname , '_' ) != false )
2010-04-29 23:17:49 -04:00
$errors -> add ( 'blogname' , __ ( 'Sorry, site names may not contain the character “_”!' ) );
2010-01-05 23:02:57 -05:00
// do not allow users to create a blog that conflicts with a page on the main blog.
2010-01-12 13:40:40 -05:00
if ( ! is_subdomain_install () && $wpdb -> get_var ( $wpdb -> prepare ( " SELECT post_name FROM " . $wpdb -> get_blog_prefix ( $current_site -> blog_id ) . " posts WHERE post_type = 'page' AND post_name = %s " , $blogname ) ) )
2010-04-29 23:17:49 -04:00
$errors -> add ( 'blogname' , __ ( 'Sorry, you may not use that site name.' ) );
2010-01-05 23:02:57 -05:00
// all numeric?
$match = array ();
preg_match ( '/[0-9]*/' , $blogname , $match );
if ( $match [ 0 ] == $blogname )
2010-04-29 23:17:49 -04:00
$errors -> add ( 'blogname' , __ ( 'Sorry, site names must have letters too!' ));
2010-01-05 23:02:57 -05:00
2010-04-24 13:49:08 -04:00
$blogname = apply_filters ( 'newblogname' , $blogname );
2010-01-05 23:02:57 -05:00
$blog_title = stripslashes ( $blog_title );
if ( empty ( $blog_title ) )
2012-04-11 16:41:59 -04:00
$errors -> add ( 'blog_title' , __ ( 'Please enter a site title.' ) );
2010-01-05 23:02:57 -05:00
// Check if the domain/path has been used already.
2010-01-12 13:40:40 -05:00
if ( is_subdomain_install () ) {
2010-05-28 20:32:10 -04:00
$mydomain = $blogname . '.' . preg_replace ( '|^www\.|' , '' , $domain );
2010-01-05 23:02:57 -05:00
$path = $base ;
} else {
$mydomain = " $domain " ;
$path = $base . $blogname . '/' ;
}
2012-09-15 15:29:59 -04:00
if ( domain_exists ( $mydomain , $path , $current_site -> id ) )
2010-04-29 23:17:49 -04:00
$errors -> add ( 'blogname' , __ ( 'Sorry, that site already exists!' ));
2010-01-05 23:02:57 -05:00
if ( username_exists ( $blogname ) ) {
if ( is_object ( $user ) == false || ( is_object ( $user ) && ( $user -> user_login != $blogname ) ) )
2010-04-29 23:17:49 -04:00
$errors -> add ( 'blogname' , __ ( 'Sorry, that site is reserved!' ) );
2010-01-05 23:02:57 -05:00
}
// Has someone already signed up for this domain?
$signup = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->signups WHERE domain = %s AND path = %s " , $mydomain , $path ) ); // TODO: Check email too?
if ( ! empty ( $signup ) ) {
$diff = current_time ( 'timestamp' , true ) - mysql2date ( 'U' , $signup -> registered );
// If registered more than two days ago, cancel registration and let this signup go through.
2010-01-12 13:40:40 -05:00
if ( $diff > 172800 )
2012-03-24 11:24:31 -04:00
$wpdb -> delete ( $wpdb -> signups , array ( 'domain' => $mydomain , 'path' => $path ) );
2010-01-12 13:40:40 -05:00
else
2010-04-29 23:17:49 -04:00
$errors -> add ( 'blogname' , __ ( 'That site is currently reserved but may be available in a couple days.' ));
2010-01-05 23:02:57 -05:00
}
2012-09-15 16:05:58 -04:00
$result = array ( 'domain' => $mydomain , 'path' => $path , 'blogname' => $blogname , 'blog_title' => $blog_title , 'user' => $user , 'errors' => $errors );
2010-01-05 23:02:57 -05:00
return apply_filters ( 'wpmu_validate_blog_signup' , $result );
}
2011-01-04 04:02:38 -05:00
/**
* Record site signup information for future activation .
*
* @ since MU
* @ uses wpmu_signup_blog_notification ()
*
* @ param string $domain The requested domain .
* @ param string $path The requested path .
* @ param string $title The requested site title .
* @ param string $user The user ' s requested login name .
* @ param string $user_email The user ' s email address .
* @ param array $meta By default , contains the requested privacy setting and lang_id .
*/
2010-01-05 23:02:57 -05:00
function wpmu_signup_blog ( $domain , $path , $title , $user , $user_email , $meta = '' ) {
global $wpdb ;
$key = substr ( md5 ( time () . rand () . $domain ), 0 , 16 );
$meta = serialize ( $meta );
$domain = $wpdb -> escape ( $domain );
$path = $wpdb -> escape ( $path );
$title = $wpdb -> escape ( $title );
2010-01-06 23:27:46 -05:00
2010-01-05 23:02:57 -05:00
$wpdb -> insert ( $wpdb -> signups , array (
2010-01-06 23:27:46 -05:00
'domain' => $domain ,
'path' => $path ,
2010-01-05 23:02:57 -05:00
'title' => $title ,
2010-01-06 23:27:46 -05:00
'user_login' => $user ,
'user_email' => $user_email ,
2010-01-05 23:02:57 -05:00
'registered' => current_time ( 'mysql' , true ),
2010-01-06 23:27:46 -05:00
'activation_key' => $key ,
2010-01-05 23:02:57 -05:00
'meta' => $meta
) );
wpmu_signup_blog_notification ( $domain , $path , $title , $user , $user_email , $key , $meta );
}
2011-01-04 04:02:38 -05:00
/**
* Record user signup information for future activation .
*
* This function is used when user registration is open but
* new site registration is not .
*
* @ since MU
* @ uses wpmu_signup_user_notification ()
*
* @ param string $user The user ' s requested login name .
* @ param string $user_email The user ' s email address .
* @ param array $meta By default , this is an empty array .
*/
2010-01-05 23:02:57 -05:00
function wpmu_signup_user ( $user , $user_email , $meta = '' ) {
global $wpdb ;
// Format data
2010-04-24 13:49:08 -04:00
$user = preg_replace ( '/\s+/' , '' , sanitize_user ( $user , true ) );
2010-01-05 23:02:57 -05:00
$user_email = sanitize_email ( $user_email );
$key = substr ( md5 ( time () . rand () . $user_email ), 0 , 16 );
$meta = serialize ( $meta );
2010-01-06 23:27:46 -05:00
2010-01-05 23:02:57 -05:00
$wpdb -> insert ( $wpdb -> signups , array (
2010-01-06 23:27:46 -05:00
'domain' => '' ,
'path' => '' ,
2010-01-05 23:02:57 -05:00
'title' => '' ,
2010-01-06 23:27:46 -05:00
'user_login' => $user ,
'user_email' => $user_email ,
2010-01-05 23:02:57 -05:00
'registered' => current_time ( 'mysql' , true ),
2010-01-06 23:27:46 -05:00
'activation_key' => $key ,
2010-01-05 23:02:57 -05:00
'meta' => $meta
) );
wpmu_signup_user_notification ( $user , $user_email , $key , $meta );
}
2011-01-04 04:02:38 -05:00
/**
* Notify user of signup success .
*
* This is the notification function used when site registration
* is enabled .
*
* Filter 'wpmu_signup_blog_notification' to bypass this function or
* replace it with your own notification behavior .
*
* Filter 'wpmu_signup_blog_notification_email' and
2011-09-24 15:37:34 -04:00
* 'wpmu_signup_blog_notification_subject' to change the content
2011-01-04 04:02:38 -05:00
* and subject line of the email sent to newly registered users .
*
* @ since MU
*
* @ param string $domain The new blog domain .
* @ param string $path The new blog path .
* @ param string $title The site title .
* @ param string $user The user ' s login name .
* @ param string $user_email The user ' s email address .
* @ param array $meta By default , contains the requested privacy setting and lang_id .
* @ param string $key The activation key created in wpmu_signup_blog ()
* @ return bool
*/
2010-01-05 23:02:57 -05:00
function wpmu_signup_blog_notification ( $domain , $path , $title , $user , $user_email , $key , $meta = '' ) {
global $current_site ;
2010-01-12 13:40:40 -05:00
if ( ! apply_filters ( 'wpmu_signup_blog_notification' , $domain , $path , $title , $user , $user_email , $key , $meta ) )
2010-01-05 23:02:57 -05:00
return false ;
// Send email with activation link.
2010-01-12 13:40:40 -05:00
if ( ! is_subdomain_install () || $current_site -> id != 1 )
2010-03-29 17:45:31 -04:00
$activate_url = network_site_url ( " wp-activate.php?key= $key " );
2010-01-12 13:40:40 -05:00
else
2010-03-29 17:45:31 -04:00
$activate_url = " http:// { $domain } { $path } wp-activate.php?key= $key " ; // @todo use *_url() API
2010-01-12 13:40:40 -05:00
2010-02-04 13:57:32 -05:00
$activate_url = esc_url ( $activate_url );
2010-04-24 13:49:08 -04:00
$admin_email = get_site_option ( 'admin_email' );
2010-01-12 13:40:40 -05:00
if ( $admin_email == '' )
2010-01-05 23:02:57 -05:00
$admin_email = 'support@' . $_SERVER [ 'SERVER_NAME' ];
2010-04-24 13:49:08 -04:00
$from_name = get_site_option ( 'site_name' ) == '' ? 'WordPress' : esc_html ( get_site_option ( 'site_name' ) );
2010-04-10 08:11:03 -04:00
$message_headers = " From: \" { $from_name } \" < { $admin_email } > \n " . " Content-Type: text/plain; charset= \" " . get_option ( 'blog_charset' ) . " \" \n " ;
2010-08-31 14:19:15 -04:00
$message = sprintf (
apply_filters ( 'wpmu_signup_blog_notification_email' ,
__ ( " To activate your blog, please click the following link: \n \n %s \n \n After you activate, you will receive *another email* with your login. \n \n After you activate, you can visit your site here: \n \n %s " ),
$domain , $path , $title , $user , $user_email , $key , $meta
),
$activate_url ,
esc_url ( " http:// { $domain } { $path } " ),
$key
);
2010-01-05 23:02:57 -05:00
// TODO: Don't hard code activation link.
2010-08-31 14:19:15 -04:00
$subject = sprintf (
apply_filters ( 'wpmu_signup_blog_notification_subject' ,
__ ( '[%1$s] Activate %2$s' ),
$domain , $path , $title , $user , $user_email , $key , $meta
),
$from_name ,
esc_url ( 'http://' . $domain . $path )
);
2010-01-05 23:02:57 -05:00
wp_mail ( $user_email , $subject , $message , $message_headers );
return true ;
}
2011-01-04 04:02:38 -05:00
/**
* Notify user of signup success .
*
* This is the notification function used when no new site has
* been requested .
*
* Filter 'wpmu_signup_user_notification' to bypass this function or
* replace it with your own notification behavior .
*
* Filter 'wpmu_signup_user_notification_email' and
* 'wpmu_signup_user_notification_subject' to change the content
* and subject line of the email sent to newly registered users .
*
* @ since MU
*
* @ param string $user The user ' s login name .
* @ param string $user_email The user ' s email address .
* @ param array $meta By default , an empty array .
* @ param string $key The activation key created in wpmu_signup_user ()
* @ return bool
*/
2010-01-05 23:02:57 -05:00
function wpmu_signup_user_notification ( $user , $user_email , $key , $meta = '' ) {
2010-01-12 13:40:40 -05:00
if ( ! apply_filters ( 'wpmu_signup_user_notification' , $user , $user_email , $key , $meta ) )
2010-01-05 23:02:57 -05:00
return false ;
// Send email with activation link.
2010-04-24 13:49:08 -04:00
$admin_email = get_site_option ( 'admin_email' );
2010-01-12 13:40:40 -05:00
if ( $admin_email == '' )
2010-01-05 23:02:57 -05:00
$admin_email = 'support@' . $_SERVER [ 'SERVER_NAME' ];
2010-04-24 13:49:08 -04:00
$from_name = get_site_option ( 'site_name' ) == '' ? 'WordPress' : esc_html ( get_site_option ( 'site_name' ) );
2010-04-10 08:11:03 -04:00
$message_headers = " From: \" { $from_name } \" < { $admin_email } > \n " . " Content-Type: text/plain; charset= \" " . get_option ( 'blog_charset' ) . " \" \n " ;
2010-08-31 14:19:15 -04:00
$message = sprintf (
apply_filters ( 'wpmu_signup_user_notification_email' ,
__ ( " To activate your user, please click the following link: \n \n %s \n \n After you activate, you will receive *another email* with your login. \n \n " ),
$user , $user_email , $key , $meta
),
2011-05-23 01:43:07 -04:00
site_url ( " wp-activate.php?key= $key " )
2010-08-31 14:19:15 -04:00
);
2010-01-05 23:02:57 -05:00
// TODO: Don't hard code activation link.
2010-08-31 14:19:15 -04:00
$subject = sprintf (
apply_filters ( 'wpmu_signup_user_notification_subject' ,
__ ( '[%1$s] Activate %2$s' ),
$user , $user_email , $key , $meta
),
$from_name ,
$user
);
2010-01-05 23:02:57 -05:00
wp_mail ( $user_email , $subject , $message , $message_headers );
return true ;
}
2011-01-04 04:02:38 -05:00
/**
* Activate a signup .
*
* Hook to 'wpmu_activate_user' or 'wpmu_activate_blog' for events
* that should happen only when users or sites are self - created ( since
* those actions are not called when users and sites are created
* by a Super Admin ) .
*
* @ since MU
* @ uses wp_generate_password ()
* @ uses wpmu_welcome_user_notification ()
* @ uses add_user_to_blog ()
* @ uses add_new_user_to_blog ()
* @ uses wpmu_create_user ()
* @ uses wpmu_create_blog ()
* @ uses wpmu_welcome_notification ()
*
* @ param string $key The activation key provided to the user .
* @ return array An array containing information about the activated user and / or blog
*/
2010-01-05 23:02:57 -05:00
function wpmu_activate_signup ( $key ) {
global $wpdb , $current_site ;
$signup = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->signups WHERE activation_key = %s " , $key ) );
2010-12-15 12:09:26 -05:00
if ( empty ( $signup ) )
return new WP_Error ( 'invalid_key' , __ ( 'Invalid activation key.' ) );
2010-01-05 23:02:57 -05:00
2010-12-15 12:09:26 -05:00
if ( $signup -> active ) {
if ( empty ( $signup -> domain ) )
return new WP_Error ( 'already_active' , __ ( 'The user is already active.' ), $signup );
else
return new WP_Error ( 'already_active' , __ ( 'The site is already active.' ), $signup );
}
2010-01-05 23:02:57 -05:00
2012-04-27 11:57:51 -04:00
$meta = maybe_unserialize ( $signup -> meta );
2010-01-05 23:02:57 -05:00
$user_login = $wpdb -> escape ( $signup -> user_login );
$user_email = $wpdb -> escape ( $signup -> user_email );
2010-11-10 18:31:54 -05:00
$password = wp_generate_password ( 12 , false );
2010-01-05 23:02:57 -05:00
$user_id = username_exists ( $user_login );
if ( ! $user_id )
$user_id = wpmu_create_user ( $user_login , $password , $user_email );
else
$user_already_exists = true ;
if ( ! $user_id )
return new WP_Error ( 'create_user' , __ ( 'Could not create user' ), $signup );
$now = current_time ( 'mysql' , true );
if ( empty ( $signup -> domain ) ) {
$wpdb -> update ( $wpdb -> signups , array ( 'active' => 1 , 'activated' => $now ), array ( 'activation_key' => $key ) );
2010-01-12 13:40:40 -05:00
2010-01-05 23:02:57 -05:00
if ( isset ( $user_already_exists ) )
return new WP_Error ( 'user_already_exists' , __ ( 'That username is already activated.' ), $signup );
2010-01-12 13:40:40 -05:00
2010-01-05 23:02:57 -05:00
wpmu_welcome_user_notification ( $user_id , $password , $meta );
2010-01-12 13:40:40 -05:00
2010-01-05 23:02:57 -05:00
add_new_user_to_blog ( $user_id , $user_email , $meta );
do_action ( 'wpmu_activate_user' , $user_id , $password , $meta );
return array ( 'user_id' => $user_id , 'password' => $password , 'meta' => $meta );
}
$blog_id = wpmu_create_blog ( $signup -> domain , $signup -> path , $signup -> title , $user_id , $meta , $wpdb -> siteid );
// TODO: What to do if we create a user but cannot create a blog?
if ( is_wp_error ( $blog_id ) ) {
// If blog is taken, that means a previous attempt to activate this blog failed in between creating the blog and
2011-12-13 18:45:31 -05:00
// setting the activation flag. Let's just set the active flag and instruct the user to reset their password.
2010-01-05 23:02:57 -05:00
if ( 'blog_taken' == $blog_id -> get_error_code () ) {
$blog_id -> add_data ( $signup );
$wpdb -> update ( $wpdb -> signups , array ( 'active' => 1 , 'activated' => $now ), array ( 'activation_key' => $key ) );
}
return $blog_id ;
}
$wpdb -> update ( $wpdb -> signups , array ( 'active' => 1 , 'activated' => $now ), array ( 'activation_key' => $key ) );
wpmu_welcome_notification ( $blog_id , $user_id , $password , $signup -> title , $meta );
do_action ( 'wpmu_activate_blog' , $blog_id , $user_id , $password , $signup -> title , $meta );
return array ( 'blog_id' => $blog_id , 'user_id' => $user_id , 'password' => $password , 'title' => $signup -> title , 'meta' => $meta );
}
2011-01-04 04:02:38 -05:00
/**
* Create a user .
*
* This function runs when a user self - registers as well as when
* a Super Admin creates a new user . Hook to 'wpmu_new_user' for events
* that should affect all new users , but only on Multisite ( otherwise
* use 'user_register' ) .
*
* @ since MU
* @ uses wp_create_user ()
*
* @ param string $user_name The new user ' s login name .
* @ param string $password The new user ' s password .
* @ param string $email The new user ' s email address .
* @ return mixed Returns false on failure , or int $user_id on success
*/
2010-01-05 23:02:57 -05:00
function wpmu_create_user ( $user_name , $password , $email ) {
2010-04-24 13:49:08 -04:00
$user_name = preg_replace ( '/\s+/' , '' , sanitize_user ( $user_name , true ) );
2010-01-05 23:02:57 -05:00
2010-01-20 16:58:13 -05:00
$user_id = wp_create_user ( $user_name , $password , $email );
if ( is_wp_error ( $user_id ) )
2010-01-05 23:02:57 -05:00
return false ;
// Newly created users have no roles or caps until they are added to a blog.
2010-04-23 10:25:05 -04:00
delete_user_option ( $user_id , 'capabilities' );
delete_user_option ( $user_id , 'user_level' );
2010-01-05 23:02:57 -05:00
do_action ( 'wpmu_new_user' , $user_id );
return $user_id ;
}
2011-01-04 04:02:38 -05:00
/**
* Create a site .
*
* This function runs when a user self - registers a new site as well
* as when a Super Admin creates a new site . Hook to 'wpmu_new_blog'
* for events that should affect all new sites .
*
* On subdirectory installs , $domain is the same as the main site ' s
* domain , and the path is the subdirectory name ( eg 'example.com'
* and '/blog1/' ) . On subdomain installs , $domain is the new subdomain +
* root domain ( eg 'blog1.example.com' ), and $path is '/' .
*
* @ since MU
* @ uses domain_exists ()
* @ uses insert_blog ()
* @ uses wp_install_defaults ()
* @ uses add_user_to_blog ()
*
* @ param string $domain The new site ' s domain .
* @ param string $path The new site ' s path .
* @ param string $title The new site ' s title .
* @ param int $user_id The user ID of the new site ' s admin .
* @ param array $meta Optional . Used to set initial site options .
* @ param int $site_id Optional . Only relevant on multi - network installs .
* @ return mixed Returns WP_Error object on failure , int $blog_id on success
*/
2010-01-05 23:02:57 -05:00
function wpmu_create_blog ( $domain , $path , $title , $user_id , $meta = '' , $site_id = 1 ) {
2010-12-09 14:29:00 -05:00
$domain = preg_replace ( '/\s+/' , '' , sanitize_user ( $domain , true ) );
2010-01-12 13:40:40 -05:00
if ( is_subdomain_install () )
2010-01-05 23:02:57 -05:00
$domain = str_replace ( '@' , '' , $domain );
2010-01-12 13:40:40 -05:00
2010-01-05 23:02:57 -05:00
$title = strip_tags ( $title );
$user_id = ( int ) $user_id ;
2010-01-12 13:40:40 -05:00
if ( empty ( $path ) )
2010-01-05 23:02:57 -05:00
$path = '/' ;
// Check if the domain has been used already. We should return an error message.
if ( domain_exists ( $domain , $path , $site_id ) )
2010-04-29 23:17:49 -04:00
return new WP_Error ( 'blog_taken' , __ ( 'Site already exists.' ));
2010-01-05 23:02:57 -05:00
2010-04-24 13:49:08 -04:00
if ( ! defined ( 'WP_INSTALLING' ) )
define ( 'WP_INSTALLING' , true );
2010-01-05 23:02:57 -05:00
if ( ! $blog_id = insert_blog ( $domain , $path , $site_id ) )
2010-04-29 23:17:49 -04:00
return new WP_Error ( 'insert_blog' , __ ( 'Could not create site.' ));
2010-01-05 23:02:57 -05:00
switch_to_blog ( $blog_id );
install_blog ( $blog_id , $title );
2010-01-20 15:09:41 -05:00
wp_install_defaults ( $user_id );
2010-01-05 23:02:57 -05:00
add_user_to_blog ( $blog_id , $user_id , 'administrator' );
if ( is_array ( $meta ) ) foreach ( $meta as $key => $value ) {
2010-01-12 13:40:40 -05:00
if ( $key == 'public' || $key == 'archived' || $key == 'mature' || $key == 'spam' || $key == 'deleted' || $key == 'lang_id' )
2010-01-05 23:02:57 -05:00
update_blog_status ( $blog_id , $key , $value );
2010-01-12 13:40:40 -05:00
else
2010-01-05 23:02:57 -05:00
update_option ( $key , $value );
}
add_option ( 'WPLANG' , get_site_option ( 'WPLANG' ) );
2010-05-25 12:57:32 -04:00
update_option ( 'blog_public' , ( int ) $meta [ 'public' ] );
2010-01-05 23:02:57 -05:00
2011-11-05 16:23:55 -04:00
if ( ! is_super_admin ( $user_id ) && ! get_user_meta ( $user_id , 'primary_blog' , true ) )
2010-02-22 16:25:32 -05:00
update_user_meta ( $user_id , 'primary_blog' , $blog_id );
2010-01-05 23:02:57 -05:00
restore_current_blog ();
2010-05-24 13:26:21 -04:00
do_action ( 'wpmu_new_blog' , $blog_id , $user_id , $domain , $path , $site_id , $meta );
2010-01-05 23:02:57 -05:00
return $blog_id ;
}
2011-01-04 04:02:38 -05:00
/**
* Notifies the network admin that a new site has been activated .
*
* Filter 'newblog_notify_siteadmin' to change the content of
* the notification email .
*
* @ since MU
*
* @ param int $blog_id The new site ' s ID .
* @ return bool
*/
2010-01-05 23:02:57 -05:00
function newblog_notify_siteadmin ( $blog_id , $deprecated = '' ) {
2010-01-12 13:40:40 -05:00
if ( get_site_option ( 'registrationnotification' ) != 'yes' )
2010-01-05 23:02:57 -05:00
return false ;
2010-01-06 23:27:46 -05:00
2010-01-05 23:02:57 -05:00
$email = get_site_option ( 'admin_email' );
2010-01-12 13:40:40 -05:00
if ( is_email ( $email ) == false )
2010-01-05 23:02:57 -05:00
return false ;
2010-01-06 23:27:46 -05:00
2010-10-21 13:09:15 -04:00
$options_site_url = esc_url ( network_admin_url ( 'settings.php' ));
2010-01-05 23:02:57 -05:00
switch_to_blog ( $blog_id );
$blogname = get_option ( 'blogname' );
2010-03-29 17:45:31 -04:00
$siteurl = site_url ();
2010-01-05 23:02:57 -05:00
restore_current_blog ();
2010-01-06 23:27:46 -05:00
2010-04-29 23:17:49 -04:00
$msg = sprintf ( __ ( ' New Site : % 1 s
2010-01-05 23:02:57 -05:00
URL : % 2 s
Remote IP : % 3 s
2010-04-24 13:49:08 -04:00
Disable these notifications : % 4 s ' ), $blogname, $siteurl, $_SERVER[' REMOTE_ADDR ' ], $options_site_url );
2010-01-05 23:02:57 -05:00
$msg = apply_filters ( 'newblog_notify_siteadmin' , $msg );
2010-01-06 23:27:46 -05:00
2010-04-29 23:17:49 -04:00
wp_mail ( $email , sprintf ( __ ( 'New Site Registration: %s' ), $siteurl ), $msg );
2010-01-05 23:02:57 -05:00
return true ;
}
2011-01-04 04:02:38 -05:00
/**
* Notifies the network admin that a new user has been activated .
*
* Filter 'newuser_notify_siteadmin' to change the content of
* the notification email .
*
* @ since MU
2012-03-02 18:52:19 -05:00
* @ uses apply_filters () Filter newuser_notify_siteadmin to change the content of the email message
2011-01-04 04:02:38 -05:00
*
* @ param int $user_id The new user ' s ID .
* @ return bool
*/
2010-01-05 23:02:57 -05:00
function newuser_notify_siteadmin ( $user_id ) {
2010-01-12 13:40:40 -05:00
if ( get_site_option ( 'registrationnotification' ) != 'yes' )
2010-01-05 23:02:57 -05:00
return false ;
2010-01-06 23:27:46 -05:00
2010-01-05 23:02:57 -05:00
$email = get_site_option ( 'admin_email' );
2010-01-12 13:40:40 -05:00
if ( is_email ( $email ) == false )
2010-01-05 23:02:57 -05:00
return false ;
2010-01-12 13:40:40 -05:00
2012-08-02 21:06:05 -04:00
$user = get_userdata ( $user_id );
2010-01-05 23:02:57 -05:00
2010-10-21 13:09:15 -04:00
$options_site_url = esc_url ( network_admin_url ( 'settings.php' ));
2010-04-24 13:49:08 -04:00
$msg = sprintf ( __ ( ' New User : % 1 s
2010-01-05 23:02:57 -05:00
Remote IP : % 2 s
2010-04-24 13:49:08 -04:00
Disable these notifications : % 3 s '), $user->user_login, $_SERVER[' REMOTE_ADDR ' ], $options_site_url );
2010-01-06 23:27:46 -05:00
2012-03-02 18:52:19 -05:00
$msg = apply_filters ( 'newuser_notify_siteadmin' , $msg , $user );
2010-04-24 13:49:08 -04:00
wp_mail ( $email , sprintf ( __ ( 'New User Registration: %s' ), $user -> user_login ), $msg );
2010-01-05 23:02:57 -05:00
return true ;
}
2011-01-04 04:02:38 -05:00
/**
* Check whether a blogname is already taken .
*
* Used during the new site registration process to ensure
* that each blogname is unique .
*
* @ since MU
*
* @ param string $domain The domain to be checked .
* @ param string $path The path to be checked .
* @ param int $site_id Optional . Relevant only on multi - network installs .
* @ return int
*/
2010-01-05 23:02:57 -05:00
function domain_exists ( $domain , $path , $site_id = 1 ) {
global $wpdb ;
2012-09-27 13:30:34 -04:00
$result = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT blog_id FROM $wpdb->blogs WHERE domain = %s AND path = %s AND site_id = %d " , $domain , $path , $site_id ) );
return apply_filters ( 'domain_exists' , $result , $domain , $path , $site_id );
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Store basic site info in the blogs table .
*
* This function creates a row in the wp_blogs table and returns
* the new blog ' s ID . It is the first step in creating a new blog .
*
* @ since MU
*
* @ param string $domain The domain of the new site .
* @ param string $path The path of the new site .
* @ param int $site_id Unless you ' re running a multi - network install , be sure to set this value to 1.
* @ return int The ID of the new row
*/
2010-01-05 23:02:57 -05:00
function insert_blog ( $domain , $path , $site_id ) {
global $wpdb ;
$path = trailingslashit ( $path );
$site_id = ( int ) $site_id ;
$result = $wpdb -> insert ( $wpdb -> blogs , array ( 'site_id' => $site_id , 'domain' => $domain , 'path' => $path , 'registered' => current_time ( 'mysql' )) );
if ( ! $result )
return false ;
refresh_blog_details ( $wpdb -> insert_id );
return $wpdb -> insert_id ;
}
2011-01-04 04:02:38 -05:00
/**
* Install an empty blog .
*
* Creates the new blog tables and options . If calling this function
* directly , be sure to use switch_to_blog () first , so that $wpdb
* points to the new blog .
*
* @ since MU
* @ uses make_db_current_silent ()
* @ uses populate_roles ()
*
* @ param int $blog_id The value returned by insert_blog () .
* @ param string $blog_title The title of the new site .
*/
2010-01-05 23:02:57 -05:00
function install_blog ( $blog_id , $blog_title = '' ) {
2012-09-11 18:22:20 -04:00
global $wpdb , $wp_roles , $current_site ;
2010-01-05 23:02:57 -05:00
// Cast for security
$blog_id = ( int ) $blog_id ;
2010-01-12 13:40:40 -05:00
require_once ( ABSPATH . 'wp-admin/includes/upgrade.php' );
2010-01-05 23:02:57 -05:00
2012-09-20 09:39:46 -04:00
$wpdb -> suppress_errors ();
if ( $wpdb -> get_results ( " DESCRIBE { $wpdb -> posts } " ) )
2012-09-11 18:22:20 -04:00
die ( __ ( '<h1>Already Installed</h1><p>You appear to have already installed WordPress. To reinstall please clear your old database tables first.</p>' ) . '</body></html>' );
2012-09-20 09:39:46 -04:00
$wpdb -> suppress_errors ( false );
2010-01-05 23:02:57 -05:00
2012-09-11 18:22:20 -04:00
$url = get_blogaddress_by_id ( $blog_id );
2010-01-05 23:02:57 -05:00
// Set everything up
2011-10-05 20:21:24 -04:00
make_db_current_silent ( 'blog' );
2010-01-05 23:02:57 -05:00
populate_options ();
populate_roles ();
$wp_roles -> _init ();
2012-06-28 16:38:16 -04:00
$url = untrailingslashit ( $url );
2010-01-05 23:02:57 -05:00
2012-09-11 18:22:20 -04:00
update_option ( 'siteurl' , $url );
update_option ( 'home' , $url );
2012-03-24 11:24:31 -04:00
2012-09-11 18:22:20 -04:00
if ( get_site_option ( 'ms_files_rewriting' ) )
update_option ( 'upload_path' , UPLOADBLOGSDIR . " / $blog_id /files " );
else
update_option ( 'upload_path' , get_blog_option ( $current_site -> blog_id , 'upload_path' ) );
update_option ( 'blogname' , stripslashes ( $blog_title ) );
update_option ( 'admin_email' , '' );
2010-01-05 23:02:57 -05:00
2012-09-11 18:22:20 -04:00
// remove all perms
$table_prefix = $wpdb -> get_blog_prefix ();
delete_metadata ( 'user' , 0 , $table_prefix . 'user_level' , null , true ); // delete all
delete_metadata ( 'user' , 0 , $table_prefix . 'capabilities' , null , true ); // delete all
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Set blog defaults .
*
* This function creates a row in the wp_blogs table .
*
* @ since MU
* @ deprecated MU
* @ deprecated Use wp_install_defaults ()
* @ uses wp_install_defaults ()
*
* @ param int $blog_id Ignored in this function .
* @ param int $user_id
*/
2010-01-05 23:02:57 -05:00
function install_blog_defaults ( $blog_id , $user_id ) {
2010-01-20 15:09:41 -05:00
global $wpdb ;
2010-01-06 23:27:46 -05:00
2010-01-20 15:09:41 -05:00
require_once ( ABSPATH . 'wp-admin/includes/upgrade.php' );
2010-01-05 23:02:57 -05:00
2010-01-20 15:09:41 -05:00
$wpdb -> suppress_errors ();
2010-01-06 23:27:46 -05:00
2010-01-20 15:09:41 -05:00
wp_install_defaults ( $user_id );
2010-01-05 23:02:57 -05:00
$wpdb -> suppress_errors ( false );
}
2011-01-04 04:02:38 -05:00
/**
* Notify a user that her blog activation has been successful .
*
* Filter 'wpmu_welcome_notification' to disable or bypass .
*
* Filter 'update_welcome_email' and 'update_welcome_subject' to
* modify the content and subject line of the notification email .
*
* @ since MU
*
* @ param int $blog_id
* @ param int $user_id
* @ param string $password
* @ param string $title The new blog ' s title
* @ param array $meta Optional . Not used in the default function , but is passed along to hooks for customization .
* @ return bool
*/
2010-01-05 23:02:57 -05:00
function wpmu_welcome_notification ( $blog_id , $user_id , $password , $title , $meta = '' ) {
global $current_site ;
2010-01-12 13:40:40 -05:00
if ( ! apply_filters ( 'wpmu_welcome_notification' , $blog_id , $user_id , $password , $title , $meta ) )
2010-01-05 23:02:57 -05:00
return false ;
$welcome_email = stripslashes ( get_site_option ( 'welcome_email' ) );
2010-01-12 13:40:40 -05:00
if ( $welcome_email == false )
2010-01-27 14:13:00 -05:00
$welcome_email = stripslashes ( __ ( ' Dear User ,
2010-01-05 23:02:57 -05:00
2010-05-01 03:09:38 -04:00
Your new SITE_NAME site has been successfully set up at :
2010-01-05 23:02:57 -05:00
BLOG_URL
You can log in to the administrator account with the following information :
Username : USERNAME
Password : PASSWORD
2011-06-12 04:00:22 -04:00
Log in here : BLOG_URLwp - login . php
2010-01-05 23:02:57 -05:00
2011-06-12 04:00:22 -04:00
We hope you enjoy your new site . Thanks !
2010-01-05 23:02:57 -05:00
2010-01-27 14:13:00 -05:00
-- The Team @ SITE_NAME ' ) );
2010-01-05 23:02:57 -05:00
$url = get_blogaddress_by_id ( $blog_id );
2012-08-02 21:06:05 -04:00
$user = get_userdata ( $user_id );
2010-01-05 23:02:57 -05:00
2010-04-24 13:49:08 -04:00
$welcome_email = str_replace ( 'SITE_NAME' , $current_site -> site_name , $welcome_email );
$welcome_email = str_replace ( 'BLOG_TITLE' , $title , $welcome_email );
$welcome_email = str_replace ( 'BLOG_URL' , $url , $welcome_email );
$welcome_email = str_replace ( 'USERNAME' , $user -> user_login , $welcome_email );
$welcome_email = str_replace ( 'PASSWORD' , $password , $welcome_email );
2010-01-05 23:02:57 -05:00
2010-04-24 13:49:08 -04:00
$welcome_email = apply_filters ( 'update_welcome_email' , $welcome_email , $blog_id , $user_id , $password , $title , $meta );
$admin_email = get_site_option ( 'admin_email' );
2010-01-12 13:40:40 -05:00
if ( $admin_email == '' )
2010-01-05 23:02:57 -05:00
$admin_email = 'support@' . $_SERVER [ 'SERVER_NAME' ];
2010-01-12 13:40:40 -05:00
2010-04-24 13:49:08 -04:00
$from_name = get_site_option ( 'site_name' ) == '' ? 'WordPress' : esc_html ( get_site_option ( 'site_name' ) );
2010-04-10 08:11:03 -04:00
$message_headers = " From: \" { $from_name } \" < { $admin_email } > \n " . " Content-Type: text/plain; charset= \" " . get_option ( 'blog_charset' ) . " \" \n " ;
2010-01-05 23:02:57 -05:00
$message = $welcome_email ;
2010-01-12 13:40:40 -05:00
if ( empty ( $current_site -> site_name ) )
2011-05-23 01:43:07 -04:00
$current_site -> site_name = 'WordPress' ;
2010-01-12 13:40:40 -05:00
2010-04-29 23:17:49 -04:00
$subject = apply_filters ( 'update_welcome_subject' , sprintf ( __ ( 'New %1$s Site: %2$s' ), $current_site -> site_name , stripslashes ( $title ) ) );
2010-01-05 23:02:57 -05:00
wp_mail ( $user -> user_email , $subject , $message , $message_headers );
return true ;
}
2011-01-04 04:02:38 -05:00
/**
* Notify a user that her account activation has been successful .
*
* Filter 'wpmu_welcome_user_notification' to disable or bypass .
*
* Filter 'update_welcome_user_email' and 'update_welcome_user_subject' to
* modify the content and subject line of the notification email .
*
* @ since MU
*
* @ param int $user_id
* @ param string $password
* @ param array $meta Optional . Not used in the default function , but is passed along to hooks for customization .
* @ return bool
*/
2010-01-05 23:02:57 -05:00
function wpmu_welcome_user_notification ( $user_id , $password , $meta = '' ) {
global $current_site ;
2010-01-12 13:40:40 -05:00
if ( ! apply_filters ( 'wpmu_welcome_user_notification' , $user_id , $password , $meta ) )
2010-01-05 23:02:57 -05:00
return false ;
2010-01-06 23:27:46 -05:00
$welcome_email = get_site_option ( 'welcome_user_email' );
2010-01-05 23:02:57 -05:00
2012-08-02 21:06:05 -04:00
$user = get_userdata ( $user_id );
2010-01-05 23:02:57 -05:00
2010-04-24 13:49:08 -04:00
$welcome_email = apply_filters ( 'update_welcome_user_email' , $welcome_email , $user_id , $password , $meta );
$welcome_email = str_replace ( 'SITE_NAME' , $current_site -> site_name , $welcome_email );
$welcome_email = str_replace ( 'USERNAME' , $user -> user_login , $welcome_email );
$welcome_email = str_replace ( 'PASSWORD' , $password , $welcome_email );
$welcome_email = str_replace ( 'LOGINLINK' , wp_login_url (), $welcome_email );
2010-01-05 23:02:57 -05:00
2010-04-24 13:49:08 -04:00
$admin_email = get_site_option ( 'admin_email' );
2010-01-12 13:40:40 -05:00
if ( $admin_email == '' )
2010-01-05 23:02:57 -05:00
$admin_email = 'support@' . $_SERVER [ 'SERVER_NAME' ];
2010-01-12 13:40:40 -05:00
2010-04-24 13:49:08 -04:00
$from_name = get_site_option ( 'site_name' ) == '' ? 'WordPress' : esc_html ( get_site_option ( 'site_name' ) );
2010-04-10 08:11:03 -04:00
$message_headers = " From: \" { $from_name } \" < { $admin_email } > \n " . " Content-Type: text/plain; charset= \" " . get_option ( 'blog_charset' ) . " \" \n " ;
2010-01-05 23:02:57 -05:00
$message = $welcome_email ;
2010-01-12 13:40:40 -05:00
if ( empty ( $current_site -> site_name ) )
2011-05-23 01:43:07 -04:00
$current_site -> site_name = 'WordPress' ;
2010-01-12 13:40:40 -05:00
2010-01-05 23:02:57 -05:00
$subject = apply_filters ( 'update_welcome_user_subject' , sprintf ( __ ( 'New %1$s User: %2$s' ), $current_site -> site_name , $user -> user_login ) );
wp_mail ( $user -> user_email , $subject , $message , $message_headers );
return true ;
}
2011-01-04 04:02:38 -05:00
/**
* Get the current site info .
*
* Returns an object containing the ID , domain , path , and site_name
* of the site being viewed .
*
* @ since MU
*
* @ return object
*/
2010-01-05 23:02:57 -05:00
function get_current_site () {
global $current_site ;
return $current_site ;
}
2011-01-04 04:02:38 -05:00
/**
* Get a numeric user ID from either an email address or a login .
*
* @ since MU
* @ uses is_email ()
*
* @ param string $string
* @ return int
*/
2010-01-05 23:02:57 -05:00
function get_user_id_from_string ( $string ) {
$user_id = 0 ;
if ( is_email ( $string ) ) {
2010-01-25 17:01:43 -05:00
$user = get_user_by ( 'email' , $string );
2010-01-05 23:02:57 -05:00
if ( $user )
$user_id = $user -> ID ;
} elseif ( is_numeric ( $string ) ) {
$user_id = $string ;
} else {
2010-01-25 17:01:43 -05:00
$user = get_user_by ( 'login' , $string );
2010-01-05 23:02:57 -05:00
if ( $user )
$user_id = $user -> ID ;
}
return $user_id ;
}
2011-01-04 04:02:38 -05:00
/**
* Get a user ' s most recent post .
*
* Walks through each of a user ' s blogs to find the post with
* the most recent post_date_gmt .
*
* @ since MU
* @ uses get_blogs_of_user ()
*
* @ param int $user_id
* @ return array Contains the blog_id , post_id , post_date_gmt , and post_gmt_ts
*/
2010-01-05 23:02:57 -05:00
function get_most_recent_post_of_user ( $user_id ) {
global $wpdb ;
$user_blogs = get_blogs_of_user ( ( int ) $user_id );
$most_recent_post = array ();
// Walk through each blog and get the most recent post
// published by $user_id
foreach ( ( array ) $user_blogs as $blog ) {
2012-01-24 19:09:30 -05:00
$prefix = $wpdb -> get_blog_prefix ( $blog -> userblog_id );
$recent_post = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT ID, post_date_gmt FROM { $prefix } posts WHERE post_author = %d AND post_type = 'post' AND post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1 " , $user_id ), ARRAY_A );
2010-01-05 23:02:57 -05:00
// Make sure we found a post
if ( isset ( $recent_post [ 'ID' ]) ) {
$post_gmt_ts = strtotime ( $recent_post [ 'post_date_gmt' ]);
// If this is the first post checked or if this post is
// newer than the current recent post, make it the new
// most recent post.
2010-01-12 13:40:40 -05:00
if ( ! isset ( $most_recent_post [ 'post_gmt_ts' ]) || ( $post_gmt_ts > $most_recent_post [ 'post_gmt_ts' ] ) ) {
2010-01-05 23:02:57 -05:00
$most_recent_post = array (
'blog_id' => $blog -> userblog_id ,
'post_id' => $recent_post [ 'ID' ],
'post_date_gmt' => $recent_post [ 'post_date_gmt' ],
'post_gmt_ts' => $post_gmt_ts
);
}
}
}
return $most_recent_post ;
}
2011-01-04 04:02:38 -05:00
// Misc functions
/**
* Get the size of a directory .
*
* A helper function that is used primarily to check whether
* a blog has exceeded its allowed upload space .
*
* @ since MU
* @ uses recurse_dirsize ()
*
* @ param string $directory
* @ return int
*/
2010-01-05 23:02:57 -05:00
function get_dirsize ( $directory ) {
$dirsize = get_transient ( 'dirsize_cache' );
2010-01-12 13:40:40 -05:00
if ( is_array ( $dirsize ) && isset ( $dirsize [ $directory ][ 'size' ] ) )
2010-01-05 23:02:57 -05:00
return $dirsize [ $directory ][ 'size' ];
2010-01-12 13:40:40 -05:00
if ( false == is_array ( $dirsize ) )
2010-01-05 23:02:57 -05:00
$dirsize = array ();
2010-01-12 13:40:40 -05:00
2010-01-05 23:02:57 -05:00
$dirsize [ $directory ][ 'size' ] = recurse_dirsize ( $directory );
2012-09-25 01:26:19 -04:00
set_transient ( 'dirsize_cache' , $dirsize , HOUR_IN_SECONDS );
2010-01-05 23:02:57 -05:00
return $dirsize [ $directory ][ 'size' ];
}
2011-01-04 04:02:38 -05:00
/**
* Get the size of a directory recursively .
*
* Used by get_dirsize () to get a directory ' s size when it contains
* other directories .
*
* @ since MU
*
* @ param string $directory
* @ return int
*/
2010-01-05 23:02:57 -05:00
function recurse_dirsize ( $directory ) {
$size = 0 ;
2010-01-12 13:40:40 -05:00
2011-09-05 12:53:19 -04:00
$directory = untrailingslashit ( $directory );
2010-01-12 13:40:40 -05:00
if ( ! file_exists ( $directory ) || ! is_dir ( $directory ) || ! is_readable ( $directory ) )
return false ;
if ( $handle = opendir ( $directory )) {
2010-01-05 23:02:57 -05:00
while (( $file = readdir ( $handle )) !== false ) {
$path = $directory . '/' . $file ;
2010-01-12 13:40:40 -05:00
if ( $file != '.' && $file != '..' ) {
if ( is_file ( $path )) {
2010-01-05 23:02:57 -05:00
$size += filesize ( $path );
2010-01-12 13:40:40 -05:00
} elseif ( is_dir ( $path )) {
2010-01-05 23:02:57 -05:00
$handlesize = recurse_dirsize ( $path );
2010-02-04 14:56:36 -05:00
if ( $handlesize > 0 )
2010-01-05 23:02:57 -05:00
$size += $handlesize ;
}
}
}
closedir ( $handle );
}
return $size ;
}
2011-01-04 04:02:38 -05:00
/**
* Check an array of MIME types against a whitelist .
*
2011-01-05 23:11:14 -05:00
* WordPress ships with a set of allowed upload filetypes ,
2011-01-04 04:02:38 -05:00
* which is defined in wp - includes / functions . php in
* get_allowed_mime_types () . This function is used to filter
2011-01-05 23:11:14 -05:00
* that list against the filetype whitelist provided by Multisite
* Super Admins at wp - admin / network / settings . php .
2011-01-04 04:02:38 -05:00
*
* @ since MU
*
* @ param array $mimes
* @ return array
*/
2010-01-12 13:40:40 -05:00
function check_upload_mimes ( $mimes ) {
2010-04-24 13:49:08 -04:00
$site_exts = explode ( ' ' , get_site_option ( 'upload_filetypes' ) );
2010-01-05 23:02:57 -05:00
foreach ( $site_exts as $ext ) {
2010-04-23 15:00:30 -04:00
foreach ( $mimes as $ext_pattern => $mime ) {
if ( $ext != '' && strpos ( $ext_pattern , $ext ) !== false )
2010-01-05 23:02:57 -05:00
$site_mimes [ $ext_pattern ] = $mime ;
}
}
return $site_mimes ;
}
2011-01-04 04:02:38 -05:00
/**
* Update a blog ' s post count .
*
* WordPress MS stores a blog ' s post count as an option so as
* to avoid extraneous COUNTs when a blog ' s details are fetched
* with get_blog_details () . This function is called when posts
* are published to make sure the count stays current .
*
* @ since MU
*/
2010-01-05 23:02:57 -05:00
function update_posts_count ( $deprecated = '' ) {
global $wpdb ;
2010-04-24 13:49:08 -04:00
update_option ( 'post_count' , ( int ) $wpdb -> get_var ( " SELECT COUNT(ID) FROM { $wpdb -> posts } WHERE post_status = 'publish' and post_type = 'post' " ) );
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Logs user registrations .
*
* @ since MU
*
* @ param int $blog_id
* @ param int $user_id
*/
2010-01-05 23:02:57 -05:00
function wpmu_log_new_registrations ( $blog_id , $user_id ) {
global $wpdb ;
2012-08-02 21:06:05 -04:00
$user = get_userdata ( ( int ) $user_id );
2010-01-05 23:02:57 -05:00
$wpdb -> insert ( $wpdb -> registration_log , array ( 'email' => $user -> user_email , 'IP' => preg_replace ( '/[^0-9., ]/' , '' , $_SERVER [ 'REMOTE_ADDR' ] ), 'blog_id' => $blog_id , 'date_registered' => current_time ( 'mysql' )) );
}
2010-02-02 17:58:06 -05:00
/**
* Maintains a canonical list of terms by syncing terms created for each blog with the global terms table .
*
* @ since 3.0 . 0
*
* @ see term_id_filter
*
* @ param int $term_id An ID for a term on the current blog .
* @ return int An ID from the global terms table mapped from $term_id .
*/
2010-01-05 23:02:57 -05:00
function global_terms ( $term_id , $deprecated = '' ) {
2010-05-24 20:13:03 -04:00
global $wpdb ;
2010-05-24 20:31:07 -04:00
static $global_terms_recurse = null ;
2010-01-05 23:02:57 -05:00
2010-03-16 13:17:55 -04:00
if ( ! global_terms_enabled () )
return $term_id ;
2010-04-01 21:26:44 -04:00
// prevent a race condition
2010-05-24 20:13:03 -04:00
$recurse_start = false ;
2010-05-24 20:31:07 -04:00
if ( $global_terms_recurse === null ) {
2010-04-01 21:26:44 -04:00
$recurse_start = true ;
$global_terms_recurse = 1 ;
} elseif ( 10 < $global_terms_recurse ++ ) {
return $term_id ;
}
2010-01-05 23:02:57 -05:00
$term_id = intval ( $term_id );
$c = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->terms WHERE term_id = %d " , $term_id ) );
$global_id = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT cat_ID FROM $wpdb->sitecategories WHERE category_nicename = %s " , $c -> slug ) );
if ( $global_id == null ) {
2010-04-01 21:26:44 -04:00
$used_global_id = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT cat_ID FROM $wpdb->sitecategories WHERE cat_ID = %d " , $c -> term_id ) );
if ( null == $used_global_id ) {
$wpdb -> insert ( $wpdb -> sitecategories , array ( 'cat_ID' => $term_id , 'cat_name' => $c -> name , 'category_nicename' => $c -> slug ) );
$global_id = $wpdb -> insert_id ;
2010-05-28 16:03:29 -04:00
if ( empty ( $global_id ) )
return $term_id ;
2010-04-01 21:26:44 -04:00
} else {
$max_global_id = $wpdb -> get_var ( " SELECT MAX(cat_ID) FROM $wpdb->sitecategories " );
2010-05-25 03:24:10 -04:00
$max_local_id = $wpdb -> get_var ( " SELECT MAX(term_id) FROM $wpdb->terms " );
$new_global_id = max ( $max_global_id , $max_local_id ) + mt_rand ( 100 , 400 );
$wpdb -> insert ( $wpdb -> sitecategories , array ( 'cat_ID' => $new_global_id , 'cat_name' => $c -> name , 'category_nicename' => $c -> slug ) );
2010-04-01 21:26:44 -04:00
$global_id = $wpdb -> insert_id ;
}
} elseif ( $global_id != $term_id ) {
$local_id = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT term_id FROM $wpdb->terms WHERE term_id = %d " , $global_id ) );
if ( null != $local_id )
$local_id = global_terms ( $local_id );
if ( 10 < $global_terms_recurse )
$global_id = $term_id ;
2010-01-05 23:02:57 -05:00
}
2010-04-01 21:26:44 -04:00
if ( $global_id != $term_id ) {
if ( get_option ( 'default_category' ) == $term_id )
update_option ( 'default_category' , $global_id );
2010-01-05 23:02:57 -05:00
2010-04-01 21:26:44 -04:00
$wpdb -> update ( $wpdb -> terms , array ( 'term_id' => $global_id ), array ( 'term_id' => $term_id ) );
$wpdb -> update ( $wpdb -> term_taxonomy , array ( 'term_id' => $global_id ), array ( 'term_id' => $term_id ) );
$wpdb -> update ( $wpdb -> term_taxonomy , array ( 'parent' => $global_id ), array ( 'parent' => $term_id ) );
2010-01-05 23:02:57 -05:00
2010-04-01 21:26:44 -04:00
clean_term_cache ( $term_id );
}
if ( $recurse_start )
2010-05-24 20:31:07 -04:00
$global_terms_recurse = null ;
2010-01-05 23:02:57 -05:00
2010-01-06 23:27:46 -05:00
return $global_id ;
}
2010-01-05 23:02:57 -05:00
2011-01-04 04:02:38 -05:00
/**
* Ensure that the current site ' s domain is listed in the allowed redirect host list .
*
* @ see wp_validate_redirect ()
* @ since MU
*
* @ return array The current site ' s domain
*/
2010-01-05 23:02:57 -05:00
function redirect_this_site ( $deprecated = '' ) {
global $current_site ;
return array ( $current_site -> domain );
}
2011-01-04 04:02:38 -05:00
/**
* Check whether an upload is too big .
*
* @ since MU
*
* @ param array $upload
* @ return mixed If the upload is under the size limit , $upload is returned . Otherwise returns an error message .
*/
2010-01-05 23:02:57 -05:00
function upload_is_file_too_big ( $upload ) {
2012-07-08 23:49:23 -04:00
if ( is_array ( $upload ) == false || defined ( 'WP_IMPORTING' ) || get_site_option ( 'upload_space_check_disabled' ) )
2010-01-05 23:02:57 -05:00
return $upload ;
2010-01-12 13:40:40 -05:00
2010-04-24 13:49:08 -04:00
if ( strlen ( $upload [ 'bits' ] ) > ( 1024 * get_site_option ( 'fileupload_maxk' , 1500 ) ) )
return sprintf ( __ ( 'This file is too big. Files must be less than %d KB in size.' ) . '<br />' , get_site_option ( 'fileupload_maxk' , 1500 ));
2010-01-05 23:02:57 -05:00
return $upload ;
}
2011-01-04 04:02:38 -05:00
/**
* Add a nonce field to the signup page .
*
* @ since MU
* @ uses wp_nonce_field ()
*/
2010-01-05 23:02:57 -05:00
function signup_nonce_fields () {
$id = mt_rand ();
echo " <input type='hidden' name='signup_form_id' value=' { $id } ' /> " ;
wp_nonce_field ( 'signup_form_' . $id , '_signup_form' , false );
}
2011-01-04 04:02:38 -05:00
/**
* Process the signup nonce created in signup_nonce_fields () .
*
* @ since MU
* @ uses wp_create_nonce ()
*
* @ param array $result
* @ return array
*/
2010-01-05 23:02:57 -05:00
function signup_nonce_check ( $result ) {
2010-01-12 13:40:40 -05:00
if ( ! strpos ( $_SERVER [ 'PHP_SELF' ], 'wp-signup.php' ) )
2010-01-05 23:02:57 -05:00
return $result ;
if ( wp_create_nonce ( 'signup_form_' . $_POST [ 'signup_form_id' ]) != $_POST [ '_signup_form' ] )
wp_die ( __ ( 'Please try again!' ) );
return $result ;
}
2011-01-04 04:02:38 -05:00
/**
* Correct 404 redirects when NOBLOGREDIRECT is defined .
*
* @ since MU
*/
2010-01-05 23:02:57 -05:00
function maybe_redirect_404 () {
global $current_site ;
2010-05-25 19:41:36 -04:00
if ( is_main_site () && is_404 () && defined ( 'NOBLOGREDIRECT' ) && ( $destination = apply_filters ( 'blog_redirect_404' , NOBLOGREDIRECT ) ) ) {
2010-01-05 23:02:57 -05:00
if ( $destination == '%siteurl%' )
2010-03-29 17:45:31 -04:00
$destination = network_home_url ();
2010-01-05 23:02:57 -05:00
wp_redirect ( $destination );
exit ();
}
}
2011-01-04 04:02:38 -05:00
/**
* Add a new user to a blog by visiting / newbloguser / username /.
*
* This will only work when the user ' s details are saved as an option
* keyed as 'new_user_x' , where 'x' is the username of the user to be
* added , as when a user is invited through the regular WP Add User interface .
*
* @ since MU
* @ uses add_existing_user_to_blog ()
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function maybe_add_existing_user_to_blog () {
2010-01-12 13:40:40 -05:00
if ( false === strpos ( $_SERVER [ 'REQUEST_URI' ], '/newbloguser/' ) )
2010-01-05 23:02:57 -05:00
return false ;
$parts = explode ( '/' , $_SERVER [ 'REQUEST_URI' ] );
$key = array_pop ( $parts );
2010-01-12 13:40:40 -05:00
2010-01-05 23:02:57 -05:00
if ( $key == '' )
$key = array_pop ( $parts );
2010-01-12 13:40:40 -05:00
2010-04-24 13:49:08 -04:00
$details = get_option ( 'new_user_' . $key );
2010-04-24 14:39:22 -04:00
if ( ! empty ( $details ) )
delete_option ( 'new_user_' . $key );
if ( empty ( $details ) || is_wp_error ( add_existing_user_to_blog ( $details ) ) )
2012-01-04 14:29:03 -05:00
wp_die ( sprintf ( __ ( 'An error occurred adding you to this site. Back to the <a href="%s">homepage</a>.' ), home_url () ) );
2010-05-03 16:26:11 -04:00
2012-01-04 14:29:03 -05:00
wp_die ( sprintf ( __ ( 'You have been added to this site. Please visit the <a href="%s">homepage</a> or <a href="%s">log in</a> using your username and password.' ), home_url (), admin_url () ), __ ( 'Success' ) );
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Add a user to a blog based on details from maybe_add_existing_user_to_blog () .
*
* @ since MU
* @ uses add_user_to_blog ()
2011-01-05 23:11:14 -05:00
*
2011-01-04 04:02:38 -05:00
* @ param array $details
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function add_existing_user_to_blog ( $details = false ) {
2010-11-04 05:06:45 -04:00
global $blog_id ;
2010-11-17 13:47:34 -05:00
2010-01-05 23:02:57 -05:00
if ( is_array ( $details ) ) {
2010-11-04 05:06:45 -04:00
$result = add_user_to_blog ( $blog_id , $details [ 'user_id' ], $details [ 'role' ] );
2010-04-24 14:39:22 -04:00
do_action ( 'added_existing_user' , $details [ 'user_id' ], $result );
2010-01-05 23:02:57 -05:00
}
2010-04-24 14:39:22 -04:00
return $result ;
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Add a newly created user to the appropriate blog
*
* @ since MU
2011-01-05 23:11:14 -05:00
*
2011-01-04 04:02:38 -05:00
* @ param int $user_id
* @ param string $email
* @ param array $meta
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function add_new_user_to_blog ( $user_id , $email , $meta ) {
global $current_site ;
2011-05-04 14:38:17 -04:00
if ( ! empty ( $meta [ 'add_to_blog' ] ) ) {
2010-01-05 23:02:57 -05:00
$blog_id = $meta [ 'add_to_blog' ];
$role = $meta [ 'new_role' ];
2010-12-15 11:04:19 -05:00
remove_user_from_blog ( $user_id , $current_site -> blog_id ); // remove user from main blog.
2010-01-05 23:02:57 -05:00
add_user_to_blog ( $blog_id , $user_id , $role );
2010-02-22 16:25:32 -05:00
update_user_meta ( $user_id , 'primary_blog' , $blog_id );
2010-01-05 23:02:57 -05:00
}
}
2011-01-04 04:02:38 -05:00
/**
* Correct From host on outgoing mail to match the site domain
*
* @ since MU
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function fix_phpmailer_messageid ( $phpmailer ) {
global $current_site ;
$phpmailer -> Hostname = $current_site -> domain ;
}
2011-01-04 04:02:38 -05:00
/**
* Check to see whether a user is marked as a spammer , based on username
*
* @ since MU
* @ uses get_current_user_id ()
* @ uses get_user_id_from_string ()
*
* @ param string $username
* @ return bool
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function is_user_spammy ( $username = 0 ) {
2010-01-12 13:40:40 -05:00
if ( $username == 0 ) {
2010-06-24 11:01:29 -04:00
$user_id = get_current_user_id ();
2010-01-05 23:02:57 -05:00
} else {
$user_id = get_user_id_from_string ( $username );
}
2012-08-02 21:06:05 -04:00
$u = get_userdata ( $user_id );
2010-01-12 13:40:40 -05:00
2010-07-13 17:27:05 -04:00
return ( isset ( $u -> spam ) && $u -> spam == 1 );
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Update this blog 's ' public ' setting in the global blogs table .
*
* Public blogs have a setting of 1 , private blogs are 0.
*
* @ since MU
* @ uses update_blog_status ()
*
* @ param int $old_value
* @ param int $value The new public value
* @ return bool
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function update_blog_public ( $old_value , $value ) {
global $wpdb ;
do_action ( 'update_blog_public' );
update_blog_status ( $wpdb -> blogid , 'public' , ( int ) $value );
}
add_action ( 'update_option_blog_public' , 'update_blog_public' , 10 , 2 );
2010-02-04 15:00:18 -05:00
2011-01-04 04:02:38 -05:00
/**
* Get the " dashboard blog " , the blog where users without a blog edit their profile data .
*
* @ since MU
* @ uses get_blog_details ()
*
* @ return int
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function get_dashboard_blog () {
2010-02-04 13:57:32 -05:00
if ( $blog = get_site_option ( 'dashboard_blog' ) )
return get_blog_details ( $blog );
2010-01-05 23:02:57 -05:00
2010-02-04 13:57:32 -05:00
return get_blog_details ( $GLOBALS [ 'current_site' ] -> blog_id );
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Check whether a usermeta key has to do with the current blog .
*
* @ since MU
* @ uses wp_get_current_user ()
*
* @ param string $key
* @ param int $user_id Optional . Defaults to current user .
* @ param int $blog_id Optional . Defaults to current blog .
* @ return bool
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function is_user_option_local ( $key , $user_id = 0 , $blog_id = 0 ) {
2010-06-24 11:01:29 -04:00
global $wpdb ;
2010-01-05 23:02:57 -05:00
2010-06-24 11:01:29 -04:00
$current_user = wp_get_current_user ();
2010-01-12 13:40:40 -05:00
if ( $user_id == 0 )
2010-01-05 23:02:57 -05:00
$user_id = $current_user -> ID ;
2010-01-12 13:40:40 -05:00
if ( $blog_id == 0 )
2010-01-05 23:02:57 -05:00
$blog_id = $wpdb -> blogid ;
2010-01-06 23:27:46 -05:00
2012-01-24 19:10:46 -05:00
$local_key = $wpdb -> get_blog_prefix ( $blog_id ) . $key ;
2010-01-12 13:40:40 -05:00
if ( isset ( $current_user -> $local_key ) )
2010-01-05 23:02:57 -05:00
return true ;
2010-01-12 13:40:40 -05:00
2010-01-05 23:02:57 -05:00
return false ;
}
2011-01-04 04:02:38 -05:00
/**
* Check whether users can self - register , based on Network settings .
*
* @ since MU
*
* @ return bool
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function users_can_register_signup_filter () {
$registration = get_site_option ( 'registration' );
2010-01-12 13:40:40 -05:00
if ( $registration == 'all' || $registration == 'user' )
2010-01-05 23:02:57 -05:00
return true ;
2010-02-04 13:57:32 -05:00
return false ;
2010-01-05 23:02:57 -05:00
}
add_filter ( 'option_users_can_register' , 'users_can_register_signup_filter' );
2011-01-04 04:02:38 -05:00
/**
* Ensure that the welcome message is not empty . Currently unused .
*
* @ since MU
*
* @ param string $text
* @ return string
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function welcome_user_msg_filter ( $text ) {
if ( ! $text ) {
2012-05-02 16:31:37 -04:00
remove_filter ( 'site_option_welcome_user_email' , 'welcome_user_msg_filter' );
$text = __ ( ' Dear User ,
2010-01-05 23:02:57 -05:00
Your new account is set up .
You can log in with the following information :
Username : USERNAME
Password : PASSWORD
LOGINLINK
Thanks !
2010-04-24 13:49:08 -04:00
-- The Team @ SITE_NAME ' );
2012-05-02 16:31:37 -04:00
update_site_option ( 'welcome_user_email' , $text );
2010-01-05 23:02:57 -05:00
}
return $text ;
}
add_filter ( 'site_option_welcome_user_email' , 'welcome_user_msg_filter' );
2010-02-02 16:41:17 -05:00
/**
2010-01-05 23:02:57 -05:00
* Whether to force SSL on content .
*
* @ since 2.8 . 5
*
* @ param string | bool $force
* @ return bool True if forced , false if not forced .
*/
function force_ssl_content ( $force = '' ) {
2010-01-12 13:40:40 -05:00
static $forced_content ;
2010-01-05 23:02:57 -05:00
2010-01-12 13:40:40 -05:00
if ( '' != $force ) {
$old_forced = $forced_content ;
$forced_content = $force ;
return $old_forced ;
}
return $forced_content ;
2010-01-05 23:02:57 -05:00
}
/**
2012-08-30 09:33:00 -04:00
* Formats a URL to use https .
2012-09-15 16:05:58 -04:00
*
2010-01-05 23:02:57 -05:00
* Useful as a filter .
*
* @ since 2.8 . 5
2012-08-30 09:33:00 -04:00
*
* @ param string URL
* @ return string URL with https as the scheme
*/
2010-02-04 13:57:32 -05:00
function filter_SSL ( $url ) {
2012-08-30 09:33:00 -04:00
if ( ! is_string ( $url ) )
return get_bloginfo ( 'url' ); // Return home blog url with proper scheme
2010-01-05 23:02:57 -05:00
2012-08-30 09:33:00 -04:00
if ( force_ssl_content () && is_ssl () )
$url = set_url_scheme ( $url , 'https' );
2010-01-05 23:02:57 -05:00
return $url ;
}
2010-10-20 16:22:14 -04:00
/**
* Schedule update of the network - wide counts for the current network .
*
* @ since 3.1 . 0
*/
function wp_schedule_update_network_counts () {
if ( ! is_main_site () )
return ;
if ( ! wp_next_scheduled ( 'update_network_counts' ) && ! defined ( 'WP_INSTALLING' ) )
wp_schedule_event ( time (), 'twicedaily' , 'update_network_counts' );
}
/**
* Update the network - wide counts for the current network .
*
* @ since 3.1 . 0
*/
function wp_update_network_counts () {
global $wpdb ;
$count = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT COUNT(blog_id) as c FROM $wpdb->blogs WHERE site_id = %d AND spam = '0' AND deleted = '0' and archived = '0' " , $wpdb -> siteid ) );
update_site_option ( 'blog_count' , $count );
$count = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT COUNT(ID) as c FROM $wpdb->users WHERE spam = '0' AND deleted = '0' " ) );
update_site_option ( 'user_count' , $count );
}