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