2019-03-12 09:27:46 +00:00
< ? php
/**
* Multisite WordPress API
*
* @ package WordPress
* @ subpackage Multisite
* @ since 3.0 . 0
*/
/**
* Gets the network ' s site and user counts .
*
* @ since MU ( 3.0 . 0 )
*
* @ return array Site and user count for the network .
*/
function get_sitestats () {
$stats = array (
'blogs' => get_blog_count (),
'users' => get_user_count (),
);
return $stats ;
}
/**
* Get one of a user ' s active blogs
*
* Returns the user ' s primary blog , if they have 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 ( 3.0 . 0 )
*
* @ param int $user_id The unique ID of the user
* @ return WP_Site | void The blog object
*/
function get_active_blog_for_user ( $user_id ) {
$blogs = get_blogs_of_user ( $user_id );
2019-04-16 19:56:22 +00:00
if ( empty ( $blogs ) ) {
2019-03-12 09:27:46 +00:00
return ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
if ( ! is_multisite () ) {
return $blogs [ get_current_blog_id () ];
}
$primary_blog = get_user_meta ( $user_id , 'primary_blog' , true );
2019-04-16 19:56:22 +00:00
$first_blog = current ( $blogs );
2019-03-12 09:27:46 +00:00
if ( false !== $primary_blog ) {
if ( ! isset ( $blogs [ $primary_blog ] ) ) {
update_user_meta ( $user_id , 'primary_blog' , $first_blog -> userblog_id );
$primary = get_site ( $first_blog -> userblog_id );
} else {
$primary = get_site ( $primary_blog );
}
} else {
//TODO Review this call to add_user_to_blog too - to get here the user must have a role on this blog?
$result = add_user_to_blog ( $first_blog -> userblog_id , $user_id , 'subscriber' );
if ( ! is_wp_error ( $result ) ) {
update_user_meta ( $user_id , 'primary_blog' , $first_blog -> userblog_id );
$primary = $first_blog ;
}
}
if ( ( ! is_object ( $primary ) ) || ( $primary -> archived == 1 || $primary -> spam == 1 || $primary -> deleted == 1 ) ) {
$blogs = get_blogs_of_user ( $user_id , true ); // if a user's primary blog is shut down, check their other blogs.
2019-04-16 19:56:22 +00:00
$ret = false ;
2019-03-12 09:27:46 +00:00
if ( is_array ( $blogs ) && count ( $blogs ) > 0 ) {
foreach ( ( array ) $blogs as $blog_id => $blog ) {
2019-04-16 19:56:22 +00:00
if ( $blog -> site_id != get_current_network_id () ) {
2019-03-12 09:27:46 +00:00
continue ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
$details = get_site ( $blog_id );
if ( is_object ( $details ) && $details -> archived == 0 && $details -> spam == 0 && $details -> deleted == 0 ) {
2019-04-16 19:56:22 +00:00
$ret = $details ;
if ( get_user_meta ( $user_id , 'primary_blog' , true ) != $blog_id ) {
2019-03-12 09:27:46 +00:00
update_user_meta ( $user_id , 'primary_blog' , $blog_id );
2019-04-16 19:56:22 +00:00
}
if ( ! get_user_meta ( $user_id , 'source_domain' , true ) ) {
update_user_meta ( $user_id , 'source_domain' , $details -> domain );
}
2019-03-12 09:27:46 +00:00
break ;
}
}
} else {
return ;
}
return $ret ;
} else {
return $primary ;
}
}
/**
* The number of active users in your installation .
*
* The count is cached and updated twice daily . This is not a live count .
*
* @ since MU ( 3.0 . 0 )
2019-04-16 19:56:22 +00:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2019-03-12 09:27:46 +00:00
*
* @ param int | null $network_id ID of the network . Default is the current network .
* @ return int Number of active users on the network .
*/
function get_user_count ( $network_id = null ) {
return get_network_option ( $network_id , 'user_count' );
}
/**
* The number of active sites on your installation .
*
* The count is cached and updated twice daily . This is not a live count .
*
* @ since MU ( 3.0 . 0 )
2019-04-16 19:56:22 +00:00
* @ since 3.7 . 0 The `$network_id` parameter has been deprecated .
* @ since 4.8 . 0 The `$network_id` parameter is now being used .
2019-03-12 09:27:46 +00:00
*
* @ param int | null $network_id ID of the network . Default is the current network .
* @ return int Number of active sites on the network .
*/
function get_blog_count ( $network_id = null ) {
return get_network_option ( $network_id , 'blog_count' );
}
/**
* Get a blog post from any site on the network .
*
* @ since MU ( 3.0 . 0 )
*
* @ param int $blog_id ID of the blog .
* @ param int $post_id ID of the post you ' re looking for .
* @ return WP_Post | null WP_Post on success or null on failure
*/
function get_blog_post ( $blog_id , $post_id ) {
switch_to_blog ( $blog_id );
$post = get_post ( $post_id );
restore_current_blog ();
return $post ;
}
/**
* Adds a user to a blog .
*
* Use the { @ see 'add_user_to_blog' } action to fire an event when users are added to a blog .
*
* @ since MU ( 3.0 . 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 true | WP_Error
*/
function add_user_to_blog ( $blog_id , $user_id , $role ) {
2019-04-16 19:56:22 +00:00
switch_to_blog ( $blog_id );
2019-03-12 09:27:46 +00:00
$user = get_userdata ( $user_id );
if ( ! $user ) {
restore_current_blog ();
return new WP_Error ( 'user_does_not_exist' , __ ( 'The requested user does not exist.' ) );
}
/**
* Filters whether a user should be added to a site .
*
* @ since 4.9 . 0
*
* @ param bool | WP_Error $retval True if the user should be added to the site , false
* or error object otherwise .
* @ param int $user_id User ID .
* @ param string $role User role .
* @ param int $blog_id Site ID .
*/
$can_add_user = apply_filters ( 'can_add_user_to_blog' , true , $user_id , $role , $blog_id );
if ( true !== $can_add_user ) {
restore_current_blog ();
if ( is_wp_error ( $can_add_user ) ) {
return $can_add_user ;
}
return new WP_Error ( 'user_cannot_be_added' , __ ( 'User cannot be added to this site.' ) );
}
2019-04-16 19:56:22 +00:00
if ( ! get_user_meta ( $user_id , 'primary_blog' , true ) ) {
update_user_meta ( $user_id , 'primary_blog' , $blog_id );
2019-03-12 09:27:46 +00:00
$site = get_site ( $blog_id );
update_user_meta ( $user_id , 'source_domain' , $site -> domain );
}
2019-04-16 19:56:22 +00:00
$user -> set_role ( $role );
2019-03-12 09:27:46 +00:00
/**
* Fires immediately after a user is added to a site .
*
* @ since MU ( 3.0 . 0 )
*
* @ param int $user_id User ID .
* @ param string $role User role .
* @ param int $blog_id Blog ID .
*/
do_action ( 'add_user_to_blog' , $user_id , $role , $blog_id );
wp_cache_delete ( $user_id , 'users' );
wp_cache_delete ( $blog_id . '_user_count' , 'blog-details' );
restore_current_blog ();
return true ;
}
/**
* Remove a user from a blog .
*
* Use the { @ see 'remove_user_from_blog' } action to fire an event when
* users are removed from a blog .
*
* Accepts an optional `$reassign` parameter , if you want to
* reassign the user ' s blog posts to another user upon removal .
*
* @ since MU ( 3.0 . 0 )
*
* @ global wpdb $wpdb WordPress database abstraction object .
*
* @ 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 true | WP_Error
*/
2019-04-16 19:56:22 +00:00
function remove_user_from_blog ( $user_id , $blog_id = '' , $reassign = '' ) {
2019-03-12 09:27:46 +00:00
global $wpdb ;
2019-04-16 19:56:22 +00:00
switch_to_blog ( $blog_id );
2019-03-12 09:27:46 +00:00
$user_id = ( int ) $user_id ;
/**
* Fires before a user is removed from a site .
*
* @ since MU ( 3.0 . 0 )
*
* @ param int $user_id User ID .
* @ param int $blog_id Blog 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.
2019-04-16 19:56:22 +00:00
$primary_blog = get_user_meta ( $user_id , 'primary_blog' , true );
2019-03-12 09:27:46 +00:00
if ( $primary_blog == $blog_id ) {
2019-04-16 19:56:22 +00:00
$new_id = '' ;
2019-03-12 09:27:46 +00:00
$new_domain = '' ;
2019-04-16 19:56:22 +00:00
$blogs = get_blogs_of_user ( $user_id );
2019-03-12 09:27:46 +00:00
foreach ( ( array ) $blogs as $blog ) {
2019-04-16 19:56:22 +00:00
if ( $blog -> userblog_id == $blog_id ) {
2019-03-12 09:27:46 +00:00
continue ;
2019-04-16 19:56:22 +00:00
}
$new_id = $blog -> userblog_id ;
2019-03-12 09:27:46 +00:00
$new_domain = $blog -> domain ;
break ;
}
2019-04-16 19:56:22 +00:00
update_user_meta ( $user_id , 'primary_blog' , $new_id );
update_user_meta ( $user_id , 'source_domain' , $new_domain );
2019-03-12 09:27:46 +00:00
}
// wp_revoke_user($user_id);
$user = get_userdata ( $user_id );
if ( ! $user ) {
restore_current_blog ();
2019-04-16 19:56:22 +00:00
return new WP_Error ( 'user_does_not_exist' , __ ( 'That user does not exist.' ) );
2019-03-12 09:27:46 +00:00
}
$user -> remove_all_caps ();
2019-04-16 19:56:22 +00:00
$blogs = get_blogs_of_user ( $user_id );
if ( count ( $blogs ) == 0 ) {
update_user_meta ( $user_id , 'primary_blog' , '' );
update_user_meta ( $user_id , 'source_domain' , '' );
2019-03-12 09:27:46 +00:00
}
if ( $reassign != '' ) {
$reassign = ( int ) $reassign ;
$post_ids = $wpdb -> get_col ( $wpdb -> prepare ( " SELECT ID FROM $wpdb->posts WHERE post_author = %d " , $user_id ) );
$link_ids = $wpdb -> get_col ( $wpdb -> prepare ( " SELECT link_id FROM $wpdb->links WHERE link_owner = %d " , $user_id ) );
if ( ! empty ( $post_ids ) ) {
$wpdb -> query ( $wpdb -> prepare ( " UPDATE $wpdb->posts SET post_author = %d WHERE post_author = %d " , $reassign , $user_id ) );
array_walk ( $post_ids , 'clean_post_cache' );
}
if ( ! empty ( $link_ids ) ) {
$wpdb -> query ( $wpdb -> prepare ( " UPDATE $wpdb->links SET link_owner = %d WHERE link_owner = %d " , $reassign , $user_id ) );
array_walk ( $link_ids , 'clean_bookmark_cache' );
}
}
restore_current_blog ();
return true ;
}
/**
* Get the permalink for a post on another blog .
*
* @ since MU ( 3.0 . 0 ) 1.0
*
* @ param int $blog_id ID of the source blog .
* @ param int $post_id ID of the desired post .
* @ return string The post ' s permalink
*/
function get_blog_permalink ( $blog_id , $post_id ) {
switch_to_blog ( $blog_id );
$link = get_permalink ( $post_id );
restore_current_blog ();
return $link ;
}
/**
* 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 ( 3.0 . 0 )
*
* @ global wpdb $wpdb WordPress database abstraction object .
*
* @ param string $domain
* @ param string $path Optional . Not required for subdomain installations .
* @ return int 0 if no blog found , otherwise the ID of the matching blog
*/
function get_blog_id_from_url ( $domain , $path = '/' ) {
$domain = strtolower ( $domain );
2019-04-16 19:56:22 +00:00
$path = strtolower ( $path );
$id = wp_cache_get ( md5 ( $domain . $path ), 'blog-id-cache' );
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( $id == - 1 ) { // blog does not exist
2019-03-12 09:27:46 +00:00
return 0 ;
2019-04-16 19:56:22 +00:00
} elseif ( $id ) {
2019-03-12 09:27:46 +00:00
return ( int ) $id ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
$args = array (
2019-05-08 07:05:39 +00:00
'domain' => $domain ,
'path' => $path ,
'fields' => 'ids' ,
'number' => 1 ,
'update_site_meta_cache' => false ,
2019-03-12 09:27:46 +00:00
);
$result = get_sites ( $args );
2019-04-16 19:56:22 +00:00
$id = array_shift ( $result );
2019-03-12 09:27:46 +00:00
if ( ! $id ) {
wp_cache_set ( md5 ( $domain . $path ), - 1 , 'blog-id-cache' );
return 0 ;
}
wp_cache_set ( md5 ( $domain . $path ), $id , 'blog-id-cache' );
return $id ;
}
// Admin functions
/**
* 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
* bypasses this check .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $user_email The email provided by the user at registration .
* @ return bool Returns true when the email address is banned .
*/
function is_email_address_unsafe ( $user_email ) {
$banned_names = get_site_option ( 'banned_email_domains' );
2019-04-16 19:56:22 +00:00
if ( $banned_names && ! is_array ( $banned_names ) ) {
2019-03-12 09:27:46 +00:00
$banned_names = explode ( " \n " , $banned_names );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
$is_email_address_unsafe = false ;
if ( $banned_names && is_array ( $banned_names ) && false !== strpos ( $user_email , '@' , 1 ) ) {
2019-04-16 19:56:22 +00:00
$banned_names = array_map ( 'strtolower' , $banned_names );
2019-03-12 09:27:46 +00:00
$normalized_email = strtolower ( $user_email );
list ( $email_local_part , $email_domain ) = explode ( '@' , $normalized_email );
foreach ( $banned_names as $banned_domain ) {
2019-04-16 19:56:22 +00:00
if ( ! $banned_domain ) {
2019-03-12 09:27:46 +00:00
continue ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
if ( $email_domain == $banned_domain ) {
$is_email_address_unsafe = true ;
break ;
}
$dotted_domain = " . $banned_domain " ;
if ( $dotted_domain === substr ( $normalized_email , - strlen ( $dotted_domain ) ) ) {
$is_email_address_unsafe = true ;
break ;
}
}
}
/**
* Filters whether an email address is unsafe .
*
* @ since 3.5 . 0
*
* @ param bool $is_email_address_unsafe Whether the email address is " unsafe " . Default false .
* @ param string $user_email User email address .
*/
return apply_filters ( 'is_email_address_unsafe' , $is_email_address_unsafe , $user_email );
}
/**
* Sanitize and validate data required for a user sign - up .
*
* Verifies the validity and uniqueness of user names and user email addresses ,
* and checks email addresses against admin - provided domain whitelists and blacklists .
*
* The { @ see 'wpmu_validate_user_signup' } hook provides an easy way to modify the sign - up
* process . The value $result , which is passed to the hook , contains both the user - provided
* info and the error messages created by the function . { @ see '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 ( 3.0 . 0 )
*
* @ global wpdb $wpdb WordPress database abstraction object .
*
* @ 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 .
*/
2019-04-16 19:56:22 +00:00
function wpmu_validate_user_signup ( $user_name , $user_email ) {
2019-03-12 09:27:46 +00:00
global $wpdb ;
$errors = new WP_Error ();
$orig_username = $user_name ;
2019-04-16 19:56:22 +00:00
$user_name = preg_replace ( '/\s+/' , '' , sanitize_user ( $user_name , true ) );
2019-03-12 09:27:46 +00:00
if ( $user_name != $orig_username || preg_match ( '/[^a-z0-9]/' , $user_name ) ) {
$errors -> add ( 'user_name' , __ ( 'Usernames can only contain lowercase letters (a-z) and numbers.' ) );
$user_name = $orig_username ;
}
$user_email = sanitize_email ( $user_email );
2019-04-16 19:56:22 +00:00
if ( empty ( $user_name ) ) {
$errors -> add ( 'user_name' , __ ( 'Please enter a username.' ) );
}
2019-03-12 09:27:46 +00:00
$illegal_names = get_site_option ( 'illegal_names' );
if ( ! is_array ( $illegal_names ) ) {
2019-04-16 19:56:22 +00:00
$illegal_names = array ( 'www' , 'web' , 'root' , 'admin' , 'main' , 'invite' , 'administrator' );
2019-03-12 09:27:46 +00:00
add_site_option ( 'illegal_names' , $illegal_names );
}
if ( in_array ( $user_name , $illegal_names ) ) {
2019-04-16 19:56:22 +00:00
$errors -> add ( 'user_name' , __ ( 'Sorry, that username is not allowed.' ) );
2019-03-12 09:27:46 +00:00
}
/** This filter is documented in wp-includes/user.php */
$illegal_logins = ( array ) apply_filters ( 'illegal_user_logins' , array () );
if ( in_array ( strtolower ( $user_name ), array_map ( 'strtolower' , $illegal_logins ) ) ) {
2019-04-16 19:56:22 +00:00
$errors -> add ( 'user_name' , __ ( 'Sorry, that username is not allowed.' ) );
2019-03-12 09:27:46 +00:00
}
if ( ! is_email ( $user_email ) ) {
$errors -> add ( 'user_email' , __ ( 'Please enter a valid email address.' ) );
} elseif ( is_email_address_unsafe ( $user_email ) ) {
$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.' ) );
}
2019-04-16 19:56:22 +00:00
if ( strlen ( $user_name ) < 4 ) {
$errors -> add ( 'user_name' , __ ( 'Username must be at least 4 characters.' ) );
}
2019-03-12 09:27:46 +00:00
if ( strlen ( $user_name ) > 60 ) {
$errors -> add ( 'user_name' , __ ( 'Username may not be longer than 60 characters.' ) );
}
// all numeric?
2019-04-16 19:56:22 +00:00
if ( preg_match ( '/^[0-9]*$/' , $user_name ) ) {
$errors -> add ( 'user_name' , __ ( 'Sorry, usernames must have letters too!' ) );
}
2019-03-12 09:27:46 +00:00
$limited_email_domains = get_site_option ( 'limited_email_domains' );
if ( is_array ( $limited_email_domains ) && ! empty ( $limited_email_domains ) ) {
2019-04-16 19:56:22 +00:00
$limited_email_domains = array_map ( 'strtolower' , $limited_email_domains );
$emaildomain = strtolower ( substr ( $user_email , 1 + strpos ( $user_email , '@' ) ) );
if ( ! in_array ( $emaildomain , $limited_email_domains , true ) ) {
$errors -> add ( 'user_email' , __ ( 'Sorry, that email address is not allowed!' ) );
2019-03-12 09:27:46 +00:00
}
}
// Check if the username has been used already.
2019-04-16 19:56:22 +00:00
if ( username_exists ( $user_name ) ) {
2019-03-12 09:27:46 +00:00
$errors -> add ( 'user_name' , __ ( 'Sorry, that username already exists!' ) );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
// Check if the email address has been used already.
2019-04-16 19:56:22 +00:00
if ( email_exists ( $user_email ) ) {
2019-03-12 09:27:46 +00:00
$errors -> add ( 'user_email' , __ ( 'Sorry, that email address is already used!' ) );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
// Has someone already signed up for this username?
2019-04-16 19:56:22 +00:00
$signup = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->signups WHERE user_login = %s " , $user_name ) );
2019-03-12 09:27:46 +00:00
if ( $signup != null ) {
2019-04-16 19:56:22 +00:00
$registered_at = mysql2date ( 'U' , $signup -> registered );
2019-05-08 07:05:39 +00:00
$now = time ();
2019-04-16 19:56:22 +00:00
$diff = $now - $registered_at ;
2019-03-12 09:27:46 +00:00
// If registered more than two days ago, cancel registration and let this signup go through.
2019-04-16 19:56:22 +00:00
if ( $diff > 2 * DAY_IN_SECONDS ) {
2019-03-12 09:27:46 +00:00
$wpdb -> delete ( $wpdb -> signups , array ( 'user_login' => $user_name ) );
2019-04-16 19:56:22 +00:00
} else {
$errors -> add ( 'user_name' , __ ( 'That username is currently reserved but may be available in a couple of days.' ) );
}
2019-03-12 09:27:46 +00:00
}
2019-04-16 19:56:22 +00:00
$signup = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->signups WHERE user_email = %s " , $user_email ) );
2019-03-12 09:27:46 +00:00
if ( $signup != null ) {
2019-05-08 07:05:39 +00:00
$diff = time () - mysql2date ( 'U' , $signup -> registered );
2019-03-12 09:27:46 +00:00
// If registered more than two days ago, cancel registration and let this signup go through.
2019-04-16 19:56:22 +00:00
if ( $diff > 2 * DAY_IN_SECONDS ) {
2019-03-12 09:27:46 +00:00
$wpdb -> delete ( $wpdb -> signups , array ( 'user_email' => $user_email ) );
2019-04-16 19:56:22 +00:00
} else {
$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.' ) );
}
2019-03-12 09:27:46 +00:00
}
2019-04-16 19:56:22 +00:00
$result = array (
'user_name' => $user_name ,
'orig_username' => $orig_username ,
'user_email' => $user_email ,
'errors' => $errors ,
);
2019-03-12 09:27:46 +00:00
/**
* Filters the validated user registration details .
*
* This does not allow you to override the username or email of the user during
* registration . The values are solely used for validation and error handling .
*
* @ since MU ( 3.0 . 0 )
*
* @ param array $result {
* The array of user name , email and the error messages .
*
* @ type string $user_name Sanitized and unique username .
* @ type string $orig_username Original username .
* @ type string $user_email User email address .
* @ type WP_Error $errors WP_Error object containing any errors found .
* }
*/
return apply_filters ( 'wpmu_validate_user_signup' , $result );
}
/**
* 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 .
*
* Filter { @ see 'wpmu_validate_blog_signup' } if you want to modify
* the way that WordPress validates new site signups .
*
* @ since MU ( 3.0 . 0 )
*
* @ global wpdb $wpdb
* @ global string $domain
*
* @ param string $blogname The blog name provided by the user . Must be unique .
* @ param string $blog_title The blog title provided by the user .
* @ param WP_User | string $user Optional . The user object to check against the new site name .
* @ return array Contains the new site data and error messages .
*/
function wpmu_validate_blog_signup ( $blogname , $blog_title , $user = '' ) {
global $wpdb , $domain ;
$current_network = get_network ();
2019-04-16 19:56:22 +00:00
$base = $current_network -> path ;
2019-03-12 09:27:46 +00:00
$blog_title = strip_tags ( $blog_title );
2019-04-16 19:56:22 +00:00
$errors = new WP_Error ();
2019-03-12 09:27:46 +00:00
$illegal_names = get_site_option ( 'illegal_names' );
if ( $illegal_names == false ) {
$illegal_names = array ( 'www' , 'web' , 'root' , 'admin' , 'main' , 'invite' , 'administrator' );
add_site_option ( 'illegal_names' , $illegal_names );
}
/*
* On sub dir installations , some names are so illegal , only a filter can
* spring them from jail .
*/
if ( ! is_subdomain_install () ) {
$illegal_names = array_merge ( $illegal_names , get_subdirectory_reserved_names () );
}
2019-04-16 19:56:22 +00:00
if ( empty ( $blogname ) ) {
$errors -> add ( 'blogname' , __ ( 'Please enter a site name.' ) );
}
2019-03-12 09:27:46 +00:00
if ( preg_match ( '/[^a-z0-9]+/' , $blogname ) ) {
$errors -> add ( 'blogname' , __ ( 'Site names can only contain lowercase letters (a-z) and numbers.' ) );
}
2019-04-16 19:56:22 +00:00
if ( in_array ( $blogname , $illegal_names ) ) {
$errors -> add ( 'blogname' , __ ( 'That name is not allowed.' ) );
}
2019-03-12 09:27:46 +00:00
/**
* Filters the minimum site name length required when validating a site signup .
*
* @ since 4.8 . 0
*
* @ param int $length The minimum site name length . Default 4.
*/
$minimum_site_name_length = apply_filters ( 'minimum_site_name_length' , 4 );
if ( strlen ( $blogname ) < $minimum_site_name_length ) {
/* translators: %s: minimum site name length */
$errors -> add ( 'blogname' , sprintf ( _n ( 'Site name must be at least %s character.' , 'Site name must be at least %s characters.' , $minimum_site_name_length ), number_format_i18n ( $minimum_site_name_length ) ) );
}
// do not allow users to create a blog that conflicts with a page on the main blog.
2019-04-16 19:56:22 +00:00
if ( ! is_subdomain_install () && $wpdb -> get_var ( $wpdb -> prepare ( 'SELECT post_name FROM ' . $wpdb -> get_blog_prefix ( $current_network -> site_id ) . " posts WHERE post_type = 'page' AND post_name = %s " , $blogname ) ) ) {
2019-03-12 09:27:46 +00:00
$errors -> add ( 'blogname' , __ ( 'Sorry, you may not use that site name.' ) );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
// all numeric?
2019-04-16 19:56:22 +00:00
if ( preg_match ( '/^[0-9]*$/' , $blogname ) ) {
$errors -> add ( 'blogname' , __ ( 'Sorry, site names must have letters too!' ) );
}
2019-03-12 09:27:46 +00:00
/**
* Filters the new site name during registration .
*
* The name is the site 's subdomain or the site' s subdirectory
* path depending on the network settings .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $blogname Site name .
*/
$blogname = apply_filters ( 'newblogname' , $blogname );
2019-04-16 19:56:22 +00:00
$blog_title = wp_unslash ( $blog_title );
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( empty ( $blog_title ) ) {
$errors -> add ( 'blog_title' , __ ( 'Please enter a site title.' ) );
}
2019-03-12 09:27:46 +00:00
// Check if the domain/path has been used already.
if ( is_subdomain_install () ) {
$mydomain = $blogname . '.' . preg_replace ( '|^www\.|' , '' , $domain );
2019-04-16 19:56:22 +00:00
$path = $base ;
2019-03-12 09:27:46 +00:00
} else {
$mydomain = " $domain " ;
2019-04-16 19:56:22 +00:00
$path = $base . $blogname . '/' ;
2019-03-12 09:27:46 +00:00
}
2019-04-16 19:56:22 +00:00
if ( domain_exists ( $mydomain , $path , $current_network -> id ) ) {
2019-03-12 09:27:46 +00:00
$errors -> add ( 'blogname' , __ ( 'Sorry, that site already exists!' ) );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
if ( username_exists ( $blogname ) ) {
2019-04-16 19:56:22 +00:00
if ( ! is_object ( $user ) || ( is_object ( $user ) && ( $user -> user_login != $blogname ) ) ) {
2019-03-12 09:27:46 +00:00
$errors -> add ( 'blogname' , __ ( 'Sorry, that site is reserved!' ) );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
}
// Has someone already signed up for this domain?
2019-04-16 19:56:22 +00:00
$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 ) ) {
2019-05-08 07:05:39 +00:00
$diff = time () - mysql2date ( 'U' , $signup -> registered );
2019-03-12 09:27:46 +00:00
// If registered more than two days ago, cancel registration and let this signup go through.
2019-04-16 19:56:22 +00:00
if ( $diff > 2 * DAY_IN_SECONDS ) {
$wpdb -> delete (
$wpdb -> signups ,
array (
'domain' => $mydomain ,
'path' => $path ,
)
);
} else {
$errors -> add ( 'blogname' , __ ( 'That site is currently reserved but may be available in a couple days.' ) );
}
2019-03-12 09:27:46 +00:00
}
2019-04-16 19:56:22 +00:00
$result = array (
'domain' => $mydomain ,
'path' => $path ,
'blogname' => $blogname ,
'blog_title' => $blog_title ,
'user' => $user ,
'errors' => $errors ,
);
2019-03-12 09:27:46 +00:00
/**
* Filters site details and error messages following registration .
*
* @ since MU ( 3.0 . 0 )
*
* @ param array $result {
* Array of domain , path , blog name , blog title , user and error messages .
*
* @ type string $domain Domain for the site .
* @ type string $path Path for the site . Used in subdirectory installations .
* @ type string $blogname The unique site name ( slug ) .
* @ type string $blog_title Blog title .
* @ type string | WP_User $user By default , an empty string . A user object if provided .
* @ type WP_Error $errors WP_Error containing any errors found .
* }
*/
return apply_filters ( 'wpmu_validate_blog_signup' , $result );
}
/**
* Record site signup information for future activation .
*
* @ since MU ( 3.0 . 0 )
*
* @ global wpdb $wpdb WordPress database abstraction object .
*
* @ 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 Optional . Signup meta data . By default , contains the requested privacy setting and lang_id .
*/
2019-04-16 19:56:22 +00:00
function wpmu_signup_blog ( $domain , $path , $title , $user , $user_email , $meta = array () ) {
2019-03-12 09:27:46 +00:00
global $wpdb ;
$key = substr ( md5 ( time () . wp_rand () . $domain ), 0 , 16 );
/**
* Filters the metadata for a site signup .
*
* The metadata will be serialized prior to storing it in the database .
*
* @ since 4.8 . 0
*
* @ param array $meta Signup meta data . Default empty array .
* @ 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 string $key The user ' s activation key .
*/
$meta = apply_filters ( 'signup_site_meta' , $meta , $domain , $path , $title , $user , $user_email , $key );
2019-04-16 19:56:22 +00:00
$wpdb -> insert (
$wpdb -> signups ,
array (
'domain' => $domain ,
'path' => $path ,
'title' => $title ,
'user_login' => $user ,
'user_email' => $user_email ,
'registered' => current_time ( 'mysql' , true ),
'activation_key' => $key ,
'meta' => serialize ( $meta ),
)
);
2019-03-12 09:27:46 +00:00
/**
* Fires after site signup information has been written to the database .
*
* @ since 4.4 . 0
*
* @ 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 string $key The user ' s activation key .
* @ param array $meta Signup meta data . By default , contains the requested privacy setting and lang_id .
*/
do_action ( 'after_signup_site' , $domain , $path , $title , $user , $user_email , $key , $meta );
}
/**
* Record user signup information for future activation .
*
* This function is used when user registration is open but
* new site registration is not .
*
* @ since MU ( 3.0 . 0 )
*
* @ global wpdb $wpdb WordPress database abstraction object .
*
* @ param string $user The user ' s requested login name .
* @ param string $user_email The user ' s email address .
* @ param array $meta Optional . Signup meta data . Default empty array .
*/
function wpmu_signup_user ( $user , $user_email , $meta = array () ) {
global $wpdb ;
// Format data
2019-04-16 19:56:22 +00:00
$user = preg_replace ( '/\s+/' , '' , sanitize_user ( $user , true ) );
2019-03-12 09:27:46 +00:00
$user_email = sanitize_email ( $user_email );
2019-04-16 19:56:22 +00:00
$key = substr ( md5 ( time () . wp_rand () . $user_email ), 0 , 16 );
2019-03-12 09:27:46 +00:00
/**
* Filters the metadata for a user signup .
*
* The metadata will be serialized prior to storing it in the database .
*
* @ since 4.8 . 0
*
* @ param array $meta Signup meta data . Default empty array .
* @ param string $user The user ' s requested login name .
* @ param string $user_email The user ' s email address .
* @ param string $key The user ' s activation key .
*/
$meta = apply_filters ( 'signup_user_meta' , $meta , $user , $user_email , $key );
2019-04-16 19:56:22 +00:00
$wpdb -> insert (
$wpdb -> signups ,
array (
'domain' => '' ,
'path' => '' ,
'title' => '' ,
'user_login' => $user ,
'user_email' => $user_email ,
'registered' => current_time ( 'mysql' , true ),
'activation_key' => $key ,
'meta' => serialize ( $meta ),
)
);
2019-03-12 09:27:46 +00:00
/**
* Fires after a user ' s signup information has been written to the database .
*
* @ since 4.4 . 0
*
* @ param string $user The user ' s requested login name .
* @ param string $user_email The user ' s email address .
* @ param string $key The user ' s activation key .
* @ param array $meta Signup meta data . Default empty array .
*/
do_action ( 'after_signup_user' , $user , $user_email , $key , $meta );
}
/**
* Send a confirmation request email to a user when they sign up for a new site . The new site will not become active
* until the confirmation link is clicked .
*
* This is the notification function used when site registration
* is enabled .
*
* Filter { @ see 'wpmu_signup_blog_notification' } to bypass this function or
* replace it with your own notification behavior .
*
* Filter { @ see 'wpmu_signup_blog_notification_email' } and
* { @ see 'wpmu_signup_blog_notification_subject' } to change the content
* and subject line of the email sent to newly registered users .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $domain The new blog domain .
* @ param string $path The new blog path .
* @ param string $title The site title .
* @ param string $user_login The user ' s login name .
* @ param string $user_email The user ' s email address .
* @ param string $key The activation key created in wpmu_signup_blog ()
* @ param array $meta Optional . Signup meta data . By default , contains the requested privacy setting and lang_id .
* @ return bool
*/
function wpmu_signup_blog_notification ( $domain , $path , $title , $user_login , $user_email , $key , $meta = array () ) {
/**
* Filters whether to bypass the new site email notification .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string | bool $domain Site domain .
* @ param string $path Site path .
* @ param string $title Site title .
* @ param string $user_login User login name .
* @ param string $user_email User email address .
* @ param string $key Activation key created in wpmu_signup_blog () .
* @ param array $meta Signup meta data . By default , contains the requested privacy setting and lang_id .
*/
if ( ! apply_filters ( 'wpmu_signup_blog_notification' , $domain , $path , $title , $user_login , $user_email , $key , $meta ) ) {
return false ;
}
// Send email with activation link.
2019-04-16 19:56:22 +00:00
if ( ! is_subdomain_install () || get_current_network_id () != 1 ) {
$activate_url = network_site_url ( " wp-activate.php?key= $key " );
} else {
2019-03-12 09:27:46 +00:00
$activate_url = " http:// { $domain } { $path } wp-activate.php?key= $key " ; // @todo use *_url() API
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
$activate_url = esc_url ( $activate_url );
$admin_email = get_site_option ( 'admin_email' );
if ( $admin_email == '' ) {
2019-03-12 09:27:46 +00:00
$admin_email = 'support@' . $_SERVER [ 'SERVER_NAME' ];
2019-04-16 19:56:22 +00:00
}
$from_name = get_site_option ( 'site_name' ) == '' ? 'WordPress' : esc_html ( get_site_option ( 'site_name' ) );
$message_headers = " From: \" { $from_name } \" < { $admin_email } > \n " . 'Content-Type: text/plain; charset="' . get_option ( 'blog_charset' ) . " \" \n " ;
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
$user = get_user_by ( 'login' , $user_login );
2019-03-12 09:27:46 +00:00
$switched_locale = switch_to_locale ( get_user_locale ( $user ) );
$message = sprintf (
/**
* Filters the message content of the new blog notification email .
*
* Content should be formatted for transmission via wp_mail () .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $content Content of the notification email .
* @ param string $domain Site domain .
* @ param string $path Site path .
* @ param string $title Site title .
* @ param string $user_login User login name .
* @ param string $user_email User email address .
* @ param string $key Activation key created in wpmu_signup_blog () .
* @ param array $meta Signup meta data . By default , contains the requested privacy setting and lang_id .
*/
2019-04-16 19:56:22 +00:00
apply_filters (
'wpmu_signup_blog_notification_email' ,
__ ( " To activate your blog, please click the following link: \n \n %1 \$ 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 %2 \$ s " ),
$domain ,
$path ,
$title ,
$user_login ,
$user_email ,
$key ,
$meta
2019-03-12 09:27:46 +00:00
),
$activate_url ,
esc_url ( " http:// { $domain } { $path } " ),
$key
);
// TODO: Don't hard code activation link.
$subject = sprintf (
/**
* Filters the subject of the new blog notification email .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $subject Subject of the notification email .
* @ param string $domain Site domain .
* @ param string $path Site path .
* @ param string $title Site title .
* @ param string $user_login User login name .
* @ param string $user_email User email address .
* @ param string $key Activation key created in wpmu_signup_blog () .
* @ param array $meta Signup meta data . By default , contains the requested privacy setting and lang_id .
*/
2019-04-16 19:56:22 +00:00
apply_filters (
'wpmu_signup_blog_notification_subject' ,
2019-03-12 09:27:46 +00:00
/* translators: New site notification email subject. 1: Network name, 2: New site URL */
_x ( '[%1$s] Activate %2$s' , 'New site notification email subject' ),
2019-04-16 19:56:22 +00:00
$domain ,
$path ,
$title ,
$user_login ,
$user_email ,
$key ,
$meta
2019-03-12 09:27:46 +00:00
),
$from_name ,
esc_url ( 'http://' . $domain . $path )
);
wp_mail ( $user_email , wp_specialchars_decode ( $subject ), $message , $message_headers );
if ( $switched_locale ) {
restore_previous_locale ();
}
return true ;
}
/**
* Send a confirmation request email to a user when they sign up for a new user account ( without signing up for a site
* at the same time ) . The user account will not become active until the confirmation link is clicked .
*
* This is the notification function used when no new site has
* been requested .
*
* Filter { @ see 'wpmu_signup_user_notification' } to bypass this function or
* replace it with your own notification behavior .
*
* Filter { @ see 'wpmu_signup_user_notification_email' } and
* { @ see 'wpmu_signup_user_notification_subject' } to change the content
* and subject line of the email sent to newly registered users .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $user_login The user ' s login name .
* @ param string $user_email The user ' s email address .
* @ param string $key The activation key created in wpmu_signup_user ()
* @ param array $meta Optional . Signup meta data . Default empty array .
* @ return bool
*/
function wpmu_signup_user_notification ( $user_login , $user_email , $key , $meta = array () ) {
/**
* Filters whether to bypass the email notification for new user sign - up .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $user_login User login name .
* @ param string $user_email User email address .
* @ param string $key Activation key created in wpmu_signup_user () .
* @ param array $meta Signup meta data . Default empty array .
*/
2019-04-16 19:56:22 +00:00
if ( ! apply_filters ( 'wpmu_signup_user_notification' , $user_login , $user_email , $key , $meta ) ) {
2019-03-12 09:27:46 +00:00
return false ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
$user = get_user_by ( 'login' , $user_login );
2019-03-12 09:27:46 +00:00
$switched_locale = switch_to_locale ( get_user_locale ( $user ) );
// Send email with activation link.
$admin_email = get_site_option ( 'admin_email' );
2019-04-16 19:56:22 +00:00
if ( $admin_email == '' ) {
2019-03-12 09:27:46 +00:00
$admin_email = 'support@' . $_SERVER [ 'SERVER_NAME' ];
2019-04-16 19:56:22 +00:00
}
$from_name = get_site_option ( 'site_name' ) == '' ? 'WordPress' : esc_html ( get_site_option ( 'site_name' ) );
$message_headers = " From: \" { $from_name } \" < { $admin_email } > \n " . 'Content-Type: text/plain; charset="' . get_option ( 'blog_charset' ) . " \" \n " ;
$message = sprintf (
2019-03-12 09:27:46 +00:00
/**
* Filters the content of the notification email for new user sign - up .
*
* Content should be formatted for transmission via wp_mail () .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $content Content of the notification email .
* @ param string $user_login User login name .
* @ param string $user_email User email address .
* @ param string $key Activation key created in wpmu_signup_user () .
* @ param array $meta Signup meta data . Default empty array .
*/
2019-04-16 19:56:22 +00:00
apply_filters (
'wpmu_signup_user_notification_email' ,
2019-03-12 09:27:46 +00:00
__ ( " 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. " ),
2019-04-16 19:56:22 +00:00
$user_login ,
$user_email ,
$key ,
$meta
2019-03-12 09:27:46 +00:00
),
site_url ( " wp-activate.php?key= $key " )
);
// TODO: Don't hard code activation link.
$subject = sprintf (
/**
* Filters the subject of the notification email of new user signup .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $subject Subject of the notification email .
* @ param string $user_login User login name .
* @ param string $user_email User email address .
* @ param string $key Activation key created in wpmu_signup_user () .
* @ param array $meta Signup meta data . Default empty array .
*/
2019-04-16 19:56:22 +00:00
apply_filters (
'wpmu_signup_user_notification_subject' ,
2019-03-12 09:27:46 +00:00
/* translators: New user notification email subject. 1: Network name, 2: New user login */
_x ( '[%1$s] Activate %2$s' , 'New user notification email subject' ),
2019-04-16 19:56:22 +00:00
$user_login ,
$user_email ,
$key ,
$meta
2019-03-12 09:27:46 +00:00
),
$from_name ,
$user_login
);
wp_mail ( $user_email , wp_specialchars_decode ( $subject ), $message , $message_headers );
if ( $switched_locale ) {
restore_previous_locale ();
}
return true ;
}
/**
* Activate a signup .
*
* Hook to { @ see 'wpmu_activate_user' } or { @ see '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 ( 3.0 . 0 )
*
* @ global wpdb $wpdb WordPress database abstraction object .
*
* @ param string $key The activation key provided to the user .
* @ return array | WP_Error An array containing information about the activated user and / or blog
*/
2019-04-16 19:56:22 +00:00
function wpmu_activate_signup ( $key ) {
2019-03-12 09:27:46 +00:00
global $wpdb ;
2019-04-16 19:56:22 +00:00
$signup = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->signups WHERE activation_key = %s " , $key ) );
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( empty ( $signup ) ) {
2019-03-12 09:27:46 +00:00
return new WP_Error ( 'invalid_key' , __ ( 'Invalid activation key.' ) );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
if ( $signup -> active ) {
2019-04-16 19:56:22 +00:00
if ( empty ( $signup -> domain ) ) {
2019-03-12 09:27:46 +00:00
return new WP_Error ( 'already_active' , __ ( 'The user is already active.' ), $signup );
2019-04-16 19:56:22 +00:00
} else {
2019-03-12 09:27:46 +00:00
return new WP_Error ( 'already_active' , __ ( 'The site is already active.' ), $signup );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
}
2019-04-16 19:56:22 +00:00
$meta = maybe_unserialize ( $signup -> meta );
2019-03-12 09:27:46 +00:00
$password = wp_generate_password ( 12 , false );
2019-04-16 19:56:22 +00:00
$user_id = username_exists ( $signup -> user_login );
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( ! $user_id ) {
$user_id = wpmu_create_user ( $signup -> user_login , $password , $signup -> user_email );
} else {
2019-03-12 09:27:46 +00:00
$user_already_exists = true ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( ! $user_id ) {
return new WP_Error ( 'create_user' , __ ( 'Could not create user' ), $signup );
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
$now = current_time ( 'mysql' , true );
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( empty ( $signup -> domain ) ) {
$wpdb -> update (
$wpdb -> signups ,
array (
'active' => 1 ,
'activated' => $now ,
),
array ( 'activation_key' => $key )
);
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( isset ( $user_already_exists ) ) {
return new WP_Error ( 'user_already_exists' , __ ( 'That username is already activated.' ), $signup );
}
2019-03-12 09:27:46 +00:00
/**
* Fires immediately after a new user is activated .
*
* @ since MU ( 3.0 . 0 )
*
* @ param int $user_id User ID .
* @ param int $password User password .
* @ param array $meta Signup meta data .
*/
do_action ( 'wpmu_activate_user' , $user_id , $password , $meta );
2019-04-16 19:56:22 +00:00
return array (
'user_id' => $user_id ,
'password' => $password ,
'meta' => $meta ,
);
2019-03-12 09:27:46 +00:00
}
$blog_id = wpmu_create_blog ( $signup -> domain , $signup -> path , $signup -> title , $user_id , $meta , get_current_network_id () );
// TODO: What to do if we create a user but cannot create a blog?
2019-04-16 19:56:22 +00:00
if ( is_wp_error ( $blog_id ) ) {
2019-03-12 09:27:46 +00:00
// If blog is taken, that means a previous attempt to activate this blog failed in between creating the blog and
// setting the activation flag. Let's just set the active flag and instruct the user to reset their password.
if ( 'blog_taken' == $blog_id -> get_error_code () ) {
$blog_id -> add_data ( $signup );
2019-04-16 19:56:22 +00:00
$wpdb -> update (
$wpdb -> signups ,
array (
'active' => 1 ,
'activated' => $now ,
),
array ( 'activation_key' => $key )
);
2019-03-12 09:27:46 +00:00
}
return $blog_id ;
}
2019-04-16 19:56:22 +00:00
$wpdb -> update (
$wpdb -> signups ,
array (
'active' => 1 ,
'activated' => $now ,
),
array ( 'activation_key' => $key )
);
2019-03-12 09:27:46 +00:00
/**
* Fires immediately after a site is activated .
*
* @ since MU ( 3.0 . 0 )
*
* @ param int $blog_id Blog ID .
* @ param int $user_id User ID .
* @ param int $password User password .
* @ param string $signup_title Site title .
* @ param array $meta Signup meta data . By default , contains the requested privacy setting and lang_id .
*/
do_action ( 'wpmu_activate_blog' , $blog_id , $user_id , $password , $signup -> title , $meta );
2019-04-16 19:56:22 +00:00
return array (
'blog_id' => $blog_id ,
'user_id' => $user_id ,
'password' => $password ,
'title' => $signup -> title ,
'meta' => $meta ,
);
2019-03-12 09:27:46 +00: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 { @ see 'wpmu_new_user' } for events
* that should affect all new users , but only on Multisite ( otherwise
* use { @ see 'user_register' }) .
*
* @ since MU ( 3.0 . 0 )
*
* @ 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 int | false Returns false on failure , or int $user_id on success
*/
function wpmu_create_user ( $user_name , $password , $email ) {
$user_name = preg_replace ( '/\s+/' , '' , sanitize_user ( $user_name , true ) );
$user_id = wp_create_user ( $user_name , $password , $email );
2019-04-16 19:56:22 +00:00
if ( is_wp_error ( $user_id ) ) {
2019-03-12 09:27:46 +00:00
return false ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
// Newly created users have no roles or caps until they are added to a blog.
delete_user_option ( $user_id , 'capabilities' );
delete_user_option ( $user_id , 'user_level' );
/**
* Fires immediately after a new user is created .
*
* @ since MU ( 3.0 . 0 )
*
* @ param int $user_id User ID .
*/
do_action ( 'wpmu_new_user' , $user_id );
return $user_id ;
}
/**
* 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 { @ see 'wpmu_new_blog' }
* for events that should affect all new sites .
*
* On subdirectory installations , $domain is the same as the main site ' s
* domain , and the path is the subdirectory name ( eg 'example.com'
* and '/blog1/' ) . On subdomain installations , $domain is the new subdomain +
* root domain ( eg 'blog1.example.com' ), and $path is '/' .
*
* @ since MU ( 3.0 . 0 )
*
* @ 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 .
2019-04-16 19:56:22 +00:00
* @ param array $options Optional . Array of key => value pairs used to set initial site options .
2019-03-12 09:27:46 +00:00
* If valid status keys are included ( 'public' , 'archived' , 'mature' ,
* 'spam' , 'deleted' , or 'lang_id' ) the given site status ( es ) will be
* updated . Otherwise , keys and values will be used to set options for
* the new site . Default empty array .
* @ param int $network_id Optional . Network ID . Only relevant on multi - network installations .
* @ return int | WP_Error Returns WP_Error object on failure , the new site ID on success .
*/
2019-04-16 19:56:22 +00:00
function wpmu_create_blog ( $domain , $path , $title , $user_id , $options = array (), $network_id = 1 ) {
2019-03-12 09:27:46 +00:00
$defaults = array (
'public' => 0 ,
);
2019-04-16 19:56:22 +00:00
$options = wp_parse_args ( $options , $defaults );
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
$title = strip_tags ( $title );
2019-03-12 09:27:46 +00:00
$user_id = ( int ) $user_id ;
// Check if the domain has been used already. We should return an error message.
2019-04-16 19:56:22 +00:00
if ( domain_exists ( $domain , $path , $network_id ) ) {
2019-03-12 09:27:46 +00:00
return new WP_Error ( 'blog_taken' , __ ( 'Sorry, that site already exists!' ) );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
if ( ! wp_installing () ) {
wp_installing ( true );
}
2019-04-16 19:56:22 +00:00
$site_data_whitelist = array ( 'public' , 'archived' , 'mature' , 'spam' , 'deleted' , 'lang_id' );
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
$site_data = array_merge (
array (
'domain' => $domain ,
'path' => $path ,
'network_id' => $network_id ,
),
array_intersect_key ( $options , array_flip ( $site_data_whitelist ) )
);
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
// Data to pass to wp_initialize_site().
$site_initialization_data = array (
'title' => $title ,
'user_id' => $user_id ,
'options' => array_diff_key ( $options , array_flip ( $site_data_whitelist ) ),
);
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
$blog_id = wp_insert_site ( array_merge ( $site_data , $site_initialization_data ) );
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( is_wp_error ( $blog_id ) ) {
return $blog_id ;
}
2019-03-12 09:27:46 +00:00
wp_cache_set ( 'last_changed' , microtime (), 'sites' );
return $blog_id ;
}
/**
* Notifies the network admin that a new site has been activated .
*
* Filter { @ see 'newblog_notify_siteadmin' } to change the content of
* the notification email .
*
* @ since MU ( 3.0 . 0 )
2019-04-16 19:56:22 +00:00
* @ since 5.1 . 0 $blog_id now supports input from the { @ see 'wp_initialize_site' } action .
2019-03-12 09:27:46 +00:00
*
2019-04-16 19:56:22 +00:00
* @ param WP_Site | int $blog_id The new site ' s object or ID .
* @ param string $deprecated Not used .
2019-03-12 09:27:46 +00:00
* @ return bool
*/
function newblog_notify_siteadmin ( $blog_id , $deprecated = '' ) {
2019-04-16 19:56:22 +00:00
if ( is_object ( $blog_id ) ) {
$blog_id = $blog_id -> blog_id ;
}
if ( get_site_option ( 'registrationnotification' ) != 'yes' ) {
2019-03-12 09:27:46 +00:00
return false ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
$email = get_site_option ( 'admin_email' );
2019-04-16 19:56:22 +00:00
if ( is_email ( $email ) == false ) {
2019-03-12 09:27:46 +00:00
return false ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
$options_site_url = esc_url ( network_admin_url ( 'settings.php' ) );
2019-03-12 09:27:46 +00:00
switch_to_blog ( $blog_id );
$blogname = get_option ( 'blogname' );
2019-04-16 19:56:22 +00:00
$siteurl = site_url ();
2019-03-12 09:27:46 +00:00
restore_current_blog ();
/* translators: New site notification email. 1: Site URL, 2: User IP address, 3: Settings screen URL */
2019-04-16 19:56:22 +00:00
$msg = sprintf (
__ (
' New Site : % 1 $s
2019-03-12 09:27:46 +00:00
URL : % 2 $s
Remote IP address : % 3 $s
2019-04-16 19:56:22 +00:00
Disable these notifications : % 4 $s '
),
$blogname ,
$siteurl ,
wp_unslash ( $_SERVER [ 'REMOTE_ADDR' ] ),
$options_site_url
);
2019-03-12 09:27:46 +00:00
/**
* Filters the message body of the new site activation email sent
* to the network administrator .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $msg Email body .
*/
$msg = apply_filters ( 'newblog_notify_siteadmin' , $msg );
wp_mail ( $email , sprintf ( __ ( 'New Site Registration: %s' ), $siteurl ), $msg );
return true ;
}
/**
* Notifies the network admin that a new user has been activated .
*
* Filter { @ see 'newuser_notify_siteadmin' } to change the content of
* the notification email .
*
* @ since MU ( 3.0 . 0 )
*
* @ param int $user_id The new user ' s ID .
* @ return bool
*/
function newuser_notify_siteadmin ( $user_id ) {
2019-04-16 19:56:22 +00:00
if ( get_site_option ( 'registrationnotification' ) != 'yes' ) {
2019-03-12 09:27:46 +00:00
return false ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
$email = get_site_option ( 'admin_email' );
2019-04-16 19:56:22 +00:00
if ( is_email ( $email ) == false ) {
2019-03-12 09:27:46 +00:00
return false ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
$user = get_userdata ( $user_id );
2019-04-16 19:56:22 +00:00
$options_site_url = esc_url ( network_admin_url ( 'settings.php' ) );
2019-03-12 09:27:46 +00:00
/* translators: New user notification email. 1: User login, 2: User IP address, 3: Settings screen URL */
2019-04-16 19:56:22 +00:00
$msg = sprintf (
__ (
' New User : % 1 $s
2019-03-12 09:27:46 +00:00
Remote IP address : % 2 $s
2019-04-16 19:56:22 +00:00
Disable these notifications : % 3 $s '
),
$user -> user_login ,
wp_unslash ( $_SERVER [ 'REMOTE_ADDR' ] ),
$options_site_url
);
2019-03-12 09:27:46 +00:00
/**
* Filters the message body of the new user activation email sent
* to the network administrator .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $msg Email body .
* @ param WP_User $user WP_User instance of the new user .
*/
$msg = apply_filters ( 'newuser_notify_siteadmin' , $msg , $user );
2019-04-16 19:56:22 +00:00
wp_mail ( $email , sprintf ( __ ( 'New User Registration: %s' ), $user -> user_login ), $msg );
2019-03-12 09:27:46 +00:00
return true ;
}
/**
* Checks whether a site name is already taken .
*
* The name is the site 's subdomain or the site' s subdirectory
* path depending on the network settings .
*
* Used during the new site registration process to ensure
* that each site name is unique .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $domain The domain to be checked .
* @ param string $path The path to be checked .
* @ param int $network_id Optional . Network ID . Relevant only on multi - network installations .
* @ return int | null The site ID if the site name exists , null otherwise .
*/
function domain_exists ( $domain , $path , $network_id = 1 ) {
2019-04-16 19:56:22 +00:00
$path = trailingslashit ( $path );
$args = array (
2019-05-08 07:05:39 +00:00
'network_id' => $network_id ,
'domain' => $domain ,
'path' => $path ,
'fields' => 'ids' ,
'number' => 1 ,
'update_site_meta_cache' => false ,
2019-03-12 09:27:46 +00:00
);
$result = get_sites ( $args );
$result = array_shift ( $result );
/**
* Filters whether a site name is taken .
*
* The name is the site 's subdomain or the site' s subdirectory
* path depending on the network settings .
*
* @ since 3.5 . 0
*
* @ param int | null $result The site ID if the site name exists , null otherwise .
* @ param string $domain Domain to be checked .
* @ param string $path Path to be checked .
* @ param int $network_id Network ID . Relevant only on multi - network installations .
*/
return apply_filters ( 'domain_exists' , $result , $domain , $path , $network_id );
}
/**
* Notify a user that their blog activation has been successful .
*
* Filter { @ see 'wpmu_welcome_notification' } to disable or bypass .
*
* Filter { @ see 'update_welcome_email' } and { @ see 'update_welcome_subject' } to
* modify the content and subject line of the notification email .
*
* @ since MU ( 3.0 . 0 )
*
* @ param int $blog_id Blog ID .
* @ param int $user_id User ID .
* @ param string $password User password .
* @ param string $title Site title .
* @ param array $meta Optional . Signup meta data . By default , contains the requested privacy setting and lang_id .
* @ return bool
*/
function wpmu_welcome_notification ( $blog_id , $user_id , $password , $title , $meta = array () ) {
$current_network = get_network ();
/**
* Filters whether to bypass the welcome email after site activation .
*
* Returning false disables the welcome email .
*
* @ since MU ( 3.0 . 0 )
*
* @ param int | bool $blog_id Blog ID .
* @ param int $user_id User ID .
* @ param string $password User password .
* @ param string $title Site title .
* @ param array $meta Signup meta data . By default , contains the requested privacy setting and lang_id .
*/
2019-04-16 19:56:22 +00:00
if ( ! apply_filters ( 'wpmu_welcome_notification' , $blog_id , $user_id , $password , $title , $meta ) ) {
2019-03-12 09:27:46 +00:00
return false ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
$user = get_userdata ( $user_id );
$switched_locale = switch_to_locale ( get_user_locale ( $user ) );
$welcome_email = get_site_option ( 'welcome_email' );
if ( $welcome_email == false ) {
/* translators: Do not translate USERNAME, SITE_NAME, BLOG_URL, PASSWORD: those are placeholders. */
2019-04-16 19:56:22 +00:00
$welcome_email = __ (
' Howdy USERNAME ,
2019-03-12 09:27:46 +00:00
Your new SITE_NAME site has been successfully set up at :
BLOG_URL
You can log in to the administrator account with the following information :
Username : USERNAME
Password : PASSWORD
Log in here : BLOG_URLwp - login . php
We hope you enjoy your new site . Thanks !
2019-04-16 19:56:22 +00:00
-- The Team @ SITE_NAME '
);
2019-03-12 09:27:46 +00:00
}
2019-04-16 19:56:22 +00:00
$url = get_blogaddress_by_id ( $blog_id );
2019-03-12 09:27:46 +00:00
$welcome_email = str_replace ( 'SITE_NAME' , $current_network -> 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 );
/**
* Filters the content of the welcome email after site activation .
*
* Content should be formatted for transmission via wp_mail () .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $welcome_email Message body of the email .
* @ param int $blog_id Blog ID .
* @ param int $user_id User ID .
* @ param string $password User password .
* @ param string $title Site title .
* @ param array $meta Signup meta data . By default , contains the requested privacy setting and lang_id .
*/
$welcome_email = apply_filters ( 'update_welcome_email' , $welcome_email , $blog_id , $user_id , $password , $title , $meta );
2019-04-16 19:56:22 +00:00
$admin_email = get_site_option ( 'admin_email' );
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( $admin_email == '' ) {
2019-03-12 09:27:46 +00:00
$admin_email = 'support@' . $_SERVER [ 'SERVER_NAME' ];
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
$from_name = get_site_option ( 'site_name' ) == '' ? 'WordPress' : esc_html ( get_site_option ( 'site_name' ) );
$message_headers = " From: \" { $from_name } \" < { $admin_email } > \n " . 'Content-Type: text/plain; charset="' . get_option ( 'blog_charset' ) . " \" \n " ;
$message = $welcome_email ;
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( empty ( $current_network -> site_name ) ) {
2019-03-12 09:27:46 +00:00
$current_network -> site_name = 'WordPress' ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
/* translators: New site notification email subject. 1: Network name, 2: New site name */
$subject = __ ( 'New %1$s Site: %2$s' );
/**
* Filters the subject of the welcome email after site activation .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $subject Subject of the email .
*/
$subject = apply_filters ( 'update_welcome_subject' , sprintf ( $subject , $current_network -> site_name , wp_unslash ( $title ) ) );
wp_mail ( $user -> user_email , wp_specialchars_decode ( $subject ), $message , $message_headers );
if ( $switched_locale ) {
restore_previous_locale ();
}
return true ;
}
/**
* Notify a user that their account activation has been successful .
*
* Filter { @ see 'wpmu_welcome_user_notification' } to disable or bypass .
*
* Filter { @ see 'update_welcome_user_email' } and { @ see 'update_welcome_user_subject' } to
* modify the content and subject line of the notification email .
*
* @ since MU ( 3.0 . 0 )
*
* @ param int $user_id User ID .
* @ param string $password User password .
* @ param array $meta Optional . Signup meta data . Default empty array .
* @ return bool
*/
function wpmu_welcome_user_notification ( $user_id , $password , $meta = array () ) {
$current_network = get_network ();
/**
2019-04-16 19:56:22 +00:00
* Filters whether to bypass the welcome email after user activation .
2019-03-12 09:27:46 +00:00
*
* Returning false disables the welcome email .
*
* @ since MU ( 3.0 . 0 )
*
* @ param int $user_id User ID .
* @ param string $password User password .
* @ param array $meta Signup meta data . Default empty array .
*/
2019-04-16 19:56:22 +00:00
if ( ! apply_filters ( 'wpmu_welcome_user_notification' , $user_id , $password , $meta ) ) {
2019-03-12 09:27:46 +00:00
return false ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
$welcome_email = get_site_option ( 'welcome_user_email' );
$user = get_userdata ( $user_id );
$switched_locale = switch_to_locale ( get_user_locale ( $user ) );
/**
* Filters the content of the welcome email after user activation .
*
* Content should be formatted for transmission via wp_mail () .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $welcome_email The message body of the account activation success email .
* @ param int $user_id User ID .
* @ param string $password User password .
* @ param array $meta Signup meta data . Default empty array .
*/
$welcome_email = apply_filters ( 'update_welcome_user_email' , $welcome_email , $user_id , $password , $meta );
$welcome_email = str_replace ( 'SITE_NAME' , $current_network -> 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 );
$admin_email = get_site_option ( 'admin_email' );
2019-04-16 19:56:22 +00:00
if ( $admin_email == '' ) {
2019-03-12 09:27:46 +00:00
$admin_email = 'support@' . $_SERVER [ 'SERVER_NAME' ];
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
$from_name = get_site_option ( 'site_name' ) == '' ? 'WordPress' : esc_html ( get_site_option ( 'site_name' ) );
$message_headers = " From: \" { $from_name } \" < { $admin_email } > \n " . 'Content-Type: text/plain; charset="' . get_option ( 'blog_charset' ) . " \" \n " ;
$message = $welcome_email ;
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( empty ( $current_network -> site_name ) ) {
2019-03-12 09:27:46 +00:00
$current_network -> site_name = 'WordPress' ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
/* translators: New user notification email subject. 1: Network name, 2: New user login */
$subject = __ ( 'New %1$s User: %2$s' );
/**
* Filters the subject of the welcome email after user activation .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $subject Subject of the email .
*/
2019-04-16 19:56:22 +00:00
$subject = apply_filters ( 'update_welcome_user_subject' , sprintf ( $subject , $current_network -> site_name , $user -> user_login ) );
2019-03-12 09:27:46 +00:00
wp_mail ( $user -> user_email , wp_specialchars_decode ( $subject ), $message , $message_headers );
if ( $switched_locale ) {
restore_previous_locale ();
}
return true ;
}
/**
* Get the current network .
*
* Returns an object containing the 'id' , 'domain' , 'path' , and 'site_name'
* properties of the network being viewed .
*
* @ see wpmu_current_site ()
*
* @ since MU ( 3.0 . 0 )
*
* @ global WP_Network $current_site
*
* @ return WP_Network
*/
function get_current_site () {
global $current_site ;
return $current_site ;
}
/**
* 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 ( 3.0 . 0 )
*
* @ global wpdb $wpdb WordPress database abstraction object .
*
* @ param int $user_id
* @ return array Contains the blog_id , post_id , post_date_gmt , and post_gmt_ts
*/
function get_most_recent_post_of_user ( $user_id ) {
global $wpdb ;
2019-04-16 19:56:22 +00:00
$user_blogs = get_blogs_of_user ( ( int ) $user_id );
2019-03-12 09:27:46 +00:00
$most_recent_post = array ();
// Walk through each blog and get the most recent post
// published by $user_id
foreach ( ( array ) $user_blogs as $blog ) {
2019-04-16 19:56:22 +00: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 );
2019-03-12 09:27:46 +00:00
// Make sure we found a post
2019-04-16 19:56:22 +00:00
if ( isset ( $recent_post [ 'ID' ] ) ) {
$post_gmt_ts = strtotime ( $recent_post [ 'post_date_gmt' ] );
2019-03-12 09:27:46 +00:00
// 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.
2019-04-16 19:56:22 +00:00
if ( ! isset ( $most_recent_post [ 'post_gmt_ts' ] ) || ( $post_gmt_ts > $most_recent_post [ 'post_gmt_ts' ] ) ) {
2019-03-12 09:27:46 +00:00
$most_recent_post = array (
2019-04-16 19:56:22 +00:00
'blog_id' => $blog -> userblog_id ,
'post_id' => $recent_post [ 'ID' ],
'post_date_gmt' => $recent_post [ 'post_date_gmt' ],
'post_gmt_ts' => $post_gmt_ts ,
2019-03-12 09:27:46 +00:00
);
}
}
}
return $most_recent_post ;
}
// Misc functions
/**
* Check an array of MIME types against a whitelist .
*
* WordPress ships with a set of allowed upload filetypes ,
* which is defined in wp - includes / functions . php in
* get_allowed_mime_types () . This function is used to filter
* that list against the filetype whitelist provided by Multisite
* Super Admins at wp - admin / network / settings . php .
*
* @ since MU ( 3.0 . 0 )
*
* @ param array $mimes
* @ return array
*/
function check_upload_mimes ( $mimes ) {
2019-04-16 19:56:22 +00:00
$site_exts = explode ( ' ' , get_site_option ( 'upload_filetypes' , 'jpg jpeg png gif' ) );
2019-03-12 09:27:46 +00:00
$site_mimes = array ();
foreach ( $site_exts as $ext ) {
foreach ( $mimes as $ext_pattern => $mime ) {
2019-04-16 19:56:22 +00:00
if ( $ext != '' && strpos ( $ext_pattern , $ext ) !== false ) {
$site_mimes [ $ext_pattern ] = $mime ;
}
2019-03-12 09:27:46 +00:00
}
}
return $site_mimes ;
}
/**
* 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_site () . This function is called when posts are published
* or unpublished to make sure the count stays current .
*
* @ since MU ( 3.0 . 0 )
*
* @ global wpdb $wpdb WordPress database abstraction object .
*
* @ param string $deprecated Not used .
*/
function update_posts_count ( $deprecated = '' ) {
global $wpdb ;
update_option ( 'post_count' , ( int ) $wpdb -> get_var ( " SELECT COUNT(ID) FROM { $wpdb -> posts } WHERE post_status = 'publish' and post_type = 'post' " ) );
}
/**
* Logs the user email , IP , and registration date of a new site .
*
* @ since MU ( 3.0 . 0 )
2019-04-16 19:56:22 +00:00
* @ since 5.1 . 0 Parameters now support input from the { @ see 'wp_initialize_site' } action .
2019-03-12 09:27:46 +00:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
*
2019-04-16 19:56:22 +00:00
* @ param WP_Site | int $blog_id The new site ' s object or ID .
* @ param int | array $user_id User ID , or array of arguments including 'user_id' .
2019-03-12 09:27:46 +00:00
*/
function wpmu_log_new_registrations ( $blog_id , $user_id ) {
global $wpdb ;
2019-04-16 19:56:22 +00:00
if ( is_object ( $blog_id ) ) {
$blog_id = $blog_id -> blog_id ;
}
if ( is_array ( $user_id ) ) {
$user_id = ! empty ( $user_id [ 'user_id' ] ) ? $user_id [ 'user_id' ] : 0 ;
}
2019-03-12 09:27:46 +00:00
$user = get_userdata ( ( int ) $user_id );
2019-04-16 19:56:22 +00:00
if ( $user ) {
$wpdb -> insert (
$wpdb -> registration_log ,
array (
'email' => $user -> user_email ,
'IP' => preg_replace ( '/[^0-9., ]/' , '' , wp_unslash ( $_SERVER [ 'REMOTE_ADDR' ] ) ),
'blog_id' => $blog_id ,
'date_registered' => current_time ( 'mysql' ),
)
);
}
2019-03-12 09:27:46 +00: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
*
* @ global wpdb $wpdb WordPress database abstraction object .
* @ staticvar int $global_terms_recurse
*
* @ param int $term_id An ID for a term on the current blog .
* @ param string $deprecated Not used .
* @ return int An ID from the global terms table mapped from $term_id .
*/
function global_terms ( $term_id , $deprecated = '' ) {
global $wpdb ;
static $global_terms_recurse = null ;
2019-04-16 19:56:22 +00:00
if ( ! global_terms_enabled () ) {
2019-03-12 09:27:46 +00:00
return $term_id ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
// prevent a race condition
$recurse_start = false ;
if ( $global_terms_recurse === null ) {
2019-04-16 19:56:22 +00:00
$recurse_start = true ;
2019-03-12 09:27:46 +00:00
$global_terms_recurse = 1 ;
} elseif ( 10 < $global_terms_recurse ++ ) {
return $term_id ;
}
$term_id = intval ( $term_id );
2019-04-16 19:56:22 +00:00
$c = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->terms WHERE term_id = %d " , $term_id ) );
2019-03-12 09:27:46 +00:00
$global_id = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT cat_ID FROM $wpdb->sitecategories WHERE category_nicename = %s " , $c -> slug ) );
if ( $global_id == null ) {
$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 ) {
2019-04-16 19:56:22 +00:00
$wpdb -> insert (
$wpdb -> sitecategories ,
array (
'cat_ID' => $term_id ,
'cat_name' => $c -> name ,
'category_nicename' => $c -> slug ,
)
);
2019-03-12 09:27:46 +00:00
$global_id = $wpdb -> insert_id ;
2019-04-16 19:56:22 +00:00
if ( empty ( $global_id ) ) {
2019-03-12 09:27:46 +00:00
return $term_id ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
} else {
$max_global_id = $wpdb -> get_var ( " SELECT MAX(cat_ID) FROM $wpdb->sitecategories " );
2019-04-16 19:56:22 +00:00
$max_local_id = $wpdb -> get_var ( " SELECT MAX(term_id) FROM $wpdb->terms " );
2019-03-12 09:27:46 +00:00
$new_global_id = max ( $max_global_id , $max_local_id ) + mt_rand ( 100 , 400 );
2019-04-16 19:56:22 +00:00
$wpdb -> insert (
$wpdb -> sitecategories ,
array (
'cat_ID' => $new_global_id ,
'cat_name' => $c -> name ,
'category_nicename' => $c -> slug ,
)
);
2019-03-12 09:27:46 +00:00
$global_id = $wpdb -> insert_id ;
}
} elseif ( $global_id != $term_id ) {
$local_id = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT term_id FROM $wpdb->terms WHERE term_id = %d " , $global_id ) );
if ( null != $local_id ) {
global_terms ( $local_id );
if ( 10 < $global_terms_recurse ) {
$global_id = $term_id ;
}
}
}
if ( $global_id != $term_id ) {
2019-04-16 19:56:22 +00:00
if ( get_option ( 'default_category' ) == $term_id ) {
2019-03-12 09:27:46 +00:00
update_option ( 'default_category' , $global_id );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00: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 ) );
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
clean_term_cache ( $term_id );
2019-03-12 09:27:46 +00:00
}
2019-04-16 19:56:22 +00:00
if ( $recurse_start ) {
2019-03-12 09:27:46 +00:00
$global_terms_recurse = null ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
return $global_id ;
}
/**
* Ensure that the current site ' s domain is listed in the allowed redirect host list .
*
* @ see wp_validate_redirect ()
* @ since MU ( 3.0 . 0 )
*
* @ param array | string $deprecated Not used .
* @ return array The current site ' s domain
*/
function redirect_this_site ( $deprecated = '' ) {
return array ( get_network () -> domain );
}
/**
* Check whether an upload is too big .
*
* @ since MU ( 3.0 . 0 )
*
* @ blessed
*
* @ param array $upload
* @ return string | array If the upload is under the size limit , $upload is returned . Otherwise returns an error message .
*/
function upload_is_file_too_big ( $upload ) {
2019-04-16 19:56:22 +00:00
if ( ! is_array ( $upload ) || defined ( 'WP_IMPORTING' ) || get_site_option ( 'upload_space_check_disabled' ) ) {
2019-03-12 09:27:46 +00:00
return $upload ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( strlen ( $upload [ 'bits' ] ) > ( KB_IN_BYTES * get_site_option ( 'fileupload_maxk' , 1500 ) ) ) {
/* translators: %s: maximum allowed file size in kilobytes */
return sprintf ( __ ( 'This file is too big. Files must be less than %s KB in size.' ) . '<br />' , get_site_option ( 'fileupload_maxk' , 1500 ) );
2019-03-12 09:27:46 +00:00
}
return $upload ;
}
/**
* Add a nonce field to the signup page .
*
* @ since MU ( 3.0 . 0 )
*/
function signup_nonce_fields () {
$id = mt_rand ();
echo " <input type='hidden' name='signup_form_id' value=' { $id } ' /> " ;
2019-04-16 19:56:22 +00:00
wp_nonce_field ( 'signup_form_' . $id , '_signup_form' , false );
2019-03-12 09:27:46 +00:00
}
/**
* Process the signup nonce created in signup_nonce_fields () .
*
* @ since MU ( 3.0 . 0 )
*
* @ param array $result
* @ return array
*/
function signup_nonce_check ( $result ) {
2019-04-16 19:56:22 +00:00
if ( ! strpos ( $_SERVER [ 'PHP_SELF' ], 'wp-signup.php' ) ) {
2019-03-12 09:27:46 +00:00
return $result ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( ! wp_verify_nonce ( $_POST [ '_signup_form' ], 'signup_form_' . $_POST [ 'signup_form_id' ] ) ) {
$result [ 'errors' ] -> add ( 'invalid_nonce' , __ ( 'Unable to submit this form, please try again.' ) );
}
2019-03-12 09:27:46 +00:00
return $result ;
}
/**
* Correct 404 redirects when NOBLOGREDIRECT is defined .
*
* @ since MU ( 3.0 . 0 )
*/
function maybe_redirect_404 () {
/**
* Filters the redirect URL for 404 s on the main site .
*
* The filter is only evaluated if the NOBLOGREDIRECT constant is defined .
*
* @ since 3.0 . 0
*
* @ param string $no_blog_redirect The redirect URL defined in NOBLOGREDIRECT .
*/
if ( is_main_site () && is_404 () && defined ( 'NOBLOGREDIRECT' ) && ( $destination = apply_filters ( 'blog_redirect_404' , NOBLOGREDIRECT ) ) ) {
2019-04-16 19:56:22 +00:00
if ( $destination == '%siteurl%' ) {
2019-03-12 09:27:46 +00:00
$destination = network_home_url ();
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
wp_redirect ( $destination );
exit ();
}
}
/**
* Add a new user to a blog by visiting / newbloguser / { key } /.
*
* This will only work when the user ' s details are saved as an option
* keyed as 'new_user_{key}' , where '{key}' is a hash generated for the user to be
* added , as when a user is invited through the regular WP Add User interface .
*
* @ since MU ( 3.0 . 0 )
*/
function maybe_add_existing_user_to_blog () {
2019-04-16 19:56:22 +00:00
if ( false === strpos ( $_SERVER [ 'REQUEST_URI' ], '/newbloguser/' ) ) {
2019-03-12 09:27:46 +00:00
return ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
$parts = explode ( '/' , $_SERVER [ 'REQUEST_URI' ] );
$key = array_pop ( $parts );
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( $key == '' ) {
2019-03-12 09:27:46 +00:00
$key = array_pop ( $parts );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
$details = get_option ( 'new_user_' . $key );
2019-04-16 19:56:22 +00:00
if ( ! empty ( $details ) ) {
2019-03-12 09:27:46 +00:00
delete_option ( 'new_user_' . $key );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( empty ( $details ) || is_wp_error ( add_existing_user_to_blog ( $details ) ) ) {
wp_die ( sprintf ( __ ( 'An error occurred adding you to this site. Back to the <a href="%s">homepage</a>.' ), home_url () ) );
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
wp_die ( sprintf ( __ ( 'You have been added to this site. Please visit the <a href="%1$s">homepage</a> or <a href="%2$s">log in</a> using your username and password.' ), home_url (), admin_url () ), __ ( 'WordPress › Success' ), array ( 'response' => 200 ) );
2019-03-12 09:27:46 +00:00
}
/**
* Add a user to a blog based on details from maybe_add_existing_user_to_blog () .
*
* @ since MU ( 3.0 . 0 )
*
* @ param array $details
* @ return true | WP_Error | void
*/
function add_existing_user_to_blog ( $details = false ) {
if ( is_array ( $details ) ) {
$blog_id = get_current_blog_id ();
2019-04-16 19:56:22 +00:00
$result = add_user_to_blog ( $blog_id , $details [ 'user_id' ], $details [ 'role' ] );
2019-03-12 09:27:46 +00:00
/**
* Fires immediately after an existing user is added to a site .
*
* @ since MU ( 3.0 . 0 )
*
* @ param int $user_id User ID .
* @ param mixed $result True on success or a WP_Error object if the user doesn ' t exist
* or could not be added .
*/
do_action ( 'added_existing_user' , $details [ 'user_id' ], $result );
return $result ;
}
}
/**
* Adds a newly created user to the appropriate blog
*
* To add a user in general , use add_user_to_blog () . This function
* is specifically hooked into the { @ see 'wpmu_activate_user' } action .
*
* @ since MU ( 3.0 . 0 )
* @ see add_user_to_blog ()
*
* @ param int $user_id
* @ param mixed $password Ignored .
* @ param array $meta
*/
function add_new_user_to_blog ( $user_id , $password , $meta ) {
2019-04-16 19:56:22 +00:00
if ( ! empty ( $meta [ 'add_to_blog' ] ) ) {
$blog_id = $meta [ 'add_to_blog' ];
$role = $meta [ 'new_role' ];
2019-03-12 09:27:46 +00:00
remove_user_from_blog ( $user_id , get_network () -> site_id ); // remove user from main blog.
$result = add_user_to_blog ( $blog_id , $user_id , $role );
if ( ! is_wp_error ( $result ) ) {
update_user_meta ( $user_id , 'primary_blog' , $blog_id );
}
}
}
/**
* Correct From host on outgoing mail to match the site domain
*
* @ since MU ( 3.0 . 0 )
*
* @ param PHPMailer $phpmailer The PHPMailer instance ( passed by reference ) .
*/
function fix_phpmailer_messageid ( $phpmailer ) {
$phpmailer -> Hostname = get_network () -> domain ;
}
/**
* Check to see whether a user is marked as a spammer , based on user login .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string | WP_User $user Optional . Defaults to current user . WP_User object ,
2019-04-16 19:56:22 +00:00
* or user login name as a string .
2019-03-12 09:27:46 +00:00
* @ return bool
*/
function is_user_spammy ( $user = null ) {
2019-04-16 19:56:22 +00:00
if ( ! ( $user instanceof WP_User ) ) {
2019-03-12 09:27:46 +00:00
if ( $user ) {
$user = get_user_by ( 'login' , $user );
} else {
$user = wp_get_current_user ();
}
}
return $user && isset ( $user -> spam ) && 1 == $user -> spam ;
}
/**
* Update this blog 's ' public ' setting in the global blogs table .
*
* Public blogs have a setting of 1 , private blogs are 0.
*
* @ since MU ( 3.0 . 0 )
*
* @ param int $old_value
* @ param int $value The new public value
*/
function update_blog_public ( $old_value , $value ) {
update_blog_status ( get_current_blog_id (), 'public' , ( int ) $value );
}
/**
* Check whether users can self - register , based on Network settings .
*
* @ since MU ( 3.0 . 0 )
*
* @ return bool
*/
function users_can_register_signup_filter () {
2019-04-16 19:56:22 +00:00
$registration = get_site_option ( 'registration' );
2019-03-12 09:27:46 +00:00
return ( $registration == 'all' || $registration == 'user' );
}
/**
* Ensure that the welcome message is not empty . Currently unused .
*
* @ since MU ( 3.0 . 0 )
*
* @ param string $text
* @ return string
*/
function welcome_user_msg_filter ( $text ) {
2019-04-16 19:56:22 +00:00
if ( ! $text ) {
2019-03-12 09:27:46 +00:00
remove_filter ( 'site_option_welcome_user_email' , 'welcome_user_msg_filter' );
/* translators: Do not translate USERNAME, PASSWORD, LOGINLINK, SITE_NAME: those are placeholders. */
2019-04-16 19:56:22 +00:00
$text = __ (
' Howdy USERNAME ,
2019-03-12 09:27:46 +00:00
Your new account is set up .
You can log in with the following information :
Username : USERNAME
Password : PASSWORD
LOGINLINK
Thanks !
2019-04-16 19:56:22 +00:00
-- The Team @ SITE_NAME '
);
2019-03-12 09:27:46 +00:00
update_site_option ( 'welcome_user_email' , $text );
}
return $text ;
}
/**
* Whether to force SSL on content .
*
* @ since 2.8 . 5
*
* @ staticvar bool $forced_content
*
* @ param bool $force
* @ return bool True if forced , false if not forced .
*/
function force_ssl_content ( $force = '' ) {
static $forced_content = false ;
if ( '' != $force ) {
2019-04-16 19:56:22 +00:00
$old_forced = $forced_content ;
2019-03-12 09:27:46 +00:00
$forced_content = $force ;
return $old_forced ;
}
return $forced_content ;
}
/**
* Formats a URL to use https .
*
* Useful as a filter .
*
* @ since 2.8 . 5
*
* @ param string $url URL
* @ return string URL with https as the scheme
*/
function filter_SSL ( $url ) {
2019-04-16 19:56:22 +00:00
if ( ! is_string ( $url ) ) {
2019-03-12 09:27:46 +00:00
return get_bloginfo ( 'url' ); // Return home blog url with proper scheme
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( force_ssl_content () && is_ssl () ) {
2019-03-12 09:27:46 +00:00
$url = set_url_scheme ( $url , 'https' );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
return $url ;
}
/**
* Schedule update of the network - wide counts for the current network .
*
* @ since 3.1 . 0
*/
function wp_schedule_update_network_counts () {
2019-04-16 19:56:22 +00:00
if ( ! is_main_site () ) {
2019-03-12 09:27:46 +00:00
return ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( ! wp_next_scheduled ( 'update_network_counts' ) && ! wp_installing () ) {
wp_schedule_event ( time (), 'twicedaily' , 'update_network_counts' );
}
2019-03-12 09:27:46 +00:00
}
/**
* Update the network - wide counts for the current network .
*
* @ since 3.1 . 0
2019-04-16 19:56:22 +00:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2019-03-12 09:27:46 +00:00
*
* @ param int | null $network_id ID of the network . Default is the current network .
*/
function wp_update_network_counts ( $network_id = null ) {
wp_update_network_user_counts ( $network_id );
wp_update_network_site_counts ( $network_id );
}
/**
* Update the count of sites for the current network .
*
* If enabled through the { @ see 'enable_live_network_counts' } filter , update the sites count
* on a network when a site is created or its status is updated .
*
* @ since 3.7 . 0
2019-04-16 19:56:22 +00:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2019-03-12 09:27:46 +00:00
*
* @ param int | null $network_id ID of the network . Default is the current network .
*/
function wp_maybe_update_network_site_counts ( $network_id = null ) {
$is_small_network = ! wp_is_large_network ( 'sites' , $network_id );
/**
* Filters whether to update network site or user counts when a new site is created .
*
* @ since 3.7 . 0
*
* @ see wp_is_large_network ()
*
* @ param bool $small_network Whether the network is considered small .
* @ param string $context Context . Either 'users' or 'sites' .
*/
2019-04-16 19:56:22 +00:00
if ( ! apply_filters ( 'enable_live_network_counts' , $is_small_network , 'sites' ) ) {
2019-03-12 09:27:46 +00:00
return ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
wp_update_network_site_counts ( $network_id );
}
/**
* Update the network - wide users count .
*
* If enabled through the { @ see 'enable_live_network_counts' } filter , update the users count
* on a network when a user is created or its status is updated .
*
* @ since 3.7 . 0
2019-04-16 19:56:22 +00:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2019-03-12 09:27:46 +00:00
*
* @ param int | null $network_id ID of the network . Default is the current network .
*/
function wp_maybe_update_network_user_counts ( $network_id = null ) {
$is_small_network = ! wp_is_large_network ( 'users' , $network_id );
/** This filter is documented in wp-includes/ms-functions.php */
2019-04-16 19:56:22 +00:00
if ( ! apply_filters ( 'enable_live_network_counts' , $is_small_network , 'users' ) ) {
2019-03-12 09:27:46 +00:00
return ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
wp_update_network_user_counts ( $network_id );
}
/**
* Update the network - wide site count .
*
* @ since 3.7 . 0
2019-04-16 19:56:22 +00:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2019-03-12 09:27:46 +00:00
*
* @ param int | null $network_id ID of the network . Default is the current network .
*/
function wp_update_network_site_counts ( $network_id = null ) {
$network_id = ( int ) $network_id ;
if ( ! $network_id ) {
$network_id = get_current_network_id ();
}
2019-04-16 19:56:22 +00:00
$count = get_sites (
array (
2019-05-08 07:05:39 +00:00
'network_id' => $network_id ,
'spam' => 0 ,
'deleted' => 0 ,
'archived' => 0 ,
'count' => true ,
'update_site_meta_cache' => false ,
2019-04-16 19:56:22 +00:00
)
);
2019-03-12 09:27:46 +00:00
update_network_option ( $network_id , 'blog_count' , $count );
}
/**
* Update the network - wide user count .
*
* @ since 3.7 . 0
2019-04-16 19:56:22 +00:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2019-03-12 09:27:46 +00:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
*
* @ param int | null $network_id ID of the network . Default is the current network .
*/
function wp_update_network_user_counts ( $network_id = null ) {
global $wpdb ;
$count = $wpdb -> get_var ( " SELECT COUNT(ID) as c FROM $wpdb->users WHERE spam = '0' AND deleted = '0' " );
update_network_option ( $network_id , 'user_count' , $count );
}
/**
* Returns the space used by the current blog .
*
* @ since 3.5 . 0
*
* @ return int Used space in megabytes
*/
function get_space_used () {
/**
* Filters the amount of storage space used by the current site .
*
* @ since 3.5 . 0
*
* @ param int | bool $space_used The amount of used space , in megabytes . Default false .
*/
$space_used = apply_filters ( 'pre_get_space_used' , false );
if ( false === $space_used ) {
$upload_dir = wp_upload_dir ();
$space_used = get_dirsize ( $upload_dir [ 'basedir' ] ) / MB_IN_BYTES ;
}
return $space_used ;
}
/**
* Returns the upload quota for the current blog .
*
* @ since MU ( 3.0 . 0 )
*
* @ return int Quota in megabytes
*/
function get_space_allowed () {
$space_allowed = get_option ( 'blog_upload_space' );
2019-04-16 19:56:22 +00:00
if ( ! is_numeric ( $space_allowed ) ) {
2019-03-12 09:27:46 +00:00
$space_allowed = get_site_option ( 'blog_upload_space' );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( ! is_numeric ( $space_allowed ) ) {
2019-03-12 09:27:46 +00:00
$space_allowed = 100 ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
/**
* Filters the upload quota for the current site .
*
* @ since 3.7 . 0
*
* @ param int $space_allowed Upload quota in megabytes for the current blog .
*/
return apply_filters ( 'get_space_allowed' , $space_allowed );
}
/**
* Determines if there is any upload space left in the current blog ' s quota .
*
* @ since 3.0 . 0
*
* @ return int of upload space available in bytes
*/
function get_upload_space_available () {
$allowed = get_space_allowed ();
if ( $allowed < 0 ) {
$allowed = 0 ;
}
$space_allowed = $allowed * MB_IN_BYTES ;
2019-04-16 19:56:22 +00:00
if ( get_site_option ( 'upload_space_check_disabled' ) ) {
2019-03-12 09:27:46 +00:00
return $space_allowed ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
$space_used = get_space_used () * MB_IN_BYTES ;
2019-04-16 19:56:22 +00:00
if ( ( $space_allowed - $space_used ) <= 0 ) {
2019-03-12 09:27:46 +00:00
return 0 ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
return $space_allowed - $space_used ;
}
/**
* Determines if there is any upload space left in the current blog ' s quota .
*
* @ since 3.0 . 0
* @ return bool True if space is available , false otherwise .
*/
function is_upload_space_available () {
2019-04-16 19:56:22 +00:00
if ( get_site_option ( 'upload_space_check_disabled' ) ) {
2019-03-12 09:27:46 +00:00
return true ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
return ( bool ) get_upload_space_available ();
}
/**
* Filters the maximum upload file size allowed , in bytes .
*
* @ since 3.0 . 0
*
* @ param int $size Upload size limit in bytes .
* @ return int Upload size limit in bytes .
*/
function upload_size_limit_filter ( $size ) {
$fileupload_maxk = KB_IN_BYTES * get_site_option ( 'fileupload_maxk' , 1500 );
2019-04-16 19:56:22 +00:00
if ( get_site_option ( 'upload_space_check_disabled' ) ) {
2019-03-12 09:27:46 +00:00
return min ( $size , $fileupload_maxk );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
return min ( $size , $fileupload_maxk , get_upload_space_available () );
}
/**
* Whether or not we have a large network .
*
* The default criteria for a large network is either more than 10 , 000 users or more than 10 , 000 sites .
* Plugins can alter this criteria using the { @ see 'wp_is_large_network' } filter .
*
* @ since 3.3 . 0
2019-04-16 19:56:22 +00:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2019-03-12 09:27:46 +00:00
*
* @ param string $using 'sites or ' users '. Default is ' sites ' .
* @ param int | null $network_id ID of the network . Default is the current network .
* @ return bool True if the network meets the criteria for large . False otherwise .
*/
function wp_is_large_network ( $using = 'sites' , $network_id = null ) {
$network_id = ( int ) $network_id ;
if ( ! $network_id ) {
$network_id = get_current_network_id ();
}
if ( 'users' == $using ) {
$count = get_user_count ( $network_id );
/**
* Filters whether the network is considered large .
*
* @ since 3.3 . 0
2019-04-16 19:56:22 +00:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2019-03-12 09:27:46 +00:00
*
* @ param bool $is_large_network Whether the network has more than 10000 users or sites .
* @ param string $component The component to count . Accepts 'users' , or 'sites' .
* @ param int $count The count of items for the component .
* @ param int $network_id The ID of the network being checked .
*/
return apply_filters ( 'wp_is_large_network' , $count > 10000 , 'users' , $count , $network_id );
}
$count = get_blog_count ( $network_id );
/** This filter is documented in wp-includes/ms-functions.php */
return apply_filters ( 'wp_is_large_network' , $count > 10000 , 'sites' , $count , $network_id );
}
/**
* Retrieves a list of reserved site on a sub - directory Multisite installation .
*
* @ since 4.4 . 0
*
* @ return array $names Array of reserved subdirectory names .
*/
function get_subdirectory_reserved_names () {
$names = array (
2019-04-16 19:56:22 +00:00
'page' ,
'comments' ,
'blog' ,
'files' ,
'feed' ,
'wp-admin' ,
'wp-content' ,
'wp-includes' ,
'wp-json' ,
'embed' ,
2019-03-12 09:27:46 +00:00
);
/**
* Filters reserved site names on a sub - directory Multisite installation .
*
* @ since 3.0 . 0
* @ since 4.4 . 0 'wp-admin' , 'wp-content' , 'wp-includes' , 'wp-json' , and 'embed' were added
* to the reserved names list .
*
* @ param array $subdirectory_reserved_names Array of reserved names .
*/
return apply_filters ( 'subdirectory_reserved_names' , $names );
}
/**
* Send a confirmation request email when a change of network admin email address is attempted .
*
* The new network admin address will not become active until confirmed .
*
* @ since 4.9 . 0
*
* @ param string $old_value The old network admin email address .
* @ param string $value The proposed new network admin email address .
*/
function update_network_option_new_admin_email ( $old_value , $value ) {
if ( $value == get_site_option ( 'admin_email' ) || ! is_email ( $value ) ) {
return ;
}
2019-04-16 19:56:22 +00:00
$hash = md5 ( $value . time () . mt_rand () );
2019-03-12 09:27:46 +00:00
$new_admin_email = array (
'hash' => $hash ,
'newemail' => $value ,
);
update_site_option ( 'network_admin_hash' , $new_admin_email );
$switched_locale = switch_to_locale ( get_user_locale () );
/* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */
2019-04-16 19:56:22 +00:00
$email_text = __ (
' Howdy ###USERNAME###,
2019-03-12 09:27:46 +00:00
You recently requested to have the network admin email address on
your network changed .
If this is correct , please click on the following link to change it :
###ADMIN_URL###
You can safely ignore and delete this email if you do not want to
take this action .
This email has been sent to ###EMAIL###
Regards ,
All at ###SITENAME###
2019-04-16 19:56:22 +00:00
###SITEURL###'
);
2019-03-12 09:27:46 +00:00
/**
* Filters the text of the email sent when a change of network admin email address is attempted .
*
* The following strings have a special meaning and will get replaced dynamically :
* ###USERNAME### The current user's username.
* ###ADMIN_URL### The link to click on to confirm the email change.
* ###EMAIL### The proposed new network admin email address.
* ###SITENAME### The name of the network.
* ###SITEURL### The URL to the network.
*
* @ since 4.9 . 0
*
* @ param string $email_text Text in the email .
* @ param array $new_admin_email {
* Data relating to the new network admin email address .
*
* @ type string $hash The secure hash used in the confirmation link URL .
* @ type string $newemail The proposed new network admin email address .
* }
*/
$content = apply_filters ( 'new_network_admin_email_content' , $email_text , $new_admin_email );
$current_user = wp_get_current_user ();
2019-04-16 19:56:22 +00:00
$content = str_replace ( '###USERNAME###' , $current_user -> user_login , $content );
$content = str_replace ( '###ADMIN_URL###' , esc_url ( network_admin_url ( 'settings.php?network_admin_hash=' . $hash ) ), $content );
$content = str_replace ( '###EMAIL###' , $value , $content );
$content = str_replace ( '###SITENAME###' , wp_specialchars_decode ( get_site_option ( 'site_name' ), ENT_QUOTES ), $content );
$content = str_replace ( '###SITEURL###' , network_home_url (), $content );
2019-03-12 09:27:46 +00:00
2019-05-08 07:05:39 +00:00
/* translators: Email change notification email subject. %s: Network title */
wp_mail ( $value , sprintf ( __ ( '[%s] Network Admin Email Change Request' ), wp_specialchars_decode ( get_site_option ( 'site_name' ), ENT_QUOTES ) ), $content );
2019-03-12 09:27:46 +00:00
if ( $switched_locale ) {
restore_previous_locale ();
}
}
/**
* Send an email to the old network admin email address when the network admin email address changes .
*
* @ since 4.9 . 0
*
* @ param string $option_name The relevant database option name .
* @ param string $new_email The new network admin email address .
* @ param string $old_email The old network admin email address .
* @ param int $network_id ID of the network .
*/
function wp_network_admin_email_change_notification ( $option_name , $new_email , $old_email , $network_id ) {
$send = true ;
// Don't send the notification to the default 'admin_email' value.
if ( 'you@example.com' === $old_email ) {
$send = false ;
}
/**
* Filters whether to send the network admin email change notification email .
*
* @ since 4.9 . 0
*
* @ param bool $send Whether to send the email notification .
* @ param string $old_email The old network admin email address .
* @ param string $new_email The new network admin email address .
* @ param int $network_id ID of the network .
*/
$send = apply_filters ( 'send_network_admin_email_change_email' , $send , $old_email , $new_email , $network_id );
if ( ! $send ) {
return ;
}
/* translators: Do not translate OLD_EMAIL, NEW_EMAIL, SITENAME, SITEURL: those are placeholders. */
2019-04-16 19:56:22 +00:00
$email_change_text = __ (
' Hi ,
2019-03-12 09:27:46 +00:00
This notice confirms that the network admin email address was changed on ###SITENAME###.
The new network admin email address is ###NEW_EMAIL###.
This email has been sent to ###OLD_EMAIL###
Regards ,
All at ###SITENAME###
2019-04-16 19:56:22 +00:00
###SITEURL###'
);
2019-03-12 09:27:46 +00:00
$email_change_email = array (
'to' => $old_email ,
/* translators: Network admin email change notification email subject. %s: Network title */
2019-05-08 07:05:39 +00:00
'subject' => __ ( '[%s] Network Admin Email Changed' ),
2019-03-12 09:27:46 +00:00
'message' => $email_change_text ,
'headers' => '' ,
);
// get network name
$network_name = wp_specialchars_decode ( get_site_option ( 'site_name' ), ENT_QUOTES );
/**
* Filters the contents of the email notification sent when the network admin email address is changed .
*
* @ since 4.9 . 0
*
* @ param array $email_change_email {
* Used to build wp_mail () .
*
* @ type string $to The intended recipient .
* @ type string $subject The subject of the email .
* @ type string $message The content of the email .
* The following strings have a special meaning and will get replaced dynamically :
* - ###OLD_EMAIL### The old network admin email address.
* - ###NEW_EMAIL### The new network admin email address.
* - ###SITENAME### The name of the network.
* - ###SITEURL### The URL to the site.
* @ type string $headers Headers .
* }
* @ param string $old_email The old network admin email address .
* @ param string $new_email The new network admin email address .
* @ param int $network_id ID of the network .
*/
$email_change_email = apply_filters ( 'network_admin_email_change_email' , $email_change_email , $old_email , $new_email , $network_id );
2019-04-16 19:56:22 +00:00
$email_change_email [ 'message' ] = str_replace ( '###OLD_EMAIL###' , $old_email , $email_change_email [ 'message' ] );
$email_change_email [ 'message' ] = str_replace ( '###NEW_EMAIL###' , $new_email , $email_change_email [ 'message' ] );
$email_change_email [ 'message' ] = str_replace ( '###SITENAME###' , $network_name , $email_change_email [ 'message' ] );
$email_change_email [ 'message' ] = str_replace ( '###SITEURL###' , home_url (), $email_change_email [ 'message' ] );
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
wp_mail (
$email_change_email [ 'to' ],
sprintf (
$email_change_email [ 'subject' ],
$network_name
),
$email_change_email [ 'message' ],
$email_change_email [ 'headers' ]
);
2019-03-12 09:27:46 +00:00
}