2010-01-05 23:02:57 -05:00
< ? php
2010-01-22 17:14:22 -05:00
/**
2011-11-30 19:36:19 -05:00
* Multisite WordPress API
2010-01-22 17:14:22 -05:00
*
* @ package WordPress
2010-04-04 09:29:35 -04:00
* @ subpackage Multisite
* @ since 3.0 . 0
2010-01-22 17:14:22 -05:00
*/
2010-09-29 19:44:34 -04:00
/**
* Gets the network ' s site and user counts .
*
2017-10-03 13:44:48 -04:00
* @ since MU ( 3.0 . 0 )
2010-09-29 19:44:34 -04:00
*
2019-11-05 16:23:02 -05:00
* @ return int [] {
* Site and user count for the network .
*
* @ type int $blogs Number of sites on the network .
* @ type int $users Number of users on the network .
* }
2010-09-29 19:44:34 -04:00
*/
2010-01-05 23:02:57 -05:00
function get_sitestats () {
2011-08-17 13:49:57 -04:00
$stats = array (
'blogs' => get_blog_count (),
'users' => get_user_count (),
);
2010-01-05 23:02:57 -05:00
return $stats ;
}
2010-09-29 19:44:34 -04:00
/**
* Get one of a user ' s active blogs
*
2013-11-24 21:05:10 -05:00
* Returns the user ' s primary blog , if they have one and
2010-09-29 19:44:34 -04: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 .
*
2017-10-03 13:44:48 -04:00
* @ since MU ( 3.0 . 0 )
2010-09-29 19:44:34 -04:00
*
* @ param int $user_id The unique ID of the user
2016-03-09 02:50:26 -05:00
* @ return WP_Site | void The blog object
2010-09-29 19:44:34 -04:00
*/
function get_active_blog_for_user ( $user_id ) {
2010-01-05 23:02:57 -05:00
$blogs = get_blogs_of_user ( $user_id );
2017-11-30 18:11:00 -05:00
if ( empty ( $blogs ) ) {
2015-05-26 17:51:31 -04:00
return ;
2017-11-30 18:11:00 -05:00
}
2010-10-07 15:34:18 -04:00
2017-10-01 21:44:47 -04:00
if ( ! is_multisite () ) {
return $blogs [ get_current_blog_id () ];
}
2010-01-05 23:02:57 -05:00
2010-02-23 05:42:40 -05:00
$primary_blog = get_user_meta ( $user_id , 'primary_blog' , true );
2017-11-30 18:11:00 -05:00
$first_blog = current ( $blogs );
2010-11-04 05:31:58 -04:00
if ( false !== $primary_blog ) {
2010-10-07 15:34:18 -04:00
if ( ! isset ( $blogs [ $primary_blog ] ) ) {
2010-11-04 05:31:58 -04:00
update_user_meta ( $user_id , 'primary_blog' , $first_blog -> userblog_id );
2016-10-25 14:06:29 -04:00
$primary = get_site ( $first_blog -> userblog_id );
2010-01-05 23:02:57 -05:00
} else {
2016-10-25 14:06:29 -04:00
$primary = get_site ( $primary_blog );
2010-01-05 23:02:57 -05:00
}
} else {
2010-11-04 05:31:58 -04:00
//TODO Review this call to add_user_to_blog too - to get here the user must have a role on this blog?
2017-08-03 17:41:45 -04:00
$result = add_user_to_blog ( $first_blog -> userblog_id , $user_id , 'subscriber' );
if ( ! is_wp_error ( $result ) ) {
update_user_meta ( $user_id , 'primary_blog' , $first_blog -> userblog_id );
$primary = $first_blog ;
}
2010-01-05 23:02:57 -05:00
}
2011-09-27 03:36:36 -04:00
if ( ( ! is_object ( $primary ) ) || ( $primary -> archived == 1 || $primary -> spam == 1 || $primary -> deleted == 1 ) ) {
2010-01-05 23:02:57 -05:00
$blogs = get_blogs_of_user ( $user_id , true ); // if a user's primary blog is shut down, check their other blogs.
2017-11-30 18:11:00 -05:00
$ret = false ;
2010-01-05 23:02:57 -05:00
if ( is_array ( $blogs ) && count ( $blogs ) > 0 ) {
2010-01-19 12:01:39 -05:00
foreach ( ( array ) $blogs as $blog_id => $blog ) {
2017-11-30 18:11:00 -05:00
if ( $blog -> site_id != get_current_network_id () ) {
2010-01-05 23:02:57 -05:00
continue ;
2017-11-30 18:11:00 -05:00
}
2016-10-25 14:06:29 -04:00
$details = get_site ( $blog_id );
2010-01-05 23:02:57 -05:00
if ( is_object ( $details ) && $details -> archived == 0 && $details -> spam == 0 && $details -> deleted == 0 ) {
2018-03-20 19:07:30 -04:00
$ret = $details ;
2017-11-30 18:11:00 -05:00
if ( get_user_meta ( $user_id , 'primary_blog' , true ) != $blog_id ) {
2010-02-22 16:25:32 -05:00
update_user_meta ( $user_id , 'primary_blog' , $blog_id );
2017-11-30 18:11:00 -05:00
}
if ( ! get_user_meta ( $user_id , 'source_domain' , true ) ) {
2018-03-20 19:07:30 -04:00
update_user_meta ( $user_id , 'source_domain' , $details -> domain );
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
break ;
}
}
} else {
2015-05-26 17:51:31 -04:00
return ;
2010-01-05 23:02:57 -05:00
}
return $ret ;
} else {
2010-10-07 15:34:18 -04:00
return $primary ;
2010-01-05 23:02:57 -05:00
}
}
2010-09-29 19:44:34 -04:00
/**
* The number of active users in your installation .
*
2010-10-20 16:22:14 -04:00
* The count is cached and updated twice daily . This is not a live count .
2010-09-29 19:44:34 -04:00
*
2017-10-03 13:44:48 -04:00
* @ since MU ( 3.0 . 0 )
2018-02-09 11:55:31 -05:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2010-09-29 19:44:34 -04:00
*
2017-04-04 22:18:00 -04:00
* @ param int | null $network_id ID of the network . Default is the current network .
* @ return int Number of active users on the network .
2010-09-29 19:44:34 -04:00
*/
2017-04-04 22:18:00 -04:00
function get_user_count ( $network_id = null ) {
return get_network_option ( $network_id , 'user_count' );
2010-01-05 23:02:57 -05:00
}
2010-09-29 19:44:34 -04:00
/**
* The number of active sites on your installation .
*
2010-10-20 16:22:14 -04:00
* The count is cached and updated twice daily . This is not a live count .
2010-09-29 19:44:34 -04:00
*
2017-10-03 13:44:48 -04:00
* @ since MU ( 3.0 . 0 )
2018-02-09 11:55:31 -05:00
* @ since 3.7 . 0 The `$network_id` parameter has been deprecated .
* @ since 4.8 . 0 The `$network_id` parameter is now being used .
2010-09-29 19:44:34 -04:00
*
2017-04-04 22:17:18 -04:00
* @ param int | null $network_id ID of the network . Default is the current network .
* @ return int Number of active sites on the network .
2010-09-29 19:44:34 -04:00
*/
2017-04-04 22:17:18 -04:00
function get_blog_count ( $network_id = null ) {
return get_network_option ( $network_id , 'blog_count' );
2010-01-05 23:02:57 -05:00
}
2010-09-29 19:44:34 -04:00
/**
* Get a blog post from any site on the network .
*
2017-10-03 13:44:48 -04:00
* @ since MU ( 3.0 . 0 )
2010-09-29 19:44:34 -04:00
*
* @ param int $blog_id ID of the blog .
* @ param int $post_id ID of the post you ' re looking for .
2012-08-27 12:22:45 -04:00
* @ return WP_Post | null WP_Post on success or null on failure
2010-09-29 19:44:34 -04:00
*/
2010-01-05 23:02:57 -05:00
function get_blog_post ( $blog_id , $post_id ) {
2012-08-27 12:22:45 -04:00
switch_to_blog ( $blog_id );
$post = get_post ( $post_id );
restore_current_blog ();
2010-01-05 23:02:57 -05:00
return $post ;
}
2010-09-29 19:44:34 -04:00
/**
2016-05-23 14:56:27 -04:00
* Adds a user to a blog .
2010-09-29 19:44:34 -04:00
*
2016-05-23 14:56:27 -04:00
* Use the { @ see 'add_user_to_blog' } action to fire an event when users are added to a blog .
2010-09-29 19:44:34 -04:00
*
2017-10-03 13:44:48 -04:00
* @ since MU ( 3.0 . 0 )
2010-09-29 19:44:34 -04:00
*
2015-05-26 17:51:31 -04: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 19:44:34 -04:00
*/
2010-01-05 23:02:57 -05:00
function add_user_to_blog ( $blog_id , $user_id , $role ) {
2017-11-30 18:11:00 -05:00
switch_to_blog ( $blog_id );
2010-01-05 23:02:57 -05:00
2012-08-02 21:06:05 -04:00
$user = get_userdata ( $user_id );
2010-01-05 23:02:57 -05:00
2012-08-02 21:06:05 -04:00
if ( ! $user ) {
2011-02-02 19:17:30 -05:00
restore_current_blog ();
2012-10-05 15:04:34 -04:00
return new WP_Error ( 'user_does_not_exist' , __ ( 'The requested user does not exist.' ) );
2011-02-02 19:17:30 -05:00
}
2010-01-05 23:02:57 -05:00
2017-08-03 17:41:45 -04:00
/**
* Filters whether a user should be added to a site .
*
* @ since 4.9 . 0
*
* @ param bool | WP_Error $retval True if the user should be added to the site , false
* or error object otherwise .
* @ param int $user_id User ID .
* @ param string $role User role .
* @ param int $blog_id Site ID .
*/
$can_add_user = apply_filters ( 'can_add_user_to_blog' , true , $user_id , $role , $blog_id );
if ( true !== $can_add_user ) {
restore_current_blog ();
if ( is_wp_error ( $can_add_user ) ) {
return $can_add_user ;
}
return new WP_Error ( 'user_cannot_be_added' , __ ( 'User cannot be added to this site.' ) );
}
2017-11-30 18:11:00 -05:00
if ( ! get_user_meta ( $user_id , 'primary_blog' , true ) ) {
update_user_meta ( $user_id , 'primary_blog' , $blog_id );
2016-10-25 01:49:29 -04:00
$site = get_site ( $blog_id );
update_user_meta ( $user_id , 'source_domain' , $site -> domain );
2010-01-05 23:02:57 -05:00
}
2017-11-30 18:11:00 -05:00
$user -> set_role ( $role );
2010-01-05 23:02:57 -05:00
2013-12-02 15:45:10 -05:00
/**
* Fires immediately after a user is added to a site .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ 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 );
2019-08-01 13:49:57 -04:00
clean_user_cache ( $user_id );
2015-06-10 02:50:25 -04:00
wp_cache_delete ( $blog_id . '_user_count' , 'blog-details' );
2019-08-01 13:49:57 -04:00
2010-01-05 23:02:57 -05:00
restore_current_blog ();
2019-08-01 13:49:57 -04:00
2010-01-05 23:02:57 -05:00
return true ;
}
2010-09-29 19:44:34 -04:00
/**
* Remove a user from a blog .
*
2016-05-23 14:56:27 -04:00
* Use the { @ see 'remove_user_from_blog' } action to fire an event when
2010-09-29 19:44:34 -04:00
* users are removed from a blog .
*
2016-05-23 14:56:27 -04:00
* Accepts an optional `$reassign` parameter , if you want to
2010-09-29 19:44:34 -04:00
* reassign the user ' s blog posts to another user upon removal .
*
2017-10-03 13:44:48 -04:00
* @ since MU ( 3.0 . 0 )
2010-09-29 19:44:34 -04:00
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 17:51:31 -04:00
*
* @ 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 19:44:34 -04:00
* @ param string $reassign Optional . A user to whom to reassign posts .
2015-05-26 17:51:31 -04:00
* @ return true | WP_Error
2010-09-29 19:44:34 -04:00
*/
2017-11-30 18:11:00 -05:00
function remove_user_from_blog ( $user_id , $blog_id = '' , $reassign = '' ) {
2010-01-05 23:02:57 -05:00
global $wpdb ;
2017-11-30 18:11:00 -05:00
switch_to_blog ( $blog_id );
2010-01-05 23:02:57 -05:00
$user_id = ( int ) $user_id ;
2013-12-02 15:45:10 -05:00
/**
* Fires before a user is removed from a site .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param int $user_id User ID .
* @ param int $blog_id Blog ID .
*/
do_action ( 'remove_user_from_blog' , $user_id , $blog_id );
2010-01-05 23:02:57 -05:00
// If being removed from the primary blog, set a new primary if the user is assigned
// to multiple blogs.
2017-11-30 18:11:00 -05:00
$primary_blog = get_user_meta ( $user_id , 'primary_blog' , true );
2010-01-05 23:02:57 -05:00
if ( $primary_blog == $blog_id ) {
2017-11-30 18:11:00 -05:00
$new_id = '' ;
2010-01-05 23:02:57 -05:00
$new_domain = '' ;
2017-11-30 18:11:00 -05:00
$blogs = get_blogs_of_user ( $user_id );
2010-01-05 23:02:57 -05:00
foreach ( ( array ) $blogs as $blog ) {
2017-11-30 18:11:00 -05:00
if ( $blog -> userblog_id == $blog_id ) {
2010-01-05 23:02:57 -05:00
continue ;
2017-11-30 18:11:00 -05:00
}
$new_id = $blog -> userblog_id ;
2010-01-05 23:02:57 -05:00
$new_domain = $blog -> domain ;
break ;
}
2017-11-30 18:11:00 -05:00
update_user_meta ( $user_id , 'primary_blog' , $new_id );
update_user_meta ( $user_id , 'source_domain' , $new_domain );
2010-01-05 23:02:57 -05:00
}
// wp_revoke_user($user_id);
2012-08-02 21:06:05 -04:00
$user = get_userdata ( $user_id );
if ( ! $user ) {
2011-02-02 19:17:30 -05:00
restore_current_blog ();
2017-11-30 18:11:00 -05:00
return new WP_Error ( 'user_does_not_exist' , __ ( 'That user does not exist.' ) );
2011-02-02 19:17:30 -05:00
}
2010-07-13 17:27:05 -04:00
2010-01-05 23:02:57 -05:00
$user -> remove_all_caps ();
2017-11-30 18:11:00 -05:00
$blogs = get_blogs_of_user ( $user_id );
if ( count ( $blogs ) == 0 ) {
update_user_meta ( $user_id , 'primary_blog' , '' );
update_user_meta ( $user_id , 'source_domain' , '' );
2010-01-05 23:02:57 -05:00
}
2010-01-12 13:40:40 -05:00
if ( $reassign != '' ) {
2010-01-05 23:02:57 -05:00
$reassign = ( int ) $reassign ;
2014-02-09 16:47:12 -05:00
$post_ids = $wpdb -> get_col ( $wpdb -> prepare ( " SELECT ID FROM $wpdb->posts WHERE post_author = %d " , $user_id ) );
2014-03-28 23:39:14 -04:00
$link_ids = $wpdb -> get_col ( $wpdb -> prepare ( " SELECT link_id FROM $wpdb->links WHERE link_owner = %d " , $user_id ) );
2014-02-03 23:13:12 -05:00
2014-02-09 16:47:12 -05:00
if ( ! empty ( $post_ids ) ) {
2014-02-11 11:28:13 -05:00
$wpdb -> query ( $wpdb -> prepare ( " UPDATE $wpdb->posts SET post_author = %d WHERE post_author = %d " , $reassign , $user_id ) );
2014-02-09 16:47:12 -05:00
array_walk ( $post_ids , 'clean_post_cache' );
}
if ( ! empty ( $link_ids ) ) {
2014-02-11 11:28:13 -05:00
$wpdb -> query ( $wpdb -> prepare ( " UPDATE $wpdb->links SET link_owner = %d WHERE link_owner = %d " , $reassign , $user_id ) );
2014-02-09 16:47:12 -05:00
array_walk ( $link_ids , 'clean_bookmark_cache' );
}
2010-01-05 23:02:57 -05:00
}
restore_current_blog ();
2011-08-04 12:36:50 -04:00
return true ;
2010-01-05 23:02:57 -05:00
}
2010-09-29 19:44:34 -04:00
/**
* Get the permalink for a post on another blog .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 ) 1.0
2010-09-29 19:44:34 -04:00
*
2012-08-27 12:22:45 -04:00
* @ param int $blog_id ID of the source blog .
2010-09-29 19:44:34 -04:00
* @ param int $post_id ID of the desired post .
2011-01-04 04:02:38 -05:00
* @ return string The post ' s permalink
2010-09-29 19:44:34 -04:00
*/
2012-08-27 12:22:45 -04:00
function get_blog_permalink ( $blog_id , $post_id ) {
switch_to_blog ( $blog_id );
$link = get_permalink ( $post_id );
restore_current_blog ();
2010-01-05 23:02:57 -05:00
return $link ;
}
2010-09-29 19:44:34 -04:00
/**
* Get a blog ' s numeric ID from its URL .
*
* On a subdirectory installation like example . com / blog1 / ,
* $domain will be the root 'example.com' and $path the
* subdirectory '/blog1/' . With subdomains like blog1 . example . com ,
* $domain is 'blog1.example.com' and $path is '/' .
*
2017-10-03 13:44:48 -04:00
* @ since MU ( 3.0 . 0 )
2010-09-29 19:44:34 -04:00
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 17:51:31 -04:00
*
2010-09-29 19:44:34 -04:00
* @ param string $domain
2015-05-26 17:51:31 -04:00
* @ param string $path Optional . Not required for subdomain installations .
2012-10-01 14:03:23 -04:00
* @ return int 0 if no blog found , otherwise the ID of the matching blog
2010-09-29 19:44:34 -04:00
*/
2010-01-05 23:02:57 -05:00
function get_blog_id_from_url ( $domain , $path = '/' ) {
2012-10-01 14:03:23 -04:00
$domain = strtolower ( $domain );
2017-11-30 18:11:00 -05:00
$path = strtolower ( $path );
$id = wp_cache_get ( md5 ( $domain . $path ), 'blog-id-cache' );
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
if ( $id == - 1 ) { // blog does not exist
2010-01-05 23:02:57 -05:00
return 0 ;
2017-11-30 18:11:00 -05:00
} elseif ( $id ) {
2012-10-01 14:03:23 -04:00
return ( int ) $id ;
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
$args = array (
2019-03-18 11:56:51 -04:00
'domain' => $domain ,
'path' => $path ,
'fields' => 'ids' ,
'number' => 1 ,
'update_site_meta_cache' => false ,
2016-06-01 22:26:29 -04:00
);
$result = get_sites ( $args );
2017-11-30 18:11:00 -05:00
$id = array_shift ( $result );
2010-01-05 23:02:57 -05:00
2012-10-01 14:03:23 -04:00
if ( ! $id ) {
2010-01-05 23:02:57 -05:00
wp_cache_set ( md5 ( $domain . $path ), - 1 , 'blog-id-cache' );
2012-10-01 14:03:23 -04:00
return 0 ;
2010-01-05 23:02:57 -05:00
}
2012-10-01 14:03:23 -04:00
2010-01-05 23:02:57 -05:00
wp_cache_set ( md5 ( $domain . $path ), $id , 'blog-id-cache' );
return $id ;
}
2011-01-04 04:02:38 -05:00
// Admin functions
2010-01-05 23:02:57 -05:00
2011-01-04 04:02:38 -05:00
/**
* Checks an email address against a list of banned domains .
*
* This function checks against the Banned Email Domains list
* at wp - admin / network / settings . php . The check is only run on
* self - registrations ; user creation at wp - admin / network / users . php
2011-01-05 23:11:14 -05:00
* bypasses this check .
2011-01-04 04:02:38 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
* @ param string $user_email The email provided by the user at registration .
* @ return bool Returns true when the email address is banned .
*/
2010-01-05 23:02:57 -05:00
function is_email_address_unsafe ( $user_email ) {
2015-10-07 13:11:25 -04:00
$banned_names = get_site_option ( 'banned_email_domains' );
2017-11-30 18:11:00 -05:00
if ( $banned_names && ! is_array ( $banned_names ) ) {
2012-11-07 20:06:17 -05:00
$banned_names = explode ( " \n " , $banned_names );
2017-11-30 18:11:00 -05:00
}
2010-01-12 13:40:40 -05:00
2012-11-07 20:06:17 -05:00
$is_email_address_unsafe = false ;
2017-05-09 12:55:40 -04:00
if ( $banned_names && is_array ( $banned_names ) && false !== strpos ( $user_email , '@' , 1 ) ) {
2017-11-30 18:11:00 -05:00
$banned_names = array_map ( 'strtolower' , $banned_names );
2013-08-31 00:36:10 -04:00
$normalized_email = strtolower ( $user_email );
list ( $email_local_part , $email_domain ) = explode ( '@' , $normalized_email );
2012-11-07 20:06:17 -05:00
foreach ( $banned_names as $banned_domain ) {
2017-11-30 18:11:00 -05:00
if ( ! $banned_domain ) {
2010-01-05 23:02:57 -05:00
continue ;
2017-11-30 18:11:00 -05:00
}
2012-11-07 20:06:17 -05:00
if ( $email_domain == $banned_domain ) {
$is_email_address_unsafe = true ;
break ;
}
$dotted_domain = " . $banned_domain " ;
2013-08-31 00:36:10 -04:00
if ( $dotted_domain === substr ( $normalized_email , - strlen ( $dotted_domain ) ) ) {
2012-11-07 20:06:17 -05:00
$is_email_address_unsafe = true ;
break ;
}
2010-01-05 23:02:57 -05:00
}
}
2012-11-07 20:06:17 -05:00
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters whether an email address is unsafe .
2013-12-02 15:45:10 -05:00
*
* @ 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-07 20:06:17 -05:00
return apply_filters ( 'is_email_address_unsafe' , $is_email_address_unsafe , $user_email );
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
2015-01-29 06:46:22 -05:00
* Sanitize and validate data required for a user sign - up .
2011-01-04 04:02:38 -05:00
*
2015-01-29 06:46:22 -05: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 04:02:38 -05:00
*
2015-01-29 06:46:22 -05: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 04:02:38 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 17:51:31 -04:00
*
2015-01-29 06:46:22 -05:00
* @ param string $user_name The login name provided by the user .
2011-01-04 04:02:38 -05:00
* @ param string $user_email The email provided by the user .
2019-11-05 16:23:02 -05:00
* @ return array {
* 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 .
* }
2011-01-04 04:02:38 -05:00
*/
2017-11-30 18:11:00 -05:00
function wpmu_validate_user_signup ( $user_name , $user_email ) {
2010-01-05 23:02:57 -05:00
global $wpdb ;
$errors = new WP_Error ();
2010-04-29 12:05:33 -04:00
$orig_username = $user_name ;
2017-11-30 18:11:00 -05:00
$user_name = preg_replace ( '/\s+/' , '' , sanitize_user ( $user_name , true ) );
2010-04-29 12:05:33 -04:00
2012-02-07 12:44:29 -05:00
if ( $user_name != $orig_username || preg_match ( '/[^a-z0-9]/' , $user_name ) ) {
2015-10-13 13:33:24 -04:00
$errors -> add ( 'user_name' , __ ( 'Usernames can only contain lowercase letters (a-z) and numbers.' ) );
2010-04-29 12:05:33 -04:00
$user_name = $orig_username ;
}
2010-01-05 23:02:57 -05:00
$user_email = sanitize_email ( $user_email );
2017-11-30 18:11:00 -05:00
if ( empty ( $user_name ) ) {
$errors -> add ( 'user_name' , __ ( 'Please enter a username.' ) );
}
2010-01-05 23:02:57 -05:00
2015-10-07 13:11:25 -04:00
$illegal_names = get_site_option ( 'illegal_names' );
2015-06-12 13:48:26 -04:00
if ( ! is_array ( $illegal_names ) ) {
2017-11-30 18:11:00 -05:00
$illegal_names = array ( 'www' , 'web' , 'root' , 'admin' , 'main' , 'invite' , 'administrator' );
2015-10-07 13:11:25 -04:00
add_site_option ( 'illegal_names' , $illegal_names );
2010-01-05 23:02:57 -05:00
}
2015-10-15 01:43:26 -04:00
if ( in_array ( $user_name , $illegal_names ) ) {
2017-11-30 18:11:00 -05:00
$errors -> add ( 'user_name' , __ ( 'Sorry, that username is not allowed.' ) );
2015-10-15 01:43:26 -04:00
}
2015-11-21 22:51:28 -05:00
/** This filter is documented in wp-includes/user.php */
2015-11-12 11:34:27 -05:00
$illegal_logins = ( array ) apply_filters ( 'illegal_user_logins' , array () );
2015-11-12 11:30:28 -05:00
if ( in_array ( strtolower ( $user_name ), array_map ( 'strtolower' , $illegal_logins ) ) ) {
2017-11-30 18:11:00 -05:00
$errors -> add ( 'user_name' , __ ( 'Sorry, that username is not allowed.' ) );
2015-10-15 01:43:26 -04:00
}
2010-01-05 23:02:57 -05:00
2017-05-09 12:33:46 -04:00
if ( ! is_email ( $user_email ) ) {
$errors -> add ( 'user_email' , __ ( 'Please enter a valid email address.' ) );
} elseif ( is_email_address_unsafe ( $user_email ) ) {
$errors -> add ( 'user_email' , __ ( 'You cannot use that email address to signup. We are having problems with them blocking some of our email. Please use another email provider.' ) );
}
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
if ( strlen ( $user_name ) < 4 ) {
$errors -> add ( 'user_name' , __ ( 'Username must be at least 4 characters.' ) );
}
2010-01-05 23:02:57 -05:00
2015-07-04 01:53:24 -04:00
if ( strlen ( $user_name ) > 60 ) {
$errors -> add ( 'user_name' , __ ( 'Username may not be longer than 60 characters.' ) );
}
2010-01-05 23:02:57 -05:00
// all numeric?
2017-11-30 18:11:00 -05:00
if ( preg_match ( '/^[0-9]*$/' , $user_name ) ) {
$errors -> add ( 'user_name' , __ ( 'Sorry, usernames must have letters too!' ) );
}
2010-01-05 23:02:57 -05:00
2015-10-07 13:11:25 -04:00
$limited_email_domains = get_site_option ( 'limited_email_domains' );
2015-06-12 13:48:26 -04:00
if ( is_array ( $limited_email_domains ) && ! empty ( $limited_email_domains ) ) {
2018-03-20 15:07:31 -04:00
$limited_email_domains = array_map ( 'strtolower' , $limited_email_domains );
2018-08-16 21:51:36 -04:00
$emaildomain = strtolower ( substr ( $user_email , 1 + strpos ( $user_email , '@' ) ) );
2018-03-20 15:07:31 -04:00
if ( ! in_array ( $emaildomain , $limited_email_domains , true ) ) {
2017-11-30 18:11:00 -05:00
$errors -> add ( 'user_email' , __ ( 'Sorry, that email address is not allowed!' ) );
2015-06-12 13:48:26 -04:00
}
2010-01-05 23:02:57 -05:00
}
// Check if the username has been used already.
2017-11-30 18:11:00 -05:00
if ( username_exists ( $user_name ) ) {
2012-10-05 15:04:34 -04:00
$errors -> add ( 'user_name' , __ ( 'Sorry, that username already exists!' ) );
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
// Check if the email address has been used already.
2017-11-30 18:11:00 -05:00
if ( email_exists ( $user_email ) ) {
2012-10-05 15:04:34 -04:00
$errors -> add ( 'user_email' , __ ( 'Sorry, that email address is already used!' ) );
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
// Has someone already signed up for this username?
2017-11-30 18:11:00 -05:00
$signup = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->signups WHERE user_login = %s " , $user_name ) );
2010-01-05 23:02:57 -05:00
if ( $signup != null ) {
2017-11-30 18:11:00 -05:00
$registered_at = mysql2date ( 'U' , $signup -> registered );
2019-03-07 04:12:51 -05:00
$now = time ();
2017-11-30 18:11:00 -05:00
$diff = $now - $registered_at ;
2010-01-05 23:02:57 -05:00
// If registered more than two days ago, cancel registration and let this signup go through.
2017-11-30 18:11:00 -05:00
if ( $diff > 2 * DAY_IN_SECONDS ) {
2012-03-24 11:24:31 -04:00
$wpdb -> delete ( $wpdb -> signups , array ( 'user_login' => $user_name ) );
2017-11-30 18:11:00 -05:00
} else {
$errors -> add ( 'user_name' , __ ( 'That username is currently reserved but may be available in a couple of days.' ) );
}
2010-01-05 23:02:57 -05:00
}
2017-11-30 18:11:00 -05:00
$signup = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->signups WHERE user_email = %s " , $user_email ) );
2010-01-05 23:02:57 -05:00
if ( $signup != null ) {
2019-03-07 04:12:51 -05:00
$diff = time () - mysql2date ( 'U' , $signup -> registered );
2010-01-05 23:02:57 -05:00
// If registered more than two days ago, cancel registration and let this signup go through.
2017-11-30 18:11:00 -05:00
if ( $diff > 2 * DAY_IN_SECONDS ) {
2012-03-24 11:24:31 -04:00
$wpdb -> delete ( $wpdb -> signups , array ( 'user_email' => $user_email ) );
2017-11-30 18:11:00 -05:00
} else {
$errors -> add ( 'user_email' , __ ( 'That email address has already been used. Please check your inbox for an activation email. It will become available in a couple of days if you do nothing.' ) );
}
2010-01-05 23:02:57 -05:00
}
2017-11-30 18:11:00 -05:00
$result = array (
'user_name' => $user_name ,
'orig_username' => $orig_username ,
'user_email' => $user_email ,
'errors' => $errors ,
);
2010-01-05 23:02:57 -05:00
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters the validated user registration details .
2013-12-02 15:45:10 -05:00
*
* 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 .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param array $result {
2019-11-05 16:23:02 -05:00
* The array of user name , email , and the error messages .
2013-12-02 15:45:10 -05:00
*
* @ 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-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Processes new site registrations .
*
* Checks the data provided by the user during blog signup . Verifies
* the validity and uniqueness of blog paths and domains .
*
* This function prevents the current user from registering a new site
* with a blogname equivalent to another user ' s login name . Passing the
* $user parameter to the function , where $user is the other user , is
* effectively an override of this limitation .
*
2016-05-23 14:56:27 -04:00
* Filter { @ see 'wpmu_validate_blog_signup' } if you want to modify
2011-01-04 04:02:38 -05:00
* the way that WordPress validates new site signups .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
2019-08-03 21:12:56 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 17:51:31 -04:00
* @ global string $domain
*
2015-09-28 21:33:27 -04:00
* @ param string $blogname The blog name provided by the user . Must be unique .
* @ param string $blog_title The blog title provided by the user .
* @ param WP_User | string $user Optional . The user object to check against the new site name .
2019-11-05 16:23:02 -05:00
* @ return array {
* Array of domain , path , blog name , blog title , user and error messages .
*
* @ type string $domain Domain for the site .
* @ type string $path Path for the site . Used in subdirectory installations .
* @ type string $blogname The unique site name ( slug ) .
* @ type string $blog_title Blog title .
* @ type string | WP_User $user By default , an empty string . A user object if provided .
* @ type WP_Error $errors WP_Error containing any errors found .
* }
2011-01-04 04:02:38 -05:00
*/
2013-11-12 22:23:10 -05:00
function wpmu_validate_blog_signup ( $blogname , $blog_title , $user = '' ) {
global $wpdb , $domain ;
2012-12-06 04:43:52 -05:00
2016-10-19 00:47:30 -04:00
$current_network = get_network ();
2017-11-30 18:11:00 -05:00
$base = $current_network -> path ;
2010-01-05 23:02:57 -05:00
$blog_title = strip_tags ( $blog_title );
2017-11-30 18:11:00 -05:00
$errors = new WP_Error ();
2015-10-07 13:11:25 -04:00
$illegal_names = get_site_option ( 'illegal_names' );
2010-01-12 13:40:40 -05:00
if ( $illegal_names == false ) {
2010-04-24 13:49:08 -04:00
$illegal_names = array ( 'www' , 'web' , 'root' , 'admin' , 'main' , 'invite' , 'administrator' );
2015-10-07 13:11:25 -04:00
add_site_option ( 'illegal_names' , $illegal_names );
2010-01-05 23:02:57 -05:00
}
2013-12-02 15:45:10 -05:00
/*
2017-08-22 07:52:48 -04:00
* On sub dir installations , some names are so illegal , only a filter can
2013-12-02 15:45:10 -05:00
* spring them from jail .
*/
if ( ! is_subdomain_install () ) {
2015-10-06 00:35:25 -04:00
$illegal_names = array_merge ( $illegal_names , get_subdirectory_reserved_names () );
2013-12-02 15:45:10 -05:00
}
2010-05-25 23:13:16 -04:00
2017-11-30 18:11:00 -05:00
if ( empty ( $blogname ) ) {
$errors -> add ( 'blogname' , __ ( 'Please enter a site name.' ) );
}
2010-01-05 23:02:57 -05:00
2015-10-13 13:33:24 -04:00
if ( preg_match ( '/[^a-z0-9]+/' , $blogname ) ) {
$errors -> add ( 'blogname' , __ ( 'Site names can only contain lowercase letters (a-z) and numbers.' ) );
}
2010-01-12 13:40:40 -05:00
2017-11-30 18:11:00 -05:00
if ( in_array ( $blogname , $illegal_names ) ) {
$errors -> add ( 'blogname' , __ ( 'That name is not allowed.' ) );
}
2010-01-12 13:40:40 -05:00
2017-05-09 10:59:47 -04:00
/**
* Filters the minimum site name length required when validating a site signup .
*
* @ since 4.8 . 0
*
* @ param int $length The minimum site name length . Default 4.
*/
$minimum_site_name_length = apply_filters ( 'minimum_site_name_length' , 4 );
if ( strlen ( $blogname ) < $minimum_site_name_length ) {
2019-09-02 20:41:05 -04:00
/* translators: %s: Minimum site name length. */
2017-05-09 10:59:47 -04:00
$errors -> add ( 'blogname' , sprintf ( _n ( 'Site name must be at least %s character.' , 'Site name must be at least %s characters.' , $minimum_site_name_length ), number_format_i18n ( $minimum_site_name_length ) ) );
2017-04-07 09:15:42 -04:00
}
2010-01-05 23:02:57 -05:00
// do not allow users to create a blog that conflicts with a page on the main blog.
2017-11-30 18:11:00 -05:00
if ( ! is_subdomain_install () && $wpdb -> get_var ( $wpdb -> prepare ( 'SELECT post_name FROM ' . $wpdb -> get_blog_prefix ( $current_network -> site_id ) . " posts WHERE post_type = 'page' AND post_name = %s " , $blogname ) ) ) {
2010-04-29 23:17:49 -04:00
$errors -> add ( 'blogname' , __ ( 'Sorry, you may not use that site name.' ) );
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
// all numeric?
2017-11-30 18:11:00 -05:00
if ( preg_match ( '/^[0-9]*$/' , $blogname ) ) {
$errors -> add ( 'blogname' , __ ( 'Sorry, site names must have letters too!' ) );
}
2010-01-05 23:02:57 -05:00
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters the new site name during registration .
2013-12-02 15:45:10 -05:00
*
* The name is the site 's subdomain or the site' s subdirectory
* path depending on the network settings .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param string $blogname Site name .
*/
2010-04-24 13:49:08 -04:00
$blogname = apply_filters ( 'newblogname' , $blogname );
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
$blog_title = wp_unslash ( $blog_title );
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
if ( empty ( $blog_title ) ) {
$errors -> add ( 'blog_title' , __ ( 'Please enter a site title.' ) );
}
2010-01-05 23:02:57 -05:00
// Check if the domain/path has been used already.
2010-01-12 13:40:40 -05:00
if ( is_subdomain_install () ) {
2010-05-28 20:32:10 -04:00
$mydomain = $blogname . '.' . preg_replace ( '|^www\.|' , '' , $domain );
2017-11-30 18:11:00 -05:00
$path = $base ;
2010-01-05 23:02:57 -05:00
} else {
$mydomain = " $domain " ;
2017-11-30 18:11:00 -05:00
$path = $base . $blogname . '/' ;
2010-01-05 23:02:57 -05:00
}
2017-11-30 18:11:00 -05:00
if ( domain_exists ( $mydomain , $path , $current_network -> id ) ) {
2012-10-05 15:04:34 -04:00
$errors -> add ( 'blogname' , __ ( 'Sorry, that site already exists!' ) );
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
if ( username_exists ( $blogname ) ) {
2017-11-30 18:11:00 -05:00
if ( ! is_object ( $user ) || ( is_object ( $user ) && ( $user -> user_login != $blogname ) ) ) {
2010-04-29 23:17:49 -04:00
$errors -> add ( 'blogname' , __ ( 'Sorry, that site is reserved!' ) );
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
}
// Has someone already signed up for this domain?
2017-11-30 18:11:00 -05:00
$signup = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->signups WHERE domain = %s AND path = %s " , $mydomain , $path ) ); // TODO: Check email too?
if ( ! empty ( $signup ) ) {
2019-03-07 04:12:51 -05:00
$diff = time () - mysql2date ( 'U' , $signup -> registered );
2010-01-05 23:02:57 -05:00
// If registered more than two days ago, cancel registration and let this signup go through.
2017-11-30 18:11:00 -05:00
if ( $diff > 2 * DAY_IN_SECONDS ) {
$wpdb -> delete (
2018-08-16 21:51:36 -04:00
$wpdb -> signups ,
array (
2017-11-30 18:11:00 -05:00
'domain' => $mydomain ,
'path' => $path ,
)
);
} else {
$errors -> add ( 'blogname' , __ ( 'That site is currently reserved but may be available in a couple days.' ) );
}
2010-01-05 23:02:57 -05:00
}
2017-11-30 18:11:00 -05:00
$result = array (
'domain' => $mydomain ,
'path' => $path ,
'blogname' => $blogname ,
'blog_title' => $blog_title ,
'user' => $user ,
'errors' => $errors ,
);
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters site details and error messages following registration .
2013-12-02 15:45:10 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param array $result {
* Array of domain , path , blog name , blog title , user and error messages .
*
2015-09-28 21:33:27 -04:00
* @ type string $domain Domain for the site .
2017-08-22 07:52:48 -04:00
* @ type string $path Path for the site . Used in subdirectory installations .
2015-09-28 21:33:27 -04:00
* @ type string $blogname The unique site name ( slug ) .
* @ type string $blog_title Blog title .
* @ type string | WP_User $user By default , an empty string . A user object if provided .
* @ type WP_Error $errors WP_Error containing any errors found .
2013-12-02 15:45:10 -05:00
* }
*/
return apply_filters ( 'wpmu_validate_blog_signup' , $result );
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Record site signup information for future activation .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 17:51:31 -04:00
*
* @ 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 04:02:38 -05:00
* @ param string $user_email The user ' s email address .
2017-01-11 23:57:39 -05:00
* @ param array $meta Optional . Signup meta data . By default , contains the requested privacy setting and lang_id .
2011-01-04 04:02:38 -05:00
*/
2017-11-30 18:11:00 -05:00
function wpmu_signup_blog ( $domain , $path , $title , $user , $user_email , $meta = array () ) {
2010-01-05 23:02:57 -05:00
global $wpdb ;
2017-01-11 00:30:42 -05:00
$key = substr ( md5 ( time () . wp_rand () . $domain ), 0 , 16 );
2010-01-06 23:27:46 -05:00
2017-01-16 22:53:42 -05:00
/**
* Filters the metadata for a site signup .
*
* The metadata will be serialized prior to storing it in the database .
*
* @ since 4.8 . 0
*
* @ param array $meta Signup meta data . Default empty array .
* @ param string $domain The requested domain .
* @ param string $path The requested path .
* @ param string $title The requested site title .
* @ param string $user The user ' s requested login name .
* @ param string $user_email The user ' s email address .
* @ param string $key The user ' s activation key .
*/
$meta = apply_filters ( 'signup_site_meta' , $meta , $domain , $path , $title , $user , $user_email , $key );
2017-11-30 18:11:00 -05:00
$wpdb -> insert (
2018-08-16 21:51:36 -04:00
$wpdb -> signups ,
array (
2017-11-30 18:11:00 -05:00
'domain' => $domain ,
'path' => $path ,
'title' => $title ,
'user_login' => $user ,
'user_email' => $user_email ,
'registered' => current_time ( 'mysql' , true ),
'activation_key' => $key ,
'meta' => serialize ( $meta ),
)
);
2010-01-05 23:02:57 -05:00
2015-09-13 23:28:24 -04:00
/**
* Fires after site signup information has been written to the database .
*
* @ since 4.4 . 0
*
* @ param string $domain The requested domain .
* @ param string $path The requested path .
* @ param string $title The requested site title .
* @ param string $user The user ' s requested login name .
* @ param string $user_email The user ' s email address .
2017-01-11 23:57:39 -05:00
* @ param string $key The user ' s activation key .
* @ param array $meta Signup meta data . By default , contains the requested privacy setting and lang_id .
2015-09-13 23:28:24 -04:00
*/
do_action ( 'after_signup_site' , $domain , $path , $title , $user , $user_email , $key , $meta );
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Record user signup information for future activation .
*
* This function is used when user registration is open but
* new site registration is not .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 17:51:31 -04:00
*
* @ param string $user The user ' s requested login name .
2011-01-04 04:02:38 -05:00
* @ param string $user_email The user ' s email address .
2017-01-11 23:57:39 -05:00
* @ param array $meta Optional . Signup meta data . Default empty array .
2011-01-04 04:02:38 -05:00
*/
2013-09-01 23:33:09 -04:00
function wpmu_signup_user ( $user , $user_email , $meta = array () ) {
2010-01-05 23:02:57 -05:00
global $wpdb ;
// Format data
2017-11-30 18:11:00 -05:00
$user = preg_replace ( '/\s+/' , '' , sanitize_user ( $user , true ) );
2010-01-05 23:02:57 -05:00
$user_email = sanitize_email ( $user_email );
2017-11-30 18:11:00 -05:00
$key = substr ( md5 ( time () . wp_rand () . $user_email ), 0 , 16 );
2010-01-06 23:27:46 -05:00
2017-01-16 22:53:42 -05:00
/**
* Filters the metadata for a user signup .
*
* The metadata will be serialized prior to storing it in the database .
*
* @ since 4.8 . 0
*
* @ param array $meta Signup meta data . Default empty array .
* @ param string $user The user ' s requested login name .
* @ param string $user_email The user ' s email address .
* @ param string $key The user ' s activation key .
*/
$meta = apply_filters ( 'signup_user_meta' , $meta , $user , $user_email , $key );
2017-11-30 18:11:00 -05:00
$wpdb -> insert (
2018-08-16 21:51:36 -04:00
$wpdb -> signups ,
array (
2017-11-30 18:11:00 -05:00
'domain' => '' ,
'path' => '' ,
'title' => '' ,
'user_login' => $user ,
'user_email' => $user_email ,
'registered' => current_time ( 'mysql' , true ),
'activation_key' => $key ,
'meta' => serialize ( $meta ),
)
);
2010-01-05 23:02:57 -05:00
2015-09-13 23:28:24 -04:00
/**
* Fires after a user ' s signup information has been written to the database .
*
* @ since 4.4 . 0
*
* @ param string $user The user ' s requested login name .
* @ param string $user_email The user ' s email address .
2017-01-11 23:57:39 -05:00
* @ param string $key The user ' s activation key .
* @ param array $meta Signup meta data . Default empty array .
2015-09-13 23:28:24 -04:00
*/
do_action ( 'after_signup_user' , $user , $user_email , $key , $meta );
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
2017-08-04 10:21:43 -04:00
* Send a confirmation request email to a user when they sign up for a new site . The new site will not become active
* until the confirmation link is clicked .
2011-01-04 04:02:38 -05:00
*
* This is the notification function used when site registration
* is enabled .
*
2016-05-23 14:56:27 -04:00
* Filter { @ see 'wpmu_signup_blog_notification' } to bypass this function or
2011-01-04 04:02:38 -05:00
* replace it with your own notification behavior .
*
2016-05-23 14:56:27 -04:00
* Filter { @ see 'wpmu_signup_blog_notification_email' } and
* { @ see 'wpmu_signup_blog_notification_subject' } to change the content
2011-01-04 04:02:38 -05:00
* and subject line of the email sent to newly registered users .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
2015-05-26 17:51:31 -04:00
* @ param string $domain The new blog domain .
* @ param string $path The new blog path .
* @ param string $title The site title .
2016-11-11 17:20:33 -05:00
* @ param string $user_login The user ' s login name .
2011-01-04 04:02:38 -05:00
* @ param string $user_email The user ' s email address .
2015-05-26 17:51:31 -04:00
* @ param string $key The activation key created in wpmu_signup_blog ()
2017-01-12 00:21:41 -05:00
* @ param array $meta Optional . Signup meta data . By default , contains the requested privacy setting and lang_id .
2011-01-04 04:02:38 -05:00
* @ return bool
*/
2016-11-11 17:20:33 -05:00
function wpmu_signup_blog_notification ( $domain , $path , $title , $user_login , $user_email , $key , $meta = array () ) {
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters whether to bypass the new site email notification .
2013-12-02 15:45:10 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param string | bool $domain Site domain .
* @ param string $path Site path .
* @ param string $title Site title .
2016-11-11 17:20:33 -05:00
* @ param string $user_login User login name .
2013-12-02 15:45:10 -05:00
* @ param string $user_email User email address .
* @ param string $key Activation key created in wpmu_signup_blog () .
2017-01-12 00:21:41 -05:00
* @ param array $meta Signup meta data . By default , contains the requested privacy setting and lang_id .
2013-12-02 15:45:10 -05:00
*/
2016-11-11 17:20:33 -05:00
if ( ! apply_filters ( 'wpmu_signup_blog_notification' , $domain , $path , $title , $user_login , $user_email , $key , $meta ) ) {
2010-01-05 23:02:57 -05:00
return false ;
2013-12-02 15:45:10 -05:00
}
2010-01-05 23:02:57 -05:00
// Send email with activation link.
2017-11-30 18:11:00 -05:00
if ( ! is_subdomain_install () || get_current_network_id () != 1 ) {
$activate_url = network_site_url ( " wp-activate.php?key= $key " );
} else {
2010-03-29 17:45:31 -04:00
$activate_url = " http:// { $domain } { $path } wp-activate.php?key= $key " ; // @todo use *_url() API
2017-11-30 18:11:00 -05:00
}
2010-01-12 13:40:40 -05:00
2017-11-30 18:11:00 -05:00
$activate_url = esc_url ( $activate_url );
$admin_email = get_site_option ( 'admin_email' );
if ( $admin_email == '' ) {
2010-01-05 23:02:57 -05:00
$admin_email = 'support@' . $_SERVER [ 'SERVER_NAME' ];
2017-11-30 18:11:00 -05:00
}
$from_name = get_site_option ( 'site_name' ) == '' ? 'WordPress' : esc_html ( get_site_option ( 'site_name' ) );
$message_headers = " From: \" { $from_name } \" < { $admin_email } > \n " . 'Content-Type: text/plain; charset="' . get_option ( 'blog_charset' ) . " \" \n " ;
2016-10-26 11:36:31 -04:00
2017-11-30 18:11:00 -05:00
$user = get_user_by ( 'login' , $user_login );
2016-10-26 11:36:31 -04:00
$switched_locale = switch_to_locale ( get_user_locale ( $user ) );
2010-08-31 14:19:15 -04:00
$message = sprintf (
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters the message content of the new blog notification email .
2013-12-02 15:45:10 -05:00
*
* Content should be formatted for transmission via wp_mail () .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param string $content Content of the notification email .
* @ param string $domain Site domain .
* @ param string $path Site path .
* @ param string $title Site title .
2016-11-11 17:20:33 -05:00
* @ param string $user_login User login name .
2013-12-02 15:45:10 -05:00
* @ param string $user_email User email address .
* @ param string $key Activation key created in wpmu_signup_blog () .
2017-01-12 00:21:41 -05:00
* @ param array $meta Signup meta data . By default , contains the requested privacy setting and lang_id .
2013-12-02 15:45:10 -05:00
*/
2017-11-30 18:11:00 -05:00
apply_filters (
'wpmu_signup_blog_notification_email' ,
2019-09-02 20:41:05 -04:00
/* translators: New site notification email. 1: Activation URL, 2: New site URL. */
2017-11-30 18:11:00 -05:00
__ ( " To activate your blog, please click the following link: \n \n %1 \$ s \n \n After you activate, you will receive *another email* with your login. \n \n After you activate, you can visit your site here: \n \n %2 \$ s " ),
2018-08-16 21:51:36 -04:00
$domain ,
$path ,
$title ,
$user_login ,
$user_email ,
$key ,
$meta
2010-08-31 14:19:15 -04:00
),
$activate_url ,
esc_url ( " http:// { $domain } { $path } " ),
$key
);
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
2010-08-31 14:19:15 -04:00
$subject = sprintf (
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters the subject of the new blog notification email .
2013-12-02 15:45:10 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param string $subject Subject of the notification email .
* @ param string $domain Site domain .
* @ param string $path Site path .
* @ param string $title Site title .
2016-11-11 17:20:33 -05:00
* @ param string $user_login User login name .
2013-12-02 15:45:10 -05:00
* @ param string $user_email User email address .
* @ param string $key Activation key created in wpmu_signup_blog () .
2017-01-12 00:21:41 -05:00
* @ param array $meta Signup meta data . By default , contains the requested privacy setting and lang_id .
2013-12-02 15:45:10 -05:00
*/
2017-11-30 18:11:00 -05:00
apply_filters (
'wpmu_signup_blog_notification_subject' ,
2019-09-02 20:41:05 -04:00
/* translators: New site notification email subject. 1: Network title, 2: New site URL. */
2016-11-20 20:22:32 -05:00
_x ( '[%1$s] Activate %2$s' , 'New site notification email subject' ),
2018-08-16 21:51:36 -04:00
$domain ,
$path ,
$title ,
$user_login ,
$user_email ,
$key ,
$meta
2010-08-31 14:19:15 -04:00
),
$from_name ,
esc_url ( 'http://' . $domain . $path )
);
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
2014-03-27 22:44:15 -04:00
wp_mail ( $user_email , wp_specialchars_decode ( $subject ), $message , $message_headers );
2016-10-26 11:36:31 -04:00
if ( $switched_locale ) {
restore_previous_locale ();
}
2010-01-05 23:02:57 -05:00
return true ;
}
2011-01-04 04:02:38 -05:00
/**
2017-08-04 10:21:43 -04:00
* Send a confirmation request email to a user when they sign up for a new user account ( without signing up for a site
* at the same time ) . The user account will not become active until the confirmation link is clicked .
2011-01-04 04:02:38 -05:00
*
* This is the notification function used when no new site has
* been requested .
*
2016-05-23 14:56:27 -04:00
* Filter { @ see 'wpmu_signup_user_notification' } to bypass this function or
2011-01-04 04:02:38 -05:00
* replace it with your own notification behavior .
*
2016-05-23 14:56:27 -04:00
* Filter { @ see 'wpmu_signup_user_notification_email' } and
* { @ see 'wpmu_signup_user_notification_subject' } to change the content
2011-01-04 04:02:38 -05:00
* and subject line of the email sent to newly registered users .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
2016-11-11 17:20:33 -05:00
* @ param string $user_login The user ' s login name .
2011-01-04 04:02:38 -05:00
* @ param string $user_email The user ' s email address .
2015-05-26 17:51:31 -04:00
* @ param string $key The activation key created in wpmu_signup_user ()
2017-01-12 00:21:41 -05:00
* @ param array $meta Optional . Signup meta data . Default empty array .
2011-01-04 04:02:38 -05:00
* @ return bool
*/
2016-11-11 17:20:33 -05:00
function wpmu_signup_user_notification ( $user_login , $user_email , $key , $meta = array () ) {
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters whether to bypass the email notification for new user sign - up .
2013-12-02 15:45:10 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
2016-11-11 17:20:33 -05:00
* @ param string $user_login User login name .
2013-12-02 15:45:10 -05:00
* @ param string $user_email User email address .
* @ param string $key Activation key created in wpmu_signup_user () .
2017-01-12 00:21:41 -05:00
* @ param array $meta Signup meta data . Default empty array .
2013-12-02 15:45:10 -05:00
*/
2017-11-30 18:11:00 -05:00
if ( ! apply_filters ( 'wpmu_signup_user_notification' , $user_login , $user_email , $key , $meta ) ) {
2010-01-05 23:02:57 -05:00
return false ;
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
$user = get_user_by ( 'login' , $user_login );
2016-10-26 11:36:31 -04:00
$switched_locale = switch_to_locale ( get_user_locale ( $user ) );
2010-01-05 23:02:57 -05:00
// Send email with activation link.
2015-10-07 13:11:25 -04:00
$admin_email = get_site_option ( 'admin_email' );
2017-11-30 18:11:00 -05:00
if ( $admin_email == '' ) {
2010-01-05 23:02:57 -05:00
$admin_email = 'support@' . $_SERVER [ 'SERVER_NAME' ];
2017-11-30 18:11:00 -05:00
}
$from_name = get_site_option ( 'site_name' ) == '' ? 'WordPress' : esc_html ( get_site_option ( 'site_name' ) );
$message_headers = " From: \" { $from_name } \" < { $admin_email } > \n " . 'Content-Type: text/plain; charset="' . get_option ( 'blog_charset' ) . " \" \n " ;
$message = sprintf (
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters the content of the notification email for new user sign - up .
2013-12-02 15:45:10 -05:00
*
* Content should be formatted for transmission via wp_mail () .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param string $content Content of the notification email .
2016-11-11 17:20:33 -05:00
* @ param string $user_login User login name .
2013-12-02 15:45:10 -05:00
* @ param string $user_email User email address .
* @ param string $key Activation key created in wpmu_signup_user () .
2017-01-12 00:21:41 -05:00
* @ param array $meta Signup meta data . Default empty array .
2013-12-02 15:45:10 -05:00
*/
2017-11-30 18:11:00 -05:00
apply_filters (
'wpmu_signup_user_notification_email' ,
2019-09-02 20:41:05 -04:00
/* translators: New user notification email. %s: Activation URL. */
2012-10-25 18:21:15 -04: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. " ),
2018-08-16 21:51:36 -04:00
$user_login ,
$user_email ,
$key ,
$meta
2010-08-31 14:19:15 -04:00
),
2011-05-23 01:43:07 -04:00
site_url ( " wp-activate.php?key= $key " )
2010-08-31 14:19:15 -04:00
);
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
2010-08-31 14:19:15 -04:00
$subject = sprintf (
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters the subject of the notification email of new user signup .
2013-12-02 15:45:10 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param string $subject Subject of the notification email .
2016-11-11 17:20:33 -05:00
* @ param string $user_login User login name .
2013-12-02 15:45:10 -05:00
* @ param string $user_email User email address .
* @ param string $key Activation key created in wpmu_signup_user () .
2017-01-12 00:21:41 -05:00
* @ param array $meta Signup meta data . Default empty array .
2013-12-02 15:45:10 -05:00
*/
2017-11-30 18:11:00 -05:00
apply_filters (
'wpmu_signup_user_notification_subject' ,
2019-09-02 20:41:05 -04:00
/* translators: New user notification email subject. 1: Network title, 2: New user login. */
2016-11-20 20:22:32 -05:00
_x ( '[%1$s] Activate %2$s' , 'New user notification email subject' ),
2018-08-16 21:51:36 -04:00
$user_login ,
$user_email ,
$key ,
$meta
2010-08-31 14:19:15 -04:00
),
$from_name ,
2016-11-11 17:20:33 -05:00
$user_login
2010-08-31 14:19:15 -04:00
);
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
2014-03-27 22:44:15 -04:00
wp_mail ( $user_email , wp_specialchars_decode ( $subject ), $message , $message_headers );
2016-10-26 11:36:31 -04:00
if ( $switched_locale ) {
restore_previous_locale ();
}
2010-01-05 23:02:57 -05:00
return true ;
}
2011-01-04 04:02:38 -05:00
/**
* Activate a signup .
*
2016-05-23 14:56:27 -04:00
* Hook to { @ see 'wpmu_activate_user' } or { @ see 'wpmu_activate_blog' } for events
2011-01-04 04:02:38 -05:00
* 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 ) .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 17:51:31 -04:00
*
2011-01-04 04:02:38 -05:00
* @ param string $key The activation key provided to the user .
2015-05-26 17:51:31 -04:00
* @ return array | WP_Error An array containing information about the activated user and / or blog
2011-01-04 04:02:38 -05:00
*/
2017-11-30 18:11:00 -05:00
function wpmu_activate_signup ( $key ) {
2013-08-14 23:13:05 -04:00
global $wpdb ;
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
$signup = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->signups WHERE activation_key = %s " , $key ) );
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
if ( empty ( $signup ) ) {
2010-12-15 12:09:26 -05:00
return new WP_Error ( 'invalid_key' , __ ( 'Invalid activation key.' ) );
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
2010-12-15 12:09:26 -05:00
if ( $signup -> active ) {
2017-11-30 18:11:00 -05:00
if ( empty ( $signup -> domain ) ) {
2010-12-15 12:09:26 -05:00
return new WP_Error ( 'already_active' , __ ( 'The user is already active.' ), $signup );
2017-11-30 18:11:00 -05:00
} else {
2010-12-15 12:09:26 -05:00
return new WP_Error ( 'already_active' , __ ( 'The site is already active.' ), $signup );
2017-11-30 18:11:00 -05:00
}
2010-12-15 12:09:26 -05:00
}
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
$meta = maybe_unserialize ( $signup -> meta );
2010-11-10 18:31:54 -05:00
$password = wp_generate_password ( 12 , false );
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
$user_id = username_exists ( $signup -> user_login );
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
if ( ! $user_id ) {
$user_id = wpmu_create_user ( $signup -> user_login , $password , $signup -> user_email );
} else {
2010-01-05 23:02:57 -05:00
$user_already_exists = true ;
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
if ( ! $user_id ) {
return new WP_Error ( 'create_user' , __ ( 'Could not create user' ), $signup );
}
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
$now = current_time ( 'mysql' , true );
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
if ( empty ( $signup -> domain ) ) {
$wpdb -> update (
2018-08-16 21:51:36 -04:00
$wpdb -> signups ,
array (
2017-11-30 18:11:00 -05:00
'active' => 1 ,
'activated' => $now ,
2018-08-16 21:51:36 -04:00
),
array ( 'activation_key' => $key )
2017-11-30 18:11:00 -05:00
);
2010-01-12 13:40:40 -05:00
2017-11-30 18:11:00 -05:00
if ( isset ( $user_already_exists ) ) {
return new WP_Error ( 'user_already_exists' , __ ( 'That username is already activated.' ), $signup );
}
2010-01-12 13:40:40 -05:00
2013-12-02 15:45:10 -05:00
/**
* Fires immediately after a new user is activated .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param int $user_id User ID .
* @ param int $password User password .
* @ param array $meta Signup meta data .
*/
2013-02-28 15:28:36 -05:00
do_action ( 'wpmu_activate_user' , $user_id , $password , $meta );
2017-11-30 18:11:00 -05:00
return array (
'user_id' => $user_id ,
'password' => $password ,
'meta' => $meta ,
);
2010-01-05 23:02:57 -05:00
}
2017-08-12 09:11:43 -04:00
$blog_id = wpmu_create_blog ( $signup -> domain , $signup -> path , $signup -> title , $user_id , $meta , get_current_network_id () );
2010-01-05 23:02:57 -05:00
// TODO: What to do if we create a user but cannot create a blog?
2017-11-30 18:11:00 -05:00
if ( is_wp_error ( $blog_id ) ) {
2010-01-05 23:02:57 -05:00
// If blog is taken, that means a previous attempt to activate this blog failed in between creating the blog and
2011-12-13 18:45:31 -05:00
// setting the activation flag. Let's just set the active flag and instruct the user to reset their password.
2010-01-05 23:02:57 -05:00
if ( 'blog_taken' == $blog_id -> get_error_code () ) {
$blog_id -> add_data ( $signup );
2017-11-30 18:11:00 -05:00
$wpdb -> update (
2018-08-16 21:51:36 -04:00
$wpdb -> signups ,
array (
2017-11-30 18:11:00 -05:00
'active' => 1 ,
'activated' => $now ,
2018-08-16 21:51:36 -04:00
),
array ( 'activation_key' => $key )
2017-11-30 18:11:00 -05:00
);
2010-01-05 23:02:57 -05:00
}
return $blog_id ;
}
2017-11-30 18:11:00 -05:00
$wpdb -> update (
2018-08-16 21:51:36 -04:00
$wpdb -> signups ,
array (
2017-11-30 18:11:00 -05:00
'active' => 1 ,
'activated' => $now ,
2018-08-16 21:51:36 -04:00
),
array ( 'activation_key' => $key )
2017-11-30 18:11:00 -05:00
);
2013-12-02 15:45:10 -05:00
/**
* Fires immediately after a site is activated .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param int $blog_id Blog ID .
* @ param int $user_id User ID .
* @ param int $password User password .
* @ param string $signup_title Site title .
2017-01-12 00:21:41 -05:00
* @ param array $meta Signup meta data . By default , contains the requested privacy setting and lang_id .
2013-12-02 15:45:10 -05:00
*/
do_action ( 'wpmu_activate_blog' , $blog_id , $user_id , $password , $signup -> title , $meta );
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
return array (
'blog_id' => $blog_id ,
'user_id' => $user_id ,
'password' => $password ,
'title' => $signup -> title ,
'meta' => $meta ,
);
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Create a user .
*
* This function runs when a user self - registers as well as when
2016-05-23 14:56:27 -04:00
* a Super Admin creates a new user . Hook to { @ see 'wpmu_new_user' } for events
2011-01-04 04:02:38 -05:00
* that should affect all new users , but only on Multisite ( otherwise
2016-05-23 14:56:27 -04:00
* use { @ see 'user_register' }) .
2011-01-04 04:02:38 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
* @ param string $user_name The new user ' s login name .
2015-05-26 17:51:31 -04: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 04:02:38 -05:00
*/
2013-01-18 10:30:55 -05:00
function wpmu_create_user ( $user_name , $password , $email ) {
2010-04-24 13:49:08 -04:00
$user_name = preg_replace ( '/\s+/' , '' , sanitize_user ( $user_name , true ) );
2010-01-05 23:02:57 -05:00
2010-01-20 16:58:13 -05:00
$user_id = wp_create_user ( $user_name , $password , $email );
2017-11-30 18:11:00 -05:00
if ( is_wp_error ( $user_id ) ) {
2010-01-05 23:02:57 -05:00
return false ;
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
// Newly created users have no roles or caps until they are added to a blog.
2013-08-30 12:29:12 -04:00
delete_user_option ( $user_id , 'capabilities' );
2010-04-23 10:25:05 -04:00
delete_user_option ( $user_id , 'user_level' );
2010-01-05 23:02:57 -05:00
2013-12-02 15:45:10 -05:00
/**
* Fires immediately after a new user is created .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param int $user_id User ID .
*/
2010-01-05 23:02:57 -05:00
do_action ( 'wpmu_new_user' , $user_id );
return $user_id ;
}
2011-01-04 04:02:38 -05:00
/**
* Create a site .
*
* This function runs when a user self - registers a new site as well
2016-05-23 14:56:27 -04:00
* as when a Super Admin creates a new site . Hook to { @ see 'wpmu_new_blog' }
2011-01-04 04:02:38 -05:00
* for events that should affect all new sites .
*
2017-08-22 07:52:48 -04:00
* On subdirectory installations , $domain is the same as the main site ' s
2011-01-04 04:02:38 -05:00
* domain , and the path is the subdirectory name ( eg 'example.com'
2017-08-22 07:52:48 -04:00
* and '/blog1/' ) . On subdomain installations , $domain is the new subdomain +
2011-01-04 04:02:38 -05:00
* root domain ( eg 'blog1.example.com' ), and $path is '/' .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
2017-08-12 08:48:47 -04: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 .
Multisite: Introduce a site initialization and uninitialization API.
This changeset makes the new CRUD API for sites introduced in [43548] usable for real-world sites. A new function `wp_initialize_site()`, which takes care of creating a site's database tables and populating them with initial values, is hooked into the site insertion process that is initiated when calling `wp_insert_site()`. Similarly, a new function `wp_uninitialize_site()`, which takes care of dropping a site's database tables, is hooked into the site deletion process that is initiated when calling `wp_delete_site()`.
A new function `wp_is_site_initialized()` completes the API, allowing to check whether a site is initialized. Since this function always makes a database request in its default behavior, it should be called with caution. Plugins that would like to use site initialization in special ways can leverage a `pre_wp_is_site_initialized` filter to alter that default behavior.
The separate handling of the site's row in the `wp_blogs` database table and the actual site setup allows for more flexibility in controlling whether or how a site's data is set up. For example, a unit test that only checks data from the site's database table row can unhook the site initialization process to improve performance. At the same time, developers consuming the new sites API only need to know about the CRUD functions, since the initialization and uninitialization processes happen internally.
With this changeset, the foundation for a sites REST API endpoint is fully available. The previously recommended functions `wpmu_create_blog()` and `wpmu_delete_blog()` now call the new respective function internally. Further follow-up work to this includes replacing calls to `wpmu_create_blog()` with `wp_insert_site()`, `update_blog_details()` with `wp_update_site()` and `wpmu_delete_blog()` with `wp_delete_blog()` throughout the codebase.
As a side-effect of this work, the `wpmu_new_blog`, `delete_blog`, and `deleted_blog` actions and the `install_blog()` function have been deprecated.
Fixes #41333. See #40364.
Built from https://develop.svn.wordpress.org/trunk@43654
git-svn-id: http://core.svn.wordpress.org/trunk@43483 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-09-24 11:09:26 -04:00
* @ param array $options Optional . Array of key => value pairs used to set initial site options .
2017-08-12 08:48:47 -04:00
* If valid status keys are included ( 'public' , 'archived' , 'mature' ,
* 'spam' , 'deleted' , or 'lang_id' ) the given site status ( es ) will be
* updated . Otherwise , keys and values will be used to set options for
* the new site . Default empty array .
2017-08-22 07:52:48 -04:00
* @ param int $network_id Optional . Network ID . Only relevant on multi - network installations .
2017-07-14 17:08:43 -04:00
* @ return int | WP_Error Returns WP_Error object on failure , the new site ID on success .
2011-01-04 04:02:38 -05:00
*/
Multisite: Introduce a site initialization and uninitialization API.
This changeset makes the new CRUD API for sites introduced in [43548] usable for real-world sites. A new function `wp_initialize_site()`, which takes care of creating a site's database tables and populating them with initial values, is hooked into the site insertion process that is initiated when calling `wp_insert_site()`. Similarly, a new function `wp_uninitialize_site()`, which takes care of dropping a site's database tables, is hooked into the site deletion process that is initiated when calling `wp_delete_site()`.
A new function `wp_is_site_initialized()` completes the API, allowing to check whether a site is initialized. Since this function always makes a database request in its default behavior, it should be called with caution. Plugins that would like to use site initialization in special ways can leverage a `pre_wp_is_site_initialized` filter to alter that default behavior.
The separate handling of the site's row in the `wp_blogs` database table and the actual site setup allows for more flexibility in controlling whether or how a site's data is set up. For example, a unit test that only checks data from the site's database table row can unhook the site initialization process to improve performance. At the same time, developers consuming the new sites API only need to know about the CRUD functions, since the initialization and uninitialization processes happen internally.
With this changeset, the foundation for a sites REST API endpoint is fully available. The previously recommended functions `wpmu_create_blog()` and `wpmu_delete_blog()` now call the new respective function internally. Further follow-up work to this includes replacing calls to `wpmu_create_blog()` with `wp_insert_site()`, `update_blog_details()` with `wp_update_site()` and `wpmu_delete_blog()` with `wp_delete_blog()` throughout the codebase.
As a side-effect of this work, the `wpmu_new_blog`, `delete_blog`, and `deleted_blog` actions and the `install_blog()` function have been deprecated.
Fixes #41333. See #40364.
Built from https://develop.svn.wordpress.org/trunk@43654
git-svn-id: http://core.svn.wordpress.org/trunk@43483 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-09-24 11:09:26 -04:00
function wpmu_create_blog ( $domain , $path , $title , $user_id , $options = array (), $network_id = 1 ) {
2016-09-26 14:39:32 -04:00
$defaults = array (
'public' => 0 ,
);
Multisite: Introduce a site initialization and uninitialization API.
This changeset makes the new CRUD API for sites introduced in [43548] usable for real-world sites. A new function `wp_initialize_site()`, which takes care of creating a site's database tables and populating them with initial values, is hooked into the site insertion process that is initiated when calling `wp_insert_site()`. Similarly, a new function `wp_uninitialize_site()`, which takes care of dropping a site's database tables, is hooked into the site deletion process that is initiated when calling `wp_delete_site()`.
A new function `wp_is_site_initialized()` completes the API, allowing to check whether a site is initialized. Since this function always makes a database request in its default behavior, it should be called with caution. Plugins that would like to use site initialization in special ways can leverage a `pre_wp_is_site_initialized` filter to alter that default behavior.
The separate handling of the site's row in the `wp_blogs` database table and the actual site setup allows for more flexibility in controlling whether or how a site's data is set up. For example, a unit test that only checks data from the site's database table row can unhook the site initialization process to improve performance. At the same time, developers consuming the new sites API only need to know about the CRUD functions, since the initialization and uninitialization processes happen internally.
With this changeset, the foundation for a sites REST API endpoint is fully available. The previously recommended functions `wpmu_create_blog()` and `wpmu_delete_blog()` now call the new respective function internally. Further follow-up work to this includes replacing calls to `wpmu_create_blog()` with `wp_insert_site()`, `update_blog_details()` with `wp_update_site()` and `wpmu_delete_blog()` with `wp_delete_blog()` throughout the codebase.
As a side-effect of this work, the `wpmu_new_blog`, `delete_blog`, and `deleted_blog` actions and the `install_blog()` function have been deprecated.
Fixes #41333. See #40364.
Built from https://develop.svn.wordpress.org/trunk@43654
git-svn-id: http://core.svn.wordpress.org/trunk@43483 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-09-24 11:09:26 -04:00
$options = wp_parse_args ( $options , $defaults );
2013-08-26 14:57:10 -04:00
2017-11-30 18:11:00 -05:00
$title = strip_tags ( $title );
2010-01-05 23:02:57 -05:00
$user_id = ( int ) $user_id ;
// Check if the domain has been used already. We should return an error message.
2017-11-30 18:11:00 -05:00
if ( domain_exists ( $domain , $path , $network_id ) ) {
2012-10-05 15:04:34 -04:00
return new WP_Error ( 'blog_taken' , __ ( 'Sorry, that site already exists!' ) );
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
Use `wp_installing()` instead of `WP_INSTALLING` constant.
The `WP_INSTALLING` constant is a flag that WordPress sets in a number of
places, telling the system that options should be fetched directly from the
database instead of from the cache, that WP should not ping wordpress.org for
updates, that the normal "not installed" checks should be bypassed, and so on.
A constant is generally necessary for this purpose, because the flag is
typically set before the WP bootstrap, meaning that WP functions are not yet
available. However, it is possible - notably, during `wpmu_create_blog()` -
for the "installing" flag to be set after WP has already loaded. In these
cases, `WP_INSTALLING` would be set for the remainder of the process, since
there's no way to change a constant once it's defined. This, in turn, polluted
later function calls that ought to have been outside the scope of site
creation, particularly the non-caching of option data. The problem was
particularly evident in the case of the automated tests, where `WP_INSTALLING`
was set the first time a site was created, and remained set for the rest of the
suite.
The new `wp_installing()` function allows developers to fetch the current
installation status (when called without any arguments) or to set the
installation status (when called with a boolean `true` or `false`). Use of
the `WP_INSTALLING` constant is still supported; `wp_installing()` will default
to `true` if the constant is defined during the bootstrap.
Props boonebgorges, jeremyfelt.
See #31130.
Built from https://develop.svn.wordpress.org/trunk@34828
git-svn-id: http://core.svn.wordpress.org/trunk@34793 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-10-05 11:06:28 -04:00
if ( ! wp_installing () ) {
wp_installing ( true );
}
2010-01-05 23:02:57 -05:00
Multisite: Complete the new CRUD API for managing sites.
New functions `wp_insert_site( $data )`, `wp_update_site( $id, $data )` and `wp_delete_site( $id )` are introduced to manage site rows in the `wp_blogs` table, forming the new CRUD API together with the existing `get_site()` / `get_sites()`. The new API provides various benefits over the previously existing API, fixing several cache invalidation issues and being hook-driven so that normalization and validation of the passed data can be fully customized.
New hooks introduced as part of this are the actions `wp_insert_site`, `wp_update_site`, `wp_delete_site`, `wp_validate_site_data` and the filter `wp_normalize_site_data`.
At this point, `wp_insert_site()` does not handle setting up the site's database tables, and `wp_delete_site()` does not handle dropping the site's database tables, so the two can not yet be used directly as full replacements of `wpmu_create_blog()` and `wpmu_delete_blog()`. Managing the site's database tables will be added via hooks as part of the follow-up ticket #41333.
The existing functions `wpmu_create_blog()`, `update_blog_details()`, and `wpmu_delete_blog()` make use of the respective new counterpart and will be obsolete once #41333 has been completed.
Props flixos90, jeremyfelt, spacedmonkey.
Fixes #40364.
Built from https://develop.svn.wordpress.org/trunk@43548
git-svn-id: http://core.svn.wordpress.org/trunk@43377 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-08-01 09:06:26 -04:00
$site_data_whitelist = array ( 'public' , 'archived' , 'mature' , 'spam' , 'deleted' , 'lang_id' );
$site_data = array_merge (
array (
'domain' => $domain ,
'path' => $path ,
'network_id' => $network_id ,
),
Multisite: Introduce a site initialization and uninitialization API.
This changeset makes the new CRUD API for sites introduced in [43548] usable for real-world sites. A new function `wp_initialize_site()`, which takes care of creating a site's database tables and populating them with initial values, is hooked into the site insertion process that is initiated when calling `wp_insert_site()`. Similarly, a new function `wp_uninitialize_site()`, which takes care of dropping a site's database tables, is hooked into the site deletion process that is initiated when calling `wp_delete_site()`.
A new function `wp_is_site_initialized()` completes the API, allowing to check whether a site is initialized. Since this function always makes a database request in its default behavior, it should be called with caution. Plugins that would like to use site initialization in special ways can leverage a `pre_wp_is_site_initialized` filter to alter that default behavior.
The separate handling of the site's row in the `wp_blogs` database table and the actual site setup allows for more flexibility in controlling whether or how a site's data is set up. For example, a unit test that only checks data from the site's database table row can unhook the site initialization process to improve performance. At the same time, developers consuming the new sites API only need to know about the CRUD functions, since the initialization and uninitialization processes happen internally.
With this changeset, the foundation for a sites REST API endpoint is fully available. The previously recommended functions `wpmu_create_blog()` and `wpmu_delete_blog()` now call the new respective function internally. Further follow-up work to this includes replacing calls to `wpmu_create_blog()` with `wp_insert_site()`, `update_blog_details()` with `wp_update_site()` and `wpmu_delete_blog()` with `wp_delete_blog()` throughout the codebase.
As a side-effect of this work, the `wpmu_new_blog`, `delete_blog`, and `deleted_blog` actions and the `install_blog()` function have been deprecated.
Fixes #41333. See #40364.
Built from https://develop.svn.wordpress.org/trunk@43654
git-svn-id: http://core.svn.wordpress.org/trunk@43483 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-09-24 11:09:26 -04:00
array_intersect_key ( $options , array_flip ( $site_data_whitelist ) )
Multisite: Complete the new CRUD API for managing sites.
New functions `wp_insert_site( $data )`, `wp_update_site( $id, $data )` and `wp_delete_site( $id )` are introduced to manage site rows in the `wp_blogs` table, forming the new CRUD API together with the existing `get_site()` / `get_sites()`. The new API provides various benefits over the previously existing API, fixing several cache invalidation issues and being hook-driven so that normalization and validation of the passed data can be fully customized.
New hooks introduced as part of this are the actions `wp_insert_site`, `wp_update_site`, `wp_delete_site`, `wp_validate_site_data` and the filter `wp_normalize_site_data`.
At this point, `wp_insert_site()` does not handle setting up the site's database tables, and `wp_delete_site()` does not handle dropping the site's database tables, so the two can not yet be used directly as full replacements of `wpmu_create_blog()` and `wpmu_delete_blog()`. Managing the site's database tables will be added via hooks as part of the follow-up ticket #41333.
The existing functions `wpmu_create_blog()`, `update_blog_details()`, and `wpmu_delete_blog()` make use of the respective new counterpart and will be obsolete once #41333 has been completed.
Props flixos90, jeremyfelt, spacedmonkey.
Fixes #40364.
Built from https://develop.svn.wordpress.org/trunk@43548
git-svn-id: http://core.svn.wordpress.org/trunk@43377 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-08-01 09:06:26 -04:00
);
Multisite: Introduce a site initialization and uninitialization API.
This changeset makes the new CRUD API for sites introduced in [43548] usable for real-world sites. A new function `wp_initialize_site()`, which takes care of creating a site's database tables and populating them with initial values, is hooked into the site insertion process that is initiated when calling `wp_insert_site()`. Similarly, a new function `wp_uninitialize_site()`, which takes care of dropping a site's database tables, is hooked into the site deletion process that is initiated when calling `wp_delete_site()`.
A new function `wp_is_site_initialized()` completes the API, allowing to check whether a site is initialized. Since this function always makes a database request in its default behavior, it should be called with caution. Plugins that would like to use site initialization in special ways can leverage a `pre_wp_is_site_initialized` filter to alter that default behavior.
The separate handling of the site's row in the `wp_blogs` database table and the actual site setup allows for more flexibility in controlling whether or how a site's data is set up. For example, a unit test that only checks data from the site's database table row can unhook the site initialization process to improve performance. At the same time, developers consuming the new sites API only need to know about the CRUD functions, since the initialization and uninitialization processes happen internally.
With this changeset, the foundation for a sites REST API endpoint is fully available. The previously recommended functions `wpmu_create_blog()` and `wpmu_delete_blog()` now call the new respective function internally. Further follow-up work to this includes replacing calls to `wpmu_create_blog()` with `wp_insert_site()`, `update_blog_details()` with `wp_update_site()` and `wpmu_delete_blog()` with `wp_delete_blog()` throughout the codebase.
As a side-effect of this work, the `wpmu_new_blog`, `delete_blog`, and `deleted_blog` actions and the `install_blog()` function have been deprecated.
Fixes #41333. See #40364.
Built from https://develop.svn.wordpress.org/trunk@43654
git-svn-id: http://core.svn.wordpress.org/trunk@43483 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-09-24 11:09:26 -04:00
// Data to pass to wp_initialize_site().
$site_initialization_data = array (
'title' => $title ,
'user_id' => $user_id ,
'options' => array_diff_key ( $options , array_flip ( $site_data_whitelist ) ),
);
Multisite: Complete the new CRUD API for managing sites.
New functions `wp_insert_site( $data )`, `wp_update_site( $id, $data )` and `wp_delete_site( $id )` are introduced to manage site rows in the `wp_blogs` table, forming the new CRUD API together with the existing `get_site()` / `get_sites()`. The new API provides various benefits over the previously existing API, fixing several cache invalidation issues and being hook-driven so that normalization and validation of the passed data can be fully customized.
New hooks introduced as part of this are the actions `wp_insert_site`, `wp_update_site`, `wp_delete_site`, `wp_validate_site_data` and the filter `wp_normalize_site_data`.
At this point, `wp_insert_site()` does not handle setting up the site's database tables, and `wp_delete_site()` does not handle dropping the site's database tables, so the two can not yet be used directly as full replacements of `wpmu_create_blog()` and `wpmu_delete_blog()`. Managing the site's database tables will be added via hooks as part of the follow-up ticket #41333.
The existing functions `wpmu_create_blog()`, `update_blog_details()`, and `wpmu_delete_blog()` make use of the respective new counterpart and will be obsolete once #41333 has been completed.
Props flixos90, jeremyfelt, spacedmonkey.
Fixes #40364.
Built from https://develop.svn.wordpress.org/trunk@43548
git-svn-id: http://core.svn.wordpress.org/trunk@43377 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-08-01 09:06:26 -04:00
Multisite: Introduce a site initialization and uninitialization API.
This changeset makes the new CRUD API for sites introduced in [43548] usable for real-world sites. A new function `wp_initialize_site()`, which takes care of creating a site's database tables and populating them with initial values, is hooked into the site insertion process that is initiated when calling `wp_insert_site()`. Similarly, a new function `wp_uninitialize_site()`, which takes care of dropping a site's database tables, is hooked into the site deletion process that is initiated when calling `wp_delete_site()`.
A new function `wp_is_site_initialized()` completes the API, allowing to check whether a site is initialized. Since this function always makes a database request in its default behavior, it should be called with caution. Plugins that would like to use site initialization in special ways can leverage a `pre_wp_is_site_initialized` filter to alter that default behavior.
The separate handling of the site's row in the `wp_blogs` database table and the actual site setup allows for more flexibility in controlling whether or how a site's data is set up. For example, a unit test that only checks data from the site's database table row can unhook the site initialization process to improve performance. At the same time, developers consuming the new sites API only need to know about the CRUD functions, since the initialization and uninitialization processes happen internally.
With this changeset, the foundation for a sites REST API endpoint is fully available. The previously recommended functions `wpmu_create_blog()` and `wpmu_delete_blog()` now call the new respective function internally. Further follow-up work to this includes replacing calls to `wpmu_create_blog()` with `wp_insert_site()`, `update_blog_details()` with `wp_update_site()` and `wpmu_delete_blog()` with `wp_delete_blog()` throughout the codebase.
As a side-effect of this work, the `wpmu_new_blog`, `delete_blog`, and `deleted_blog` actions and the `install_blog()` function have been deprecated.
Fixes #41333. See #40364.
Built from https://develop.svn.wordpress.org/trunk@43654
git-svn-id: http://core.svn.wordpress.org/trunk@43483 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-09-24 11:09:26 -04:00
$blog_id = wp_insert_site ( array_merge ( $site_data , $site_initialization_data ) );
Multisite: Complete the new CRUD API for managing sites.
New functions `wp_insert_site( $data )`, `wp_update_site( $id, $data )` and `wp_delete_site( $id )` are introduced to manage site rows in the `wp_blogs` table, forming the new CRUD API together with the existing `get_site()` / `get_sites()`. The new API provides various benefits over the previously existing API, fixing several cache invalidation issues and being hook-driven so that normalization and validation of the passed data can be fully customized.
New hooks introduced as part of this are the actions `wp_insert_site`, `wp_update_site`, `wp_delete_site`, `wp_validate_site_data` and the filter `wp_normalize_site_data`.
At this point, `wp_insert_site()` does not handle setting up the site's database tables, and `wp_delete_site()` does not handle dropping the site's database tables, so the two can not yet be used directly as full replacements of `wpmu_create_blog()` and `wpmu_delete_blog()`. Managing the site's database tables will be added via hooks as part of the follow-up ticket #41333.
The existing functions `wpmu_create_blog()`, `update_blog_details()`, and `wpmu_delete_blog()` make use of the respective new counterpart and will be obsolete once #41333 has been completed.
Props flixos90, jeremyfelt, spacedmonkey.
Fixes #40364.
Built from https://develop.svn.wordpress.org/trunk@43548
git-svn-id: http://core.svn.wordpress.org/trunk@43377 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-08-01 09:06:26 -04:00
if ( is_wp_error ( $blog_id ) ) {
return $blog_id ;
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
2016-06-01 20:59:27 -04:00
wp_cache_set ( 'last_changed' , microtime (), 'sites' );
2010-01-05 23:02:57 -05:00
return $blog_id ;
}
2011-01-04 04:02:38 -05:00
/**
* Notifies the network admin that a new site has been activated .
*
2016-05-23 14:56:27 -04:00
* Filter { @ see 'newblog_notify_siteadmin' } to change the content of
2011-01-04 04:02:38 -05:00
* the notification email .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2019-01-08 03:58:49 -05:00
* @ since 5.1 . 0 $blog_id now supports input from the { @ see 'wp_initialize_site' } action .
2011-01-04 04:02:38 -05:00
*
Multisite: Introduce a site initialization and uninitialization API.
This changeset makes the new CRUD API for sites introduced in [43548] usable for real-world sites. A new function `wp_initialize_site()`, which takes care of creating a site's database tables and populating them with initial values, is hooked into the site insertion process that is initiated when calling `wp_insert_site()`. Similarly, a new function `wp_uninitialize_site()`, which takes care of dropping a site's database tables, is hooked into the site deletion process that is initiated when calling `wp_delete_site()`.
A new function `wp_is_site_initialized()` completes the API, allowing to check whether a site is initialized. Since this function always makes a database request in its default behavior, it should be called with caution. Plugins that would like to use site initialization in special ways can leverage a `pre_wp_is_site_initialized` filter to alter that default behavior.
The separate handling of the site's row in the `wp_blogs` database table and the actual site setup allows for more flexibility in controlling whether or how a site's data is set up. For example, a unit test that only checks data from the site's database table row can unhook the site initialization process to improve performance. At the same time, developers consuming the new sites API only need to know about the CRUD functions, since the initialization and uninitialization processes happen internally.
With this changeset, the foundation for a sites REST API endpoint is fully available. The previously recommended functions `wpmu_create_blog()` and `wpmu_delete_blog()` now call the new respective function internally. Further follow-up work to this includes replacing calls to `wpmu_create_blog()` with `wp_insert_site()`, `update_blog_details()` with `wp_update_site()` and `wpmu_delete_blog()` with `wp_delete_blog()` throughout the codebase.
As a side-effect of this work, the `wpmu_new_blog`, `delete_blog`, and `deleted_blog` actions and the `install_blog()` function have been deprecated.
Fixes #41333. See #40364.
Built from https://develop.svn.wordpress.org/trunk@43654
git-svn-id: http://core.svn.wordpress.org/trunk@43483 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-09-24 11:09:26 -04:00
* @ param WP_Site | int $blog_id The new site ' s object or ID .
* @ param string $deprecated Not used .
2011-01-04 04:02:38 -05:00
* @ return bool
*/
2010-01-05 23:02:57 -05:00
function newblog_notify_siteadmin ( $blog_id , $deprecated = '' ) {
Multisite: Introduce a site initialization and uninitialization API.
This changeset makes the new CRUD API for sites introduced in [43548] usable for real-world sites. A new function `wp_initialize_site()`, which takes care of creating a site's database tables and populating them with initial values, is hooked into the site insertion process that is initiated when calling `wp_insert_site()`. Similarly, a new function `wp_uninitialize_site()`, which takes care of dropping a site's database tables, is hooked into the site deletion process that is initiated when calling `wp_delete_site()`.
A new function `wp_is_site_initialized()` completes the API, allowing to check whether a site is initialized. Since this function always makes a database request in its default behavior, it should be called with caution. Plugins that would like to use site initialization in special ways can leverage a `pre_wp_is_site_initialized` filter to alter that default behavior.
The separate handling of the site's row in the `wp_blogs` database table and the actual site setup allows for more flexibility in controlling whether or how a site's data is set up. For example, a unit test that only checks data from the site's database table row can unhook the site initialization process to improve performance. At the same time, developers consuming the new sites API only need to know about the CRUD functions, since the initialization and uninitialization processes happen internally.
With this changeset, the foundation for a sites REST API endpoint is fully available. The previously recommended functions `wpmu_create_blog()` and `wpmu_delete_blog()` now call the new respective function internally. Further follow-up work to this includes replacing calls to `wpmu_create_blog()` with `wp_insert_site()`, `update_blog_details()` with `wp_update_site()` and `wpmu_delete_blog()` with `wp_delete_blog()` throughout the codebase.
As a side-effect of this work, the `wpmu_new_blog`, `delete_blog`, and `deleted_blog` actions and the `install_blog()` function have been deprecated.
Fixes #41333. See #40364.
Built from https://develop.svn.wordpress.org/trunk@43654
git-svn-id: http://core.svn.wordpress.org/trunk@43483 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-09-24 11:09:26 -04:00
if ( is_object ( $blog_id ) ) {
$blog_id = $blog_id -> blog_id ;
}
2017-11-30 18:11:00 -05:00
if ( get_site_option ( 'registrationnotification' ) != 'yes' ) {
2010-01-05 23:02:57 -05:00
return false ;
2017-11-30 18:11:00 -05:00
}
2010-01-06 23:27:46 -05:00
2015-10-07 13:11:25 -04:00
$email = get_site_option ( 'admin_email' );
2017-11-30 18:11:00 -05:00
if ( is_email ( $email ) == false ) {
2010-01-05 23:02:57 -05:00
return false ;
2017-11-30 18:11:00 -05:00
}
2010-01-06 23:27:46 -05:00
2017-11-30 18:11:00 -05:00
$options_site_url = esc_url ( network_admin_url ( 'settings.php' ) );
2010-01-05 23:02:57 -05:00
switch_to_blog ( $blog_id );
$blogname = get_option ( 'blogname' );
2017-11-30 18:11:00 -05:00
$siteurl = site_url ();
2010-01-05 23:02:57 -05:00
restore_current_blog ();
2010-01-06 23:27:46 -05:00
2017-11-30 18:11:00 -05:00
$msg = sprintf (
2019-09-02 20:41:05 -04:00
/* translators: New site notification email. 1: Site URL, 2: User IP address, 3: URL to Network Settings screen. */
2017-11-30 18:11:00 -05:00
__ (
' New Site : % 1 $s
2012-10-23 07:27:20 -04:00
URL : % 2 $s
2017-10-03 09:13:47 -04:00
Remote IP address : % 3 $s
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
Disable these notifications : % 4 $s '
2018-08-16 21:51:36 -04:00
),
$blogname ,
$siteurl ,
wp_unslash ( $_SERVER [ 'REMOTE_ADDR' ] ),
$options_site_url
2017-11-30 18:11:00 -05:00
);
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters the message body of the new site activation email sent
2013-12-02 15:45:10 -05:00
* to the network administrator .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param string $msg Email body .
*/
2010-01-05 23:02:57 -05:00
$msg = apply_filters ( 'newblog_notify_siteadmin' , $msg );
2010-01-06 23:27:46 -05:00
2019-09-02 20:41:05 -04:00
/* translators: New site notification email subject. %s: New site URL. */
2010-04-29 23:17:49 -04:00
wp_mail ( $email , sprintf ( __ ( 'New Site Registration: %s' ), $siteurl ), $msg );
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
2010-01-05 23:02:57 -05:00
return true ;
}
2011-01-04 04:02:38 -05:00
/**
* Notifies the network admin that a new user has been activated .
*
2016-05-23 14:56:27 -04:00
* Filter { @ see 'newuser_notify_siteadmin' } to change the content of
2011-01-04 04:02:38 -05:00
* the notification email .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
* @ param int $user_id The new user ' s ID .
* @ return bool
*/
2010-01-05 23:02:57 -05:00
function newuser_notify_siteadmin ( $user_id ) {
2017-11-30 18:11:00 -05:00
if ( get_site_option ( 'registrationnotification' ) != 'yes' ) {
2010-01-05 23:02:57 -05:00
return false ;
2017-11-30 18:11:00 -05:00
}
2010-01-06 23:27:46 -05:00
2015-10-07 13:11:25 -04:00
$email = get_site_option ( 'admin_email' );
2010-01-12 13:40:40 -05:00
2017-11-30 18:11:00 -05:00
if ( is_email ( $email ) == false ) {
2010-01-05 23:02:57 -05:00
return false ;
2017-11-30 18:11:00 -05:00
}
2010-01-12 13:40:40 -05:00
2012-08-02 21:06:05 -04:00
$user = get_userdata ( $user_id );
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
$options_site_url = esc_url ( network_admin_url ( 'settings.php' ) );
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
2017-11-30 18:11:00 -05:00
$msg = sprintf (
2019-09-02 20:41:05 -04:00
/* translators: New user notification email. 1: User login, 2: User IP address, 3: URL to Network Settings screen. */
2017-11-30 18:11:00 -05:00
__ (
' New User : % 1 $s
2017-10-03 09:13:47 -04:00
Remote IP address : % 2 $s
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
Disable these notifications : % 3 $s '
2018-08-16 21:51:36 -04:00
),
$user -> user_login ,
wp_unslash ( $_SERVER [ 'REMOTE_ADDR' ] ),
$options_site_url
2017-11-30 18:11:00 -05:00
);
2010-01-06 23:27:46 -05:00
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters the message body of the new user activation email sent
2013-12-02 15:45:10 -05:00
* to the network administrator .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param string $msg Email body .
* @ param WP_User $user WP_User instance of the new user .
*/
2012-03-02 18:52:19 -05:00
$msg = apply_filters ( 'newuser_notify_siteadmin' , $msg , $user );
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
2019-09-02 20:41:05 -04:00
/* translators: New user notification email subject. %s: User login. */
2017-11-30 18:11:00 -05:00
wp_mail ( $email , sprintf ( __ ( 'New User Registration: %s' ), $user -> user_login ), $msg );
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
2010-01-05 23:02:57 -05:00
return true ;
}
2011-01-04 04:02:38 -05:00
/**
2017-09-25 20:12:45 -04:00
* Checks whether a site name is already taken .
*
* The name is the site 's subdomain or the site' s subdirectory
* path depending on the network settings .
2011-01-04 04:02:38 -05:00
*
* Used during the new site registration process to ensure
2017-09-25 20:12:45 -04:00
* that each site name is unique .
2011-01-04 04:02:38 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
2017-08-12 08:48:47 -04:00
* @ param string $domain The domain to be checked .
* @ param string $path The path to be checked .
2017-08-22 07:52:48 -04:00
* @ param int $network_id Optional . Network ID . Relevant only on multi - network installations .
2017-09-25 20:12:45 -04:00
* @ return int | null The site ID if the site name exists , null otherwise .
2011-01-04 04:02:38 -05:00
*/
2017-08-12 08:48:47 -04:00
function domain_exists ( $domain , $path , $network_id = 1 ) {
2017-11-30 18:11:00 -05:00
$path = trailingslashit ( $path );
$args = array (
2019-03-18 11:56:51 -04:00
'network_id' => $network_id ,
'domain' => $domain ,
'path' => $path ,
'fields' => 'ids' ,
'number' => 1 ,
'update_site_meta_cache' => false ,
2016-06-01 22:26:29 -04:00
);
$result = get_sites ( $args );
$result = array_shift ( $result );
2014-03-25 13:32:16 -04:00
2013-12-02 15:45:10 -05:00
/**
2017-09-25 20:12:45 -04:00
* Filters whether a site name is taken .
*
* The name is the site 's subdomain or the site' s subdirectory
* path depending on the network settings .
2013-12-02 15:45:10 -05:00
*
* @ since 3.5 . 0
*
2017-09-25 20:12:45 -04:00
* @ param int | null $result The site ID if the site name exists , null otherwise .
2017-08-12 08:48:47 -04:00
* @ param string $domain Domain to be checked .
* @ param string $path Path to be checked .
2017-08-22 07:52:48 -04:00
* @ param int $network_id Network ID . Relevant only on multi - network installations .
2013-12-02 15:45:10 -05:00
*/
2017-08-12 08:48:47 -04:00
return apply_filters ( 'domain_exists' , $result , $domain , $path , $network_id );
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
2013-11-24 21:05:10 -05:00
* Notify a user that their blog activation has been successful .
2011-01-04 04:02:38 -05:00
*
2016-05-23 14:56:27 -04:00
* Filter { @ see 'wpmu_welcome_notification' } to disable or bypass .
2011-01-04 04:02:38 -05:00
*
2016-05-23 14:56:27 -04:00
* Filter { @ see 'update_welcome_email' } and { @ see 'update_welcome_subject' } to
2011-01-04 04:02:38 -05:00
* modify the content and subject line of the notification email .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
2017-01-12 00:21:41 -05:00
* @ param int $blog_id Blog ID .
* @ param int $user_id User ID .
* @ param string $password User password .
* @ param string $title Site title .
* @ param array $meta Optional . Signup meta data . By default , contains the requested privacy setting and lang_id .
2011-01-04 04:02:38 -05:00
* @ return bool
*/
2013-09-01 23:33:09 -04:00
function wpmu_welcome_notification ( $blog_id , $user_id , $password , $title , $meta = array () ) {
2016-10-19 00:47:30 -04:00
$current_network = get_network ();
2010-01-05 23:02:57 -05:00
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters whether to bypass the welcome email after site activation .
2013-12-02 15:45:10 -05:00
*
* Returning false disables the welcome email .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param int | bool $blog_id Blog ID .
* @ param int $user_id User ID .
* @ param string $password User password .
* @ param string $title Site title .
2017-01-12 00:21:41 -05:00
* @ param array $meta Signup meta data . By default , contains the requested privacy setting and lang_id .
2013-12-02 15:45:10 -05:00
*/
2017-11-30 18:11:00 -05:00
if ( ! apply_filters ( 'wpmu_welcome_notification' , $blog_id , $user_id , $password , $title , $meta ) ) {
2010-01-05 23:02:57 -05:00
return false ;
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
2016-10-26 11:36:31 -04:00
$user = get_userdata ( $user_id );
$switched_locale = switch_to_locale ( get_user_locale ( $user ) );
2015-10-07 13:11:25 -04:00
$welcome_email = get_site_option ( 'welcome_email' );
2015-05-06 05:12:25 -04:00
if ( $welcome_email == false ) {
/* translators: Do not translate USERNAME, SITE_NAME, BLOG_URL, PASSWORD: those are placeholders. */
2017-11-30 18:11:00 -05:00
$welcome_email = __ (
' Howdy USERNAME ,
2010-01-05 23:02:57 -05:00
2010-05-01 03:09:38 -04:00
Your new SITE_NAME site has been successfully set up at :
2010-01-05 23:02:57 -05:00
BLOG_URL
You can log in to the administrator account with the following information :
2014-10-01 21:28:16 -04:00
2010-01-05 23:02:57 -05:00
Username : USERNAME
Password : PASSWORD
2014-12-04 20:15:26 -05:00
Log in here : BLOG_URLwp - login . php
2010-01-05 23:02:57 -05:00
2011-06-12 04:00:22 -04:00
We hope you enjoy your new site . Thanks !
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
-- The Team @ SITE_NAME '
);
2015-05-06 05:12:25 -04:00
}
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
$url = get_blogaddress_by_id ( $blog_id );
2010-01-05 23:02:57 -05:00
2016-10-19 00:47:30 -04:00
$welcome_email = str_replace ( 'SITE_NAME' , $current_network -> site_name , $welcome_email );
2010-04-24 13:49:08 -04:00
$welcome_email = str_replace ( 'BLOG_TITLE' , $title , $welcome_email );
$welcome_email = str_replace ( 'BLOG_URL' , $url , $welcome_email );
$welcome_email = str_replace ( 'USERNAME' , $user -> user_login , $welcome_email );
$welcome_email = str_replace ( 'PASSWORD' , $password , $welcome_email );
2010-01-05 23:02:57 -05:00
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters the content of the welcome email after site activation .
2013-12-02 15:45:10 -05:00
*
* Content should be formatted for transmission via wp_mail () .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ 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 .
2017-01-12 00:21:41 -05:00
* @ param array $meta Signup meta data . By default , contains the requested privacy setting and lang_id .
2013-12-02 15:45:10 -05:00
*/
$welcome_email = apply_filters ( 'update_welcome_email' , $welcome_email , $blog_id , $user_id , $password , $title , $meta );
2017-11-30 18:11:00 -05:00
$admin_email = get_site_option ( 'admin_email' );
2010-01-12 13:40:40 -05:00
2017-11-30 18:11:00 -05:00
if ( $admin_email == '' ) {
2010-01-05 23:02:57 -05:00
$admin_email = 'support@' . $_SERVER [ 'SERVER_NAME' ];
2017-11-30 18:11:00 -05:00
}
2010-01-12 13:40:40 -05:00
2017-11-30 18:11:00 -05:00
$from_name = get_site_option ( 'site_name' ) == '' ? 'WordPress' : esc_html ( get_site_option ( 'site_name' ) );
$message_headers = " From: \" { $from_name } \" < { $admin_email } > \n " . 'Content-Type: text/plain; charset="' . get_option ( 'blog_charset' ) . " \" \n " ;
$message = $welcome_email ;
2010-01-12 13:40:40 -05:00
2017-11-30 18:11:00 -05:00
if ( empty ( $current_network -> site_name ) ) {
2016-10-19 00:47:30 -04:00
$current_network -> site_name = 'WordPress' ;
2017-11-30 18:11:00 -05:00
}
2010-01-12 13:40:40 -05:00
2019-09-02 20:41:05 -04:00
/* translators: New site notification email subject. 1: Network title, 2: New site title. */
2016-11-20 20:22:32 -05:00
$subject = __ ( 'New %1$s Site: %2$s' );
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters the subject of the welcome email after site activation .
2013-12-02 15:45:10 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param string $subject Subject of the email .
*/
2016-11-20 20:22:32 -05:00
$subject = apply_filters ( 'update_welcome_subject' , sprintf ( $subject , $current_network -> site_name , wp_unslash ( $title ) ) );
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
2014-03-27 22:44:15 -04:00
wp_mail ( $user -> user_email , wp_specialchars_decode ( $subject ), $message , $message_headers );
2016-10-26 11:36:31 -04:00
if ( $switched_locale ) {
restore_previous_locale ();
}
2010-01-05 23:02:57 -05:00
return true ;
}
2011-01-04 04:02:38 -05:00
/**
2013-11-24 21:05:10 -05:00
* Notify a user that their account activation has been successful .
2011-01-04 04:02:38 -05:00
*
2016-05-23 14:56:27 -04:00
* Filter { @ see 'wpmu_welcome_user_notification' } to disable or bypass .
2011-01-04 04:02:38 -05:00
*
2016-05-23 14:56:27 -04:00
* Filter { @ see 'update_welcome_user_email' } and { @ see 'update_welcome_user_subject' } to
2011-01-04 04:02:38 -05:00
* modify the content and subject line of the notification email .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
2017-01-12 00:21:41 -05:00
* @ param int $user_id User ID .
* @ param string $password User password .
* @ param array $meta Optional . Signup meta data . Default empty array .
2011-01-04 04:02:38 -05:00
* @ return bool
*/
2013-09-01 23:33:09 -04:00
function wpmu_welcome_user_notification ( $user_id , $password , $meta = array () ) {
2016-10-19 00:47:30 -04:00
$current_network = get_network ();
2010-01-05 23:02:57 -05:00
2013-12-02 15:45:10 -05:00
/**
2017-11-30 18:11:00 -05:00
* Filters whether to bypass the welcome email after user activation .
2013-12-02 15:45:10 -05:00
*
* Returning false disables the welcome email .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param int $user_id User ID .
* @ param string $password User password .
2017-01-12 00:21:41 -05:00
* @ param array $meta Signup meta data . Default empty array .
2013-12-02 15:45:10 -05:00
*/
2017-11-30 18:11:00 -05:00
if ( ! apply_filters ( 'wpmu_welcome_user_notification' , $user_id , $password , $meta ) ) {
2010-01-05 23:02:57 -05:00
return false ;
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
2015-10-07 13:11:25 -04:00
$welcome_email = get_site_option ( 'welcome_user_email' );
2010-01-05 23:02:57 -05:00
2012-08-02 21:06:05 -04:00
$user = get_userdata ( $user_id );
2010-01-05 23:02:57 -05:00
2016-10-26 11:36:31 -04:00
$switched_locale = switch_to_locale ( get_user_locale ( $user ) );
2013-12-02 15:45:10 -05:00
/**
2016-03-03 04:12:27 -05:00
* Filters the content of the welcome email after user activation .
2013-12-02 15:45:10 -05:00
*
* Content should be formatted for transmission via wp_mail () .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
2016-03-03 04:12:27 -05:00
* @ param string $welcome_email The message body of the account activation success email .
2013-12-02 15:45:10 -05:00
* @ param int $user_id User ID .
* @ param string $password User password .
2017-01-12 00:21:41 -05:00
* @ param array $meta Signup meta data . Default empty array .
2013-12-02 15:45:10 -05:00
*/
$welcome_email = apply_filters ( 'update_welcome_user_email' , $welcome_email , $user_id , $password , $meta );
2016-10-19 00:47:30 -04:00
$welcome_email = str_replace ( 'SITE_NAME' , $current_network -> site_name , $welcome_email );
2010-04-24 13:49:08 -04:00
$welcome_email = str_replace ( 'USERNAME' , $user -> user_login , $welcome_email );
$welcome_email = str_replace ( 'PASSWORD' , $password , $welcome_email );
$welcome_email = str_replace ( 'LOGINLINK' , wp_login_url (), $welcome_email );
2010-01-05 23:02:57 -05:00
2015-10-07 13:11:25 -04:00
$admin_email = get_site_option ( 'admin_email' );
2010-01-12 13:40:40 -05:00
2017-11-30 18:11:00 -05:00
if ( $admin_email == '' ) {
2010-01-05 23:02:57 -05:00
$admin_email = 'support@' . $_SERVER [ 'SERVER_NAME' ];
2017-11-30 18:11:00 -05:00
}
2010-01-12 13:40:40 -05:00
2017-11-30 18:11:00 -05:00
$from_name = get_site_option ( 'site_name' ) == '' ? 'WordPress' : esc_html ( get_site_option ( 'site_name' ) );
$message_headers = " From: \" { $from_name } \" < { $admin_email } > \n " . 'Content-Type: text/plain; charset="' . get_option ( 'blog_charset' ) . " \" \n " ;
$message = $welcome_email ;
2010-01-12 13:40:40 -05:00
2017-11-30 18:11:00 -05:00
if ( empty ( $current_network -> site_name ) ) {
2016-10-19 00:47:30 -04:00
$current_network -> site_name = 'WordPress' ;
2017-11-30 18:11:00 -05:00
}
2010-01-12 13:40:40 -05:00
2019-09-02 20:41:05 -04:00
/* translators: New user notification email subject. 1: Network title, 2: New user login. */
2016-11-20 20:22:32 -05:00
$subject = __ ( 'New %1$s User: %2$s' );
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters the subject of the welcome email after user activation .
2013-12-02 15:45:10 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-12-02 15:45:10 -05:00
*
* @ param string $subject Subject of the email .
*/
2017-11-30 18:11:00 -05:00
$subject = apply_filters ( 'update_welcome_user_subject' , sprintf ( $subject , $current_network -> site_name , $user -> user_login ) );
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
2014-03-27 22:44:15 -04:00
wp_mail ( $user -> user_email , wp_specialchars_decode ( $subject ), $message , $message_headers );
2016-10-26 11:36:31 -04:00
if ( $switched_locale ) {
restore_previous_locale ();
}
2010-01-05 23:02:57 -05:00
return true ;
}
2016-09-20 17:39:29 -04:00
/**
* Get the current network .
*
* Returns an object containing the 'id' , 'domain' , 'path' , and 'site_name'
* properties of the network being viewed .
*
* @ see wpmu_current_site ()
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2016-09-20 17:39:29 -04:00
*
* @ global WP_Network $current_site
*
* @ return WP_Network
*/
function get_current_site () {
global $current_site ;
return $current_site ;
}
2011-01-04 04:02:38 -05:00
/**
* Get a user ' s most recent post .
*
* Walks through each of a user ' s blogs to find the post with
* the most recent post_date_gmt .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 17:51:31 -04:00
*
2011-01-04 04:02:38 -05:00
* @ param int $user_id
* @ return array Contains the blog_id , post_id , post_date_gmt , and post_gmt_ts
*/
2010-01-05 23:02:57 -05:00
function get_most_recent_post_of_user ( $user_id ) {
global $wpdb ;
2017-11-30 18:11:00 -05:00
$user_blogs = get_blogs_of_user ( ( int ) $user_id );
2010-01-05 23:02:57 -05:00
$most_recent_post = array ();
// Walk through each blog and get the most recent post
// published by $user_id
foreach ( ( array ) $user_blogs as $blog ) {
2017-11-30 18:11:00 -05:00
$prefix = $wpdb -> get_blog_prefix ( $blog -> userblog_id );
$recent_post = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT ID, post_date_gmt FROM { $prefix } posts WHERE post_author = %d AND post_type = 'post' AND post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1 " , $user_id ), ARRAY_A );
2010-01-05 23:02:57 -05:00
// Make sure we found a post
2017-11-30 18:11:00 -05:00
if ( isset ( $recent_post [ 'ID' ] ) ) {
$post_gmt_ts = strtotime ( $recent_post [ 'post_date_gmt' ] );
2010-01-05 23:02:57 -05:00
// If this is the first post checked or if this post is
// newer than the current recent post, make it the new
// most recent post.
2017-11-30 18:11:00 -05:00
if ( ! isset ( $most_recent_post [ 'post_gmt_ts' ] ) || ( $post_gmt_ts > $most_recent_post [ 'post_gmt_ts' ] ) ) {
2010-01-05 23:02:57 -05:00
$most_recent_post = array (
2017-11-30 18:11:00 -05:00
'blog_id' => $blog -> userblog_id ,
'post_id' => $recent_post [ 'ID' ],
'post_date_gmt' => $recent_post [ 'post_date_gmt' ],
'post_gmt_ts' => $post_gmt_ts ,
2010-01-05 23:02:57 -05:00
);
}
}
}
return $most_recent_post ;
}
2011-01-04 04:02:38 -05:00
// Misc functions
/**
* Check an array of MIME types against a whitelist .
*
2011-01-05 23:11:14 -05:00
* WordPress ships with a set of allowed upload filetypes ,
2011-01-04 04:02:38 -05:00
* which is defined in wp - includes / functions . php in
* get_allowed_mime_types () . This function is used to filter
2011-01-05 23:11:14 -05:00
* that list against the filetype whitelist provided by Multisite
* Super Admins at wp - admin / network / settings . php .
2011-01-04 04:02:38 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
* @ param array $mimes
* @ return array
*/
2010-01-12 13:40:40 -05:00
function check_upload_mimes ( $mimes ) {
2017-11-30 18:11:00 -05:00
$site_exts = explode ( ' ' , get_site_option ( 'upload_filetypes' , 'jpg jpeg png gif' ) );
2014-09-07 06:11:17 -04:00
$site_mimes = array ();
2010-01-05 23:02:57 -05:00
foreach ( $site_exts as $ext ) {
2010-04-23 15:00:30 -04:00
foreach ( $mimes as $ext_pattern => $mime ) {
2017-11-30 18:11:00 -05:00
if ( $ext != '' && strpos ( $ext_pattern , $ext ) !== false ) {
$site_mimes [ $ext_pattern ] = $mime ;
}
2010-01-05 23:02:57 -05:00
}
}
return $site_mimes ;
}
2011-01-04 04:02:38 -05:00
/**
* Update a blog ' s post count .
*
* WordPress MS stores a blog ' s post count as an option so as
* to avoid extraneous COUNTs when a blog ' s details are fetched
2016-10-25 23:39:29 -04:00
* with get_site () . This function is called when posts are published
* or unpublished to make sure the count stays current .
2011-01-04 04:02:38 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2015-05-26 17:51:31 -04:00
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2016-01-08 20:45:26 -05:00
*
* @ param string $deprecated Not used .
2011-01-04 04:02:38 -05:00
*/
2010-01-05 23:02:57 -05:00
function update_posts_count ( $deprecated = '' ) {
global $wpdb ;
2010-04-24 13:49:08 -04:00
update_option ( 'post_count' , ( int ) $wpdb -> get_var ( " SELECT COUNT(ID) FROM { $wpdb -> posts } WHERE post_status = 'publish' and post_type = 'post' " ) );
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
2017-06-26 14:05:41 -04:00
* Logs the user email , IP , and registration date of a new site .
2011-01-04 04:02:38 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2019-01-08 03:58:49 -05:00
* @ since 5.1 . 0 Parameters now support input from the { @ see 'wp_initialize_site' } action .
2011-01-04 04:02:38 -05:00
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 17:51:31 -04:00
*
Multisite: Introduce a site initialization and uninitialization API.
This changeset makes the new CRUD API for sites introduced in [43548] usable for real-world sites. A new function `wp_initialize_site()`, which takes care of creating a site's database tables and populating them with initial values, is hooked into the site insertion process that is initiated when calling `wp_insert_site()`. Similarly, a new function `wp_uninitialize_site()`, which takes care of dropping a site's database tables, is hooked into the site deletion process that is initiated when calling `wp_delete_site()`.
A new function `wp_is_site_initialized()` completes the API, allowing to check whether a site is initialized. Since this function always makes a database request in its default behavior, it should be called with caution. Plugins that would like to use site initialization in special ways can leverage a `pre_wp_is_site_initialized` filter to alter that default behavior.
The separate handling of the site's row in the `wp_blogs` database table and the actual site setup allows for more flexibility in controlling whether or how a site's data is set up. For example, a unit test that only checks data from the site's database table row can unhook the site initialization process to improve performance. At the same time, developers consuming the new sites API only need to know about the CRUD functions, since the initialization and uninitialization processes happen internally.
With this changeset, the foundation for a sites REST API endpoint is fully available. The previously recommended functions `wpmu_create_blog()` and `wpmu_delete_blog()` now call the new respective function internally. Further follow-up work to this includes replacing calls to `wpmu_create_blog()` with `wp_insert_site()`, `update_blog_details()` with `wp_update_site()` and `wpmu_delete_blog()` with `wp_delete_blog()` throughout the codebase.
As a side-effect of this work, the `wpmu_new_blog`, `delete_blog`, and `deleted_blog` actions and the `install_blog()` function have been deprecated.
Fixes #41333. See #40364.
Built from https://develop.svn.wordpress.org/trunk@43654
git-svn-id: http://core.svn.wordpress.org/trunk@43483 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-09-24 11:09:26 -04:00
* @ param WP_Site | int $blog_id The new site ' s object or ID .
* @ param int | array $user_id User ID , or array of arguments including 'user_id' .
2011-01-04 04:02:38 -05:00
*/
2010-01-05 23:02:57 -05:00
function wpmu_log_new_registrations ( $blog_id , $user_id ) {
global $wpdb ;
Multisite: Introduce a site initialization and uninitialization API.
This changeset makes the new CRUD API for sites introduced in [43548] usable for real-world sites. A new function `wp_initialize_site()`, which takes care of creating a site's database tables and populating them with initial values, is hooked into the site insertion process that is initiated when calling `wp_insert_site()`. Similarly, a new function `wp_uninitialize_site()`, which takes care of dropping a site's database tables, is hooked into the site deletion process that is initiated when calling `wp_delete_site()`.
A new function `wp_is_site_initialized()` completes the API, allowing to check whether a site is initialized. Since this function always makes a database request in its default behavior, it should be called with caution. Plugins that would like to use site initialization in special ways can leverage a `pre_wp_is_site_initialized` filter to alter that default behavior.
The separate handling of the site's row in the `wp_blogs` database table and the actual site setup allows for more flexibility in controlling whether or how a site's data is set up. For example, a unit test that only checks data from the site's database table row can unhook the site initialization process to improve performance. At the same time, developers consuming the new sites API only need to know about the CRUD functions, since the initialization and uninitialization processes happen internally.
With this changeset, the foundation for a sites REST API endpoint is fully available. The previously recommended functions `wpmu_create_blog()` and `wpmu_delete_blog()` now call the new respective function internally. Further follow-up work to this includes replacing calls to `wpmu_create_blog()` with `wp_insert_site()`, `update_blog_details()` with `wp_update_site()` and `wpmu_delete_blog()` with `wp_delete_blog()` throughout the codebase.
As a side-effect of this work, the `wpmu_new_blog`, `delete_blog`, and `deleted_blog` actions and the `install_blog()` function have been deprecated.
Fixes #41333. See #40364.
Built from https://develop.svn.wordpress.org/trunk@43654
git-svn-id: http://core.svn.wordpress.org/trunk@43483 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-09-24 11:09:26 -04:00
if ( is_object ( $blog_id ) ) {
$blog_id = $blog_id -> blog_id ;
}
if ( is_array ( $user_id ) ) {
$user_id = ! empty ( $user_id [ 'user_id' ] ) ? $user_id [ 'user_id' ] : 0 ;
}
2012-08-02 21:06:05 -04:00
$user = get_userdata ( ( int ) $user_id );
2017-11-30 18:11:00 -05:00
if ( $user ) {
$wpdb -> insert (
2018-08-16 21:51:36 -04:00
$wpdb -> registration_log ,
array (
2017-11-30 18:11:00 -05:00
'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-05 23:02:57 -05:00
}
2010-02-02 17:58:06 -05:00
/**
* Maintains a canonical list of terms by syncing terms created for each blog with the global terms table .
*
* @ since 3.0 . 0
*
* @ see term_id_filter
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-05-26 17:51:31 -04:00
* @ staticvar int $global_terms_recurse
*
2016-01-08 20:45:26 -05:00
* @ param int $term_id An ID for a term on the current blog .
* @ param string $deprecated Not used .
2010-02-02 17:58:06 -05:00
* @ return int An ID from the global terms table mapped from $term_id .
*/
2010-01-05 23:02:57 -05:00
function global_terms ( $term_id , $deprecated = '' ) {
2010-05-24 20:13:03 -04:00
global $wpdb ;
2010-05-24 20:31:07 -04:00
static $global_terms_recurse = null ;
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
if ( ! global_terms_enabled () ) {
2010-03-16 13:17:55 -04:00
return $term_id ;
2017-11-30 18:11:00 -05:00
}
2010-03-16 13:17:55 -04:00
2010-04-01 21:26:44 -04:00
// prevent a race condition
2010-05-24 20:13:03 -04:00
$recurse_start = false ;
2010-05-24 20:31:07 -04:00
if ( $global_terms_recurse === null ) {
2017-11-30 18:11:00 -05:00
$recurse_start = true ;
2010-04-01 21:26:44 -04:00
$global_terms_recurse = 1 ;
} elseif ( 10 < $global_terms_recurse ++ ) {
return $term_id ;
}
2010-01-05 23:02:57 -05:00
$term_id = intval ( $term_id );
2017-11-30 18:11:00 -05:00
$c = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->terms WHERE term_id = %d " , $term_id ) );
2010-01-05 23:02:57 -05:00
$global_id = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT cat_ID FROM $wpdb->sitecategories WHERE category_nicename = %s " , $c -> slug ) );
if ( $global_id == null ) {
2010-04-01 21:26:44 -04:00
$used_global_id = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT cat_ID FROM $wpdb->sitecategories WHERE cat_ID = %d " , $c -> term_id ) );
if ( null == $used_global_id ) {
2017-11-30 18:11:00 -05:00
$wpdb -> insert (
2018-08-16 21:51:36 -04:00
$wpdb -> sitecategories ,
array (
2017-11-30 18:11:00 -05:00
'cat_ID' => $term_id ,
'cat_name' => $c -> name ,
'category_nicename' => $c -> slug ,
)
);
2010-04-01 21:26:44 -04:00
$global_id = $wpdb -> insert_id ;
2017-11-30 18:11:00 -05:00
if ( empty ( $global_id ) ) {
2010-05-28 16:03:29 -04:00
return $term_id ;
2017-11-30 18:11:00 -05:00
}
2010-04-01 21:26:44 -04:00
} else {
$max_global_id = $wpdb -> get_var ( " SELECT MAX(cat_ID) FROM $wpdb->sitecategories " );
2017-11-30 18:11:00 -05:00
$max_local_id = $wpdb -> get_var ( " SELECT MAX(term_id) FROM $wpdb->terms " );
2010-05-25 03:24:10 -04:00
$new_global_id = max ( $max_global_id , $max_local_id ) + mt_rand ( 100 , 400 );
2017-11-30 18:11:00 -05:00
$wpdb -> insert (
2018-08-16 21:51:36 -04:00
$wpdb -> sitecategories ,
array (
2017-11-30 18:11:00 -05:00
'cat_ID' => $new_global_id ,
'cat_name' => $c -> name ,
'category_nicename' => $c -> slug ,
)
);
2010-04-01 21:26:44 -04:00
$global_id = $wpdb -> insert_id ;
}
} elseif ( $global_id != $term_id ) {
2015-04-07 00:14:26 -04:00
$local_id = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT term_id FROM $wpdb->terms WHERE term_id = %d " , $global_id ) );
2015-01-16 16:19:22 -05:00
if ( null != $local_id ) {
global_terms ( $local_id );
if ( 10 < $global_terms_recurse ) {
2010-04-01 21:26:44 -04:00
$global_id = $term_id ;
2015-01-16 16:19:22 -05:00
}
}
2010-01-05 23:02:57 -05:00
}
2010-04-01 21:26:44 -04:00
if ( $global_id != $term_id ) {
2017-11-30 18:11:00 -05:00
if ( get_option ( 'default_category' ) == $term_id ) {
2010-04-01 21:26:44 -04:00
update_option ( 'default_category' , $global_id );
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
$wpdb -> update ( $wpdb -> terms , array ( 'term_id' => $global_id ), array ( 'term_id' => $term_id ) );
$wpdb -> update ( $wpdb -> term_taxonomy , array ( 'term_id' => $global_id ), array ( 'term_id' => $term_id ) );
$wpdb -> update ( $wpdb -> term_taxonomy , array ( 'parent' => $global_id ), array ( 'parent' => $term_id ) );
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
clean_term_cache ( $term_id );
2010-04-01 21:26:44 -04:00
}
2017-11-30 18:11:00 -05:00
if ( $recurse_start ) {
2010-05-24 20:31:07 -04:00
$global_terms_recurse = null ;
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
2010-01-06 23:27:46 -05:00
return $global_id ;
}
2010-01-05 23:02:57 -05:00
2011-01-04 04:02:38 -05:00
/**
* Ensure that the current site ' s domain is listed in the allowed redirect host list .
*
* @ see wp_validate_redirect ()
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
2016-01-08 20:45:26 -05:00
* @ param array | string $deprecated Not used .
2019-11-05 16:23:02 -05:00
* @ return string [] {
* An array containing the current site ' s domain .
*
* @ type string $ 0 The current site ' s domain .
* }
2011-01-04 04:02:38 -05:00
*/
2010-01-05 23:02:57 -05:00
function redirect_this_site ( $deprecated = '' ) {
2016-10-19 00:47:30 -04:00
return array ( get_network () -> domain );
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Check whether an upload is too big .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
2015-10-01 18:24:24 -04:00
* @ blessed
*
2011-01-04 04:02:38 -05:00
* @ param array $upload
2015-05-26 17:51:31 -04:00
* @ return string | array If the upload is under the size limit , $upload is returned . Otherwise returns an error message .
2011-01-04 04:02:38 -05:00
*/
2010-01-05 23:02:57 -05:00
function upload_is_file_too_big ( $upload ) {
2017-11-30 18:11:00 -05:00
if ( ! is_array ( $upload ) || defined ( 'WP_IMPORTING' ) || get_site_option ( 'upload_space_check_disabled' ) ) {
2010-01-05 23:02:57 -05:00
return $upload ;
2017-11-30 18:11:00 -05:00
}
2010-01-12 13:40:40 -05:00
2017-11-30 18:11:00 -05:00
if ( strlen ( $upload [ 'bits' ] ) > ( KB_IN_BYTES * get_site_option ( 'fileupload_maxk' , 1500 ) ) ) {
2019-09-02 20:41:05 -04:00
/* translators: %s: Maximum allowed file size in kilobytes. */
2018-03-11 12:44:34 -04:00
return sprintf ( __ ( 'This file is too big. Files must be less than %s KB in size.' ) . '<br />' , get_site_option ( 'fileupload_maxk' , 1500 ) );
2015-10-21 10:03:25 -04:00
}
2010-01-05 23:02:57 -05:00
return $upload ;
}
2011-01-04 04:02:38 -05:00
/**
* Add a nonce field to the signup page .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*/
2010-01-05 23:02:57 -05:00
function signup_nonce_fields () {
$id = mt_rand ();
echo " <input type='hidden' name='signup_form_id' value=' { $id } ' /> " ;
2017-11-30 18:11:00 -05:00
wp_nonce_field ( 'signup_form_' . $id , '_signup_form' , false );
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Process the signup nonce created in signup_nonce_fields () .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
* @ param array $result
* @ return array
*/
2010-01-05 23:02:57 -05:00
function signup_nonce_check ( $result ) {
2017-11-30 18:11:00 -05:00
if ( ! strpos ( $_SERVER [ 'PHP_SELF' ], 'wp-signup.php' ) ) {
2010-01-05 23:02:57 -05:00
return $result ;
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
2018-04-13 11:30:20 -04:00
if ( ! wp_verify_nonce ( $_POST [ '_signup_form' ], 'signup_form_' . $_POST [ 'signup_form_id' ] ) ) {
$result [ 'errors' ] -> add ( 'invalid_nonce' , __ ( 'Unable to submit this form, please try again.' ) );
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
return $result ;
}
2011-01-04 04:02:38 -05:00
/**
* Correct 404 redirects when NOBLOGREDIRECT is defined .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*/
2010-01-05 23:02:57 -05:00
function maybe_redirect_404 () {
2019-07-02 19:42:58 -04:00
if ( is_main_site () && is_404 () && defined ( 'NOBLOGREDIRECT' ) ) {
/**
* Filters the redirect URL for 404 s on the main site .
*
* The filter is only evaluated if the NOBLOGREDIRECT constant is defined .
*
* @ since 3.0 . 0
*
* @ param string $no_blog_redirect The redirect URL defined in NOBLOGREDIRECT .
*/
$destination = apply_filters ( 'blog_redirect_404' , NOBLOGREDIRECT );
if ( $destination ) {
if ( $destination == '%siteurl%' ) {
$destination = network_home_url ();
}
wp_redirect ( $destination );
exit ();
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
}
}
2011-01-04 04:02:38 -05:00
/**
2017-09-21 08:28:44 -04:00
* Add a new user to a blog by visiting / newbloguser / { key } /.
2011-01-04 04:02:38 -05:00
*
* This will only work when the user ' s details are saved as an option
2017-09-21 08:28:44 -04:00
* keyed as 'new_user_{key}' , where '{key}' is a hash generated for the user to be
2011-01-04 04:02:38 -05:00
* added , as when a user is invited through the regular WP Add User interface .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function maybe_add_existing_user_to_blog () {
2017-11-30 18:11:00 -05:00
if ( false === strpos ( $_SERVER [ 'REQUEST_URI' ], '/newbloguser/' ) ) {
2015-05-26 17:51:31 -04:00
return ;
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
$parts = explode ( '/' , $_SERVER [ 'REQUEST_URI' ] );
$key = array_pop ( $parts );
2010-01-12 13:40:40 -05:00
2017-11-30 18:11:00 -05:00
if ( $key == '' ) {
2010-01-05 23:02:57 -05:00
$key = array_pop ( $parts );
2017-11-30 18:11:00 -05:00
}
2010-01-12 13:40:40 -05:00
2010-04-24 13:49:08 -04:00
$details = get_option ( 'new_user_' . $key );
2017-11-30 18:11:00 -05:00
if ( ! empty ( $details ) ) {
2010-04-24 14:39:22 -04:00
delete_option ( 'new_user_' . $key );
2017-11-30 18:11:00 -05:00
}
2010-04-24 14:39:22 -04:00
2017-11-30 18:11:00 -05:00
if ( empty ( $details ) || is_wp_error ( add_existing_user_to_blog ( $details ) ) ) {
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
wp_die (
sprintf (
2019-09-02 20:41:05 -04:00
/* translators: %s: Home URL. */
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
__ ( 'An error occurred adding you to this site. Back to the <a href="%s">homepage</a>.' ),
home_url ()
)
);
2017-11-30 18:11:00 -05:00
}
2010-05-03 16:26:11 -04:00
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
wp_die (
sprintf (
2019-09-02 20:41:05 -04:00
/* translators: 1: Home URL, 2: Admin URL. */
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
__ ( 'You have been added to this site. Please visit the <a href="%1$s">homepage</a> or <a href="%2$s">log in</a> using your username and password.' ),
home_url (),
admin_url ()
),
__ ( 'WordPress › Success' ),
array ( 'response' => 200 )
);
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Add a user to a blog based on details from maybe_add_existing_user_to_blog () .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-05 23:11:14 -05:00
*
2011-01-04 04:02:38 -05:00
* @ param array $details
2015-05-26 17:51:31 -04:00
* @ return true | WP_Error | void
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function add_existing_user_to_blog ( $details = false ) {
if ( is_array ( $details ) ) {
2016-08-31 00:55:54 -04:00
$blog_id = get_current_blog_id ();
2017-11-30 18:11:00 -05:00
$result = add_user_to_blog ( $blog_id , $details [ 'user_id' ], $details [ 'role' ] );
2017-08-03 17:41:45 -04:00
2017-08-30 15:53:45 -04:00
/**
* Fires immediately after an existing user is added to a site .
*
* @ since MU ( 3.0 . 0 )
*
* @ param int $user_id User ID .
* @ param mixed $result True on success or a WP_Error object if the user doesn ' t exist
* or could not be added .
*/
do_action ( 'added_existing_user' , $details [ 'user_id' ], $result );
2017-08-03 17:41:45 -04:00
2015-05-26 17:51:31 -04:00
return $result ;
2010-01-05 23:02:57 -05:00
}
}
2011-01-04 04:02:38 -05:00
/**
2016-05-23 14:56:27 -04:00
* Adds a newly created user to the appropriate blog
2011-01-04 04:02:38 -05:00
*
2013-02-28 15:28:36 -05:00
* To add a user in general , use add_user_to_blog () . This function
2016-05-23 14:56:27 -04:00
* is specifically hooked into the { @ see 'wpmu_activate_user' } action .
2013-02-28 15:28:36 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2013-02-28 15:28:36 -05:00
* @ see add_user_to_blog ()
2011-01-05 23:11:14 -05:00
*
2015-05-26 17:51:31 -04:00
* @ param int $user_id
2013-02-28 15:28:36 -05:00
* @ param mixed $password Ignored .
2011-01-04 04:02:38 -05:00
* @ param array $meta
2011-01-05 23:11:14 -05:00
*/
2013-02-28 15:28:36 -05:00
function add_new_user_to_blog ( $user_id , $password , $meta ) {
2017-11-30 18:11:00 -05:00
if ( ! empty ( $meta [ 'add_to_blog' ] ) ) {
$blog_id = $meta [ 'add_to_blog' ];
$role = $meta [ 'new_role' ];
2017-08-03 17:41:45 -04:00
remove_user_from_blog ( $user_id , get_network () -> site_id ); // remove user from main blog.
$result = add_user_to_blog ( $blog_id , $user_id , $role );
if ( ! is_wp_error ( $result ) ) {
update_user_meta ( $user_id , 'primary_blog' , $blog_id );
}
2010-01-05 23:02:57 -05:00
}
}
2011-01-04 04:02:38 -05:00
/**
* Correct From host on outgoing mail to match the site domain
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2016-01-08 20:45:26 -05:00
*
2017-10-02 18:14:46 -04:00
* @ param PHPMailer $phpmailer The PHPMailer instance ( passed by reference ) .
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function fix_phpmailer_messageid ( $phpmailer ) {
2016-10-19 00:47:30 -04:00
$phpmailer -> Hostname = get_network () -> domain ;
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
2013-02-15 22:02:15 -05:00
* Check to see whether a user is marked as a spammer , based on user login .
2011-01-04 04:02:38 -05:00
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
2013-07-28 23:23:51 -04:00
* @ param string | WP_User $user Optional . Defaults to current user . WP_User object ,
2017-11-30 18:11:00 -05:00
* or user login name as a string .
2011-01-04 04:02:38 -05:00
* @ return bool
2011-01-05 23:11:14 -05:00
*/
2013-07-28 23:23:51 -04:00
function is_user_spammy ( $user = null ) {
2017-11-30 18:11:00 -05:00
if ( ! ( $user instanceof WP_User ) ) {
2015-01-15 20:06:24 -05:00
if ( $user ) {
2013-07-28 23:23:51 -04:00
$user = get_user_by ( 'login' , $user );
2015-01-15 20:06:24 -05:00
} else {
2013-07-28 23:23:51 -04:00
$user = wp_get_current_user ();
2015-01-15 20:06:24 -05:00
}
2013-07-28 23:23:51 -04:00
}
2010-01-12 13:40:40 -05:00
2013-02-15 22:02:15 -05:00
return $user && isset ( $user -> spam ) && 1 == $user -> spam ;
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Update this blog 's ' public ' setting in the global blogs table .
*
* Public blogs have a setting of 1 , private blogs are 0.
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
* @ param int $old_value
2015-05-26 17:51:31 -04:00
* @ param int $value The new public value
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function update_blog_public ( $old_value , $value ) {
2013-03-25 05:29:58 -04:00
update_blog_status ( get_current_blog_id (), 'public' , ( int ) $value );
2010-01-05 23:02:57 -05:00
}
2010-02-04 15:00:18 -05:00
2011-01-04 04:02:38 -05:00
/**
* Check whether users can self - register , based on Network settings .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
* @ return bool
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function users_can_register_signup_filter () {
2017-11-30 18:11:00 -05:00
$registration = get_site_option ( 'registration' );
2015-05-26 17:51:31 -04:00
return ( $registration == 'all' || $registration == 'user' );
2010-01-05 23:02:57 -05:00
}
2011-01-04 04:02:38 -05:00
/**
* Ensure that the welcome message is not empty . Currently unused .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2011-01-04 04:02:38 -05:00
*
* @ param string $text
* @ return string
2011-01-05 23:11:14 -05:00
*/
2010-01-05 23:02:57 -05:00
function welcome_user_msg_filter ( $text ) {
2017-11-30 18:11:00 -05:00
if ( ! $text ) {
2012-05-02 16:31:37 -04:00
remove_filter ( 'site_option_welcome_user_email' , 'welcome_user_msg_filter' );
2015-05-06 05:12:25 -04:00
/* translators: Do not translate USERNAME, PASSWORD, LOGINLINK, SITE_NAME: those are placeholders. */
2017-11-30 18:11:00 -05:00
$text = __ (
' Howdy USERNAME ,
2010-01-05 23:02:57 -05:00
Your new account is set up .
You can log in with the following information :
Username : USERNAME
Password : PASSWORD
LOGINLINK
Thanks !
2017-11-30 18:11:00 -05:00
-- The Team @ SITE_NAME '
);
2015-10-07 13:11:25 -04:00
update_site_option ( 'welcome_user_email' , $text );
2010-01-05 23:02:57 -05:00
}
return $text ;
}
2010-02-02 16:41:17 -05:00
/**
2010-01-05 23:02:57 -05:00
* Whether to force SSL on content .
*
* @ since 2.8 . 5
*
2015-05-26 17:51:31 -04:00
* @ staticvar bool $forced_content
*
2015-05-29 11:43:29 -04:00
* @ param bool $force
2010-01-05 23:02:57 -05:00
* @ return bool True if forced , false if not forced .
*/
function force_ssl_content ( $force = '' ) {
2015-05-29 11:43:29 -04:00
static $forced_content = false ;
2010-01-05 23:02:57 -05:00
2010-01-12 13:40:40 -05:00
if ( '' != $force ) {
2017-11-30 18:11:00 -05:00
$old_forced = $forced_content ;
2010-01-12 13:40:40 -05:00
$forced_content = $force ;
return $old_forced ;
}
return $forced_content ;
2010-01-05 23:02:57 -05:00
}
/**
2012-08-30 09:33:00 -04:00
* Formats a URL to use https .
2012-09-15 16:05:58 -04:00
*
2010-01-05 23:02:57 -05:00
* Useful as a filter .
*
* @ since 2.8 . 5
2012-08-30 09:33:00 -04:00
*
2015-12-23 01:31:27 -05:00
* @ param string $url URL
2012-08-30 09:33:00 -04:00
* @ return string URL with https as the scheme
*/
2019-07-01 04:01:57 -04:00
function filter_SSL ( $url ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
2017-11-30 18:11:00 -05:00
if ( ! is_string ( $url ) ) {
2012-08-30 09:33:00 -04:00
return get_bloginfo ( 'url' ); // Return home blog url with proper scheme
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
2017-11-30 18:11:00 -05:00
if ( force_ssl_content () && is_ssl () ) {
2012-08-30 09:33:00 -04:00
$url = set_url_scheme ( $url , 'https' );
2017-11-30 18:11:00 -05:00
}
2010-01-05 23:02:57 -05:00
return $url ;
}
2010-10-20 16:22:14 -04:00
/**
* Schedule update of the network - wide counts for the current network .
*
* @ since 3.1 . 0
*/
function wp_schedule_update_network_counts () {
2017-11-30 18:11:00 -05:00
if ( ! is_main_site () ) {
2010-10-20 16:22:14 -04:00
return ;
2017-11-30 18:11:00 -05:00
}
2010-10-20 16:22:14 -04:00
2017-11-30 18:11:00 -05:00
if ( ! wp_next_scheduled ( 'update_network_counts' ) && ! wp_installing () ) {
wp_schedule_event ( time (), 'twicedaily' , 'update_network_counts' );
}
2010-10-20 16:22:14 -04:00
}
/**
2016-12-27 04:28:40 -05:00
* Update the network - wide counts for the current network .
2010-10-20 16:22:14 -04:00
*
2016-12-27 04:21:44 -05:00
* @ since 3.1 . 0
2018-02-09 11:55:31 -05:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2017-04-19 20:27:42 -04:00
*
* @ param int | null $network_id ID of the network . Default is the current network .
2010-10-20 16:22:14 -04:00
*/
2017-04-19 20:27:42 -04:00
function wp_update_network_counts ( $network_id = null ) {
wp_update_network_user_counts ( $network_id );
wp_update_network_site_counts ( $network_id );
2013-09-25 12:21:09 -04:00
}
/**
* Update the count of sites for the current network .
*
2016-05-23 14:56:27 -04:00
* If enabled through the { @ see 'enable_live_network_counts' } filter , update the sites count
2013-09-25 12:21:09 -04:00
* on a network when a site is created or its status is updated .
*
* @ since 3.7 . 0
2018-02-09 11:55:31 -05:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2017-05-09 12:02:46 -04:00
*
* @ param int | null $network_id ID of the network . Default is the current network .
2013-09-25 12:21:09 -04:00
*/
2017-05-09 12:00:44 -04:00
function wp_maybe_update_network_site_counts ( $network_id = null ) {
$is_small_network = ! wp_is_large_network ( 'sites' , $network_id );
2013-09-25 12:21:09 -04:00
/**
2016-05-22 14:40:27 -04:00
* Filters whether to update network site or user counts when a new site is created .
2013-09-25 12:21:09 -04:00
*
* @ since 3.7 . 0
*
2013-12-02 15:45:10 -05:00
* @ see wp_is_large_network ()
*
* @ param bool $small_network Whether the network is considered small .
2013-09-25 12:21:09 -04:00
* @ param string $context Context . Either 'users' or 'sites' .
*/
2017-11-30 18:11:00 -05:00
if ( ! apply_filters ( 'enable_live_network_counts' , $is_small_network , 'sites' ) ) {
2013-09-25 12:21:09 -04:00
return ;
2017-11-30 18:11:00 -05:00
}
2013-09-25 12:21:09 -04:00
2017-05-09 12:00:44 -04:00
wp_update_network_site_counts ( $network_id );
2013-09-25 12:21:09 -04:00
}
/**
* Update the network - wide users count .
*
2016-05-23 14:56:27 -04:00
* If enabled through the { @ see 'enable_live_network_counts' } filter , update the users count
2013-09-25 12:21:09 -04:00
* on a network when a user is created or its status is updated .
*
* @ since 3.7 . 0
2018-02-09 11:55:31 -05:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2017-05-09 12:08:43 -04:00
*
* @ param int | null $network_id ID of the network . Default is the current network .
2013-09-25 12:21:09 -04:00
*/
2017-05-09 12:08:43 -04:00
function wp_maybe_update_network_user_counts ( $network_id = null ) {
$is_small_network = ! wp_is_large_network ( 'users' , $network_id );
2013-09-25 12:21:09 -04:00
2013-12-02 15:45:10 -05:00
/** This filter is documented in wp-includes/ms-functions.php */
2017-11-30 18:11:00 -05:00
if ( ! apply_filters ( 'enable_live_network_counts' , $is_small_network , 'users' ) ) {
2013-09-25 12:21:09 -04:00
return ;
2017-11-30 18:11:00 -05:00
}
2013-09-25 12:21:09 -04:00
2017-05-09 12:08:43 -04:00
wp_update_network_user_counts ( $network_id );
2013-09-25 12:21:09 -04:00
}
/**
* Update the network - wide site count .
*
* @ since 3.7 . 0
2018-02-09 11:55:31 -05:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2015-05-26 17:51:31 -04:00
*
2017-04-19 20:00:42 -04:00
* @ param int | null $network_id ID of the network . Default is the current network .
2013-09-25 12:21:09 -04:00
*/
2017-04-19 20:00:42 -04:00
function wp_update_network_site_counts ( $network_id = null ) {
$network_id = ( int ) $network_id ;
if ( ! $network_id ) {
$network_id = get_current_network_id ();
}
2010-10-20 16:22:14 -04:00
2017-11-30 18:11:00 -05:00
$count = get_sites (
array (
2019-03-18 11:56:51 -04:00
'network_id' => $network_id ,
'spam' => 0 ,
'deleted' => 0 ,
'archived' => 0 ,
'count' => true ,
'update_site_meta_cache' => false ,
2017-11-30 18:11:00 -05:00
)
);
2016-06-01 22:26:29 -04:00
2017-04-19 20:00:42 -04:00
update_network_option ( $network_id , 'blog_count' , $count );
2013-09-25 12:21:09 -04:00
}
/**
* Update the network - wide user count .
*
* @ since 3.7 . 0
2018-02-09 11:55:31 -05:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2015-05-26 17:51:31 -04:00
*
2015-10-14 19:44:25 -04:00
* @ global wpdb $wpdb WordPress database abstraction object .
2017-04-19 20:14:43 -04:00
*
* @ param int | null $network_id ID of the network . Default is the current network .
2013-09-25 12:21:09 -04:00
*/
2017-04-19 20:14:43 -04:00
function wp_update_network_user_counts ( $network_id = null ) {
2013-09-25 12:21:09 -04:00
global $wpdb ;
2010-10-20 16:22:14 -04:00
2012-11-07 14:28:08 -05:00
$count = $wpdb -> get_var ( " SELECT COUNT(ID) as c FROM $wpdb->users WHERE spam = '0' AND deleted = '0' " );
2017-04-19 20:14:43 -04:00
update_network_option ( $network_id , 'user_count' , $count );
2010-10-20 16:22:14 -04:00
}
2012-11-09 05:35:42 -05:00
/**
2019-09-21 13:41:57 -04:00
* Returns the space used by the current site .
2012-11-09 05:35:42 -05:00
*
* @ since 3.5 . 0
*
2019-09-21 13:41:57 -04:00
* @ return int Used space in megabytes .
2012-11-09 05:35:42 -05:00
*/
function get_space_used () {
2013-12-02 15:45:10 -05:00
/**
2019-09-21 13:41:57 -04:00
* Filters the amount of storage space used by the current site , in megabytes .
2013-12-02 15:45:10 -05:00
*
* @ since 3.5 . 0
*
2019-09-21 13:41:57 -04:00
* @ param int | false $space_used The amount of used space , in megabytes . Default false .
2013-12-02 15:45:10 -05:00
*/
2012-11-09 05:35:42 -05:00
$space_used = apply_filters ( 'pre_get_space_used' , false );
if ( false === $space_used ) {
$upload_dir = wp_upload_dir ();
2015-10-21 10:03:25 -04:00
$space_used = get_dirsize ( $upload_dir [ 'basedir' ] ) / MB_IN_BYTES ;
2012-11-09 05:35:42 -05:00
}
return $space_used ;
}
/**
* Returns the upload quota for the current blog .
*
2017-08-01 16:44:43 -04:00
* @ since MU ( 3.0 . 0 )
2012-11-09 05:35:42 -05:00
*
* @ return int Quota in megabytes
*/
function get_space_allowed () {
$space_allowed = get_option ( 'blog_upload_space' );
2017-11-30 18:11:00 -05:00
if ( ! is_numeric ( $space_allowed ) ) {
2015-10-07 13:11:25 -04:00
$space_allowed = get_site_option ( 'blog_upload_space' );
2017-11-30 18:11:00 -05:00
}
2012-11-09 05:35:42 -05:00
2017-11-30 18:11:00 -05:00
if ( ! is_numeric ( $space_allowed ) ) {
2013-08-22 16:55:08 -04:00
$space_allowed = 100 ;
2017-11-30 18:11:00 -05:00
}
2012-11-09 05:35:42 -05:00
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters the upload quota for the current site .
2013-12-02 15:45:10 -05:00
*
* @ since 3.7 . 0
*
* @ param int $space_allowed Upload quota in megabytes for the current blog .
*/
2013-08-22 16:55:08 -04:00
return apply_filters ( 'get_space_allowed' , $space_allowed );
2012-11-09 05:35:42 -05: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 () {
2015-09-26 15:49:25 -04:00
$allowed = get_space_allowed ();
if ( $allowed < 0 ) {
$allowed = 0 ;
}
2015-10-21 10:03:25 -04:00
$space_allowed = $allowed * MB_IN_BYTES ;
2017-11-30 18:11:00 -05:00
if ( get_site_option ( 'upload_space_check_disabled' ) ) {
2012-11-09 05:35:42 -05:00
return $space_allowed ;
2017-11-30 18:11:00 -05:00
}
2012-11-09 05:35:42 -05:00
2015-10-21 10:03:25 -04:00
$space_used = get_space_used () * MB_IN_BYTES ;
2012-11-09 05:35:42 -05:00
2017-11-30 18:11:00 -05:00
if ( ( $space_allowed - $space_used ) <= 0 ) {
2012-11-09 05:35:42 -05:00
return 0 ;
2017-11-30 18:11:00 -05:00
}
2012-11-09 05:35:42 -05:00
return $space_allowed - $space_used ;
}
2012-11-26 09:42:43 -05: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 () {
2017-11-30 18:11:00 -05:00
if ( get_site_option ( 'upload_space_check_disabled' ) ) {
2012-11-26 09:42:43 -05:00
return true ;
2017-11-30 18:11:00 -05:00
}
2012-11-26 09:42:43 -05:00
2012-11-26 22:42:02 -05:00
return ( bool ) get_upload_space_available ();
2012-11-26 09:42:43 -05:00
}
2012-11-09 05:35:42 -05:00
/**
2016-01-08 20:45:26 -05:00
* Filters the maximum upload file size allowed , in bytes .
*
2012-11-09 05:35:42 -05:00
* @ since 3.0 . 0
*
2016-01-08 20:45:26 -05:00
* @ param int $size Upload size limit in bytes .
* @ return int Upload size limit in bytes .
2012-11-09 05:35:42 -05:00
*/
function upload_size_limit_filter ( $size ) {
2015-10-21 10:03:25 -04:00
$fileupload_maxk = KB_IN_BYTES * get_site_option ( 'fileupload_maxk' , 1500 );
2017-11-30 18:11:00 -05:00
if ( get_site_option ( 'upload_space_check_disabled' ) ) {
2012-11-09 05:35:42 -05:00
return min ( $size , $fileupload_maxk );
2017-11-30 18:11:00 -05:00
}
2012-11-09 05:35:42 -05:00
return min ( $size , $fileupload_maxk , get_upload_space_available () );
2013-03-12 05:19:55 -04: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 .
2016-05-23 14:56:27 -04:00
* Plugins can alter this criteria using the { @ see 'wp_is_large_network' } filter .
2013-03-12 05:19:55 -04:00
*
* @ since 3.3 . 0
2018-02-09 11:55:31 -05:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2017-05-09 11:51:47 -04:00
*
* @ param string $using 'sites or ' users '. Default is ' sites ' .
* @ param int | null $network_id ID of the network . Default is the current network .
2013-03-12 05:19:55 -04:00
* @ return bool True if the network meets the criteria for large . False otherwise .
*/
2017-05-09 11:51:47 -04:00
function wp_is_large_network ( $using = 'sites' , $network_id = null ) {
$network_id = ( int ) $network_id ;
if ( ! $network_id ) {
$network_id = get_current_network_id ();
}
2013-03-12 05:19:55 -04:00
if ( 'users' == $using ) {
2017-05-09 11:51:47 -04:00
$count = get_user_count ( $network_id );
2013-12-02 15:45:10 -05:00
/**
2016-05-22 14:40:27 -04:00
* Filters whether the network is considered large .
2013-12-02 15:45:10 -05:00
*
* @ since 3.3 . 0
2018-02-09 11:55:31 -05:00
* @ since 4.8 . 0 The `$network_id` parameter has been added .
2013-12-02 15:45:10 -05:00
*
* @ param bool $is_large_network Whether the network has more than 10000 users or sites .
* @ param string $component The component to count . Accepts 'users' , or 'sites' .
* @ param int $count The count of items for the component .
2017-05-09 11:51:47 -04:00
* @ param int $network_id The ID of the network being checked .
2013-12-02 15:45:10 -05:00
*/
2017-10-04 18:17:46 -04:00
return apply_filters ( 'wp_is_large_network' , $count > 10000 , 'users' , $count , $network_id );
2013-03-12 05:19:55 -04:00
}
2017-05-09 11:51:47 -04:00
$count = get_blog_count ( $network_id );
2013-12-02 15:45:10 -05:00
/** This filter is documented in wp-includes/ms-functions.php */
2017-05-09 11:51:47 -04:00
return apply_filters ( 'wp_is_large_network' , $count > 10000 , 'sites' , $count , $network_id );
2013-03-12 05:19:55 -04:00
}
2013-09-14 17:13:10 -04:00
2015-10-06 00:35:25 -04:00
/**
2017-08-22 07:52:48 -04:00
* Retrieves a list of reserved site on a sub - directory Multisite installation .
2015-10-06 00:35:25 -04:00
*
* @ since 4.4 . 0
*
2019-11-05 16:23:02 -05:00
* @ return string [] Array of reserved names .
2015-10-06 00:35:25 -04:00
*/
function get_subdirectory_reserved_names () {
$names = array (
2017-11-30 18:11:00 -05:00
'page' ,
'comments' ,
'blog' ,
'files' ,
'feed' ,
'wp-admin' ,
'wp-content' ,
'wp-includes' ,
'wp-json' ,
'embed' ,
2015-10-06 00:35:25 -04:00
);
/**
2017-08-22 07:52:48 -04:00
* Filters reserved site names on a sub - directory Multisite installation .
2015-10-06 00:35:25 -04:00
*
* @ since 3.0 . 0
* @ since 4.4 . 0 'wp-admin' , 'wp-content' , 'wp-includes' , 'wp-json' , and 'embed' were added
* to the reserved names list .
*
2019-10-26 17:09:04 -04:00
* @ param string [] $subdirectory_reserved_names Array of reserved names .
2015-10-06 00:35:25 -04:00
*/
return apply_filters ( 'subdirectory_reserved_names' , $names );
}
2017-07-26 22:24:42 -04:00
2017-09-27 10:17:45 -04:00
/**
* Send a confirmation request email when a change of network admin email address is attempted .
*
* The new network admin address will not become active until confirmed .
*
* @ since 4.9 . 0
*
* @ param string $old_value The old network admin email address .
* @ param string $value The proposed new network admin email address .
*/
function update_network_option_new_admin_email ( $old_value , $value ) {
if ( $value == get_site_option ( 'admin_email' ) || ! is_email ( $value ) ) {
return ;
}
2017-11-30 18:11:00 -05:00
$hash = md5 ( $value . time () . mt_rand () );
2017-09-27 10:17:45 -04:00
$new_admin_email = array (
'hash' => $hash ,
'newemail' => $value ,
);
update_site_option ( 'network_admin_hash' , $new_admin_email );
$switched_locale = switch_to_locale ( get_user_locale () );
/* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */
2017-11-30 18:11:00 -05:00
$email_text = __ (
' Howdy ###USERNAME###,
2017-09-27 10:17:45 -04:00
You recently requested to have the network admin email address on
your network changed .
If this is correct , please click on the following link to change it :
###ADMIN_URL###
You can safely ignore and delete this email if you do not want to
take this action .
This email has been sent to ###EMAIL###
Regards ,
All at ###SITENAME###
2017-11-30 18:11:00 -05:00
###SITEURL###'
);
2017-09-27 10:17:45 -04:00
/**
* Filters the text of the email sent when a change of network admin email address is attempted .
*
* The following strings have a special meaning and will get replaced dynamically :
* ###USERNAME### The current user's username.
* ###ADMIN_URL### The link to click on to confirm the email change.
* ###EMAIL### The proposed new network admin email address.
* ###SITENAME### The name of the network.
* ###SITEURL### The URL to the network.
*
* @ since 4.9 . 0
*
* @ param string $email_text Text in the email .
* @ param array $new_admin_email {
* Data relating to the new network admin email address .
*
* @ type string $hash The secure hash used in the confirmation link URL .
* @ type string $newemail The proposed new network admin email address .
* }
*/
$content = apply_filters ( 'new_network_admin_email_content' , $email_text , $new_admin_email );
$current_user = wp_get_current_user ();
2017-11-30 18:11:00 -05:00
$content = str_replace ( '###USERNAME###' , $current_user -> user_login , $content );
$content = str_replace ( '###ADMIN_URL###' , esc_url ( network_admin_url ( 'settings.php?network_admin_hash=' . $hash ) ), $content );
$content = str_replace ( '###EMAIL###' , $value , $content );
$content = str_replace ( '###SITENAME###' , wp_specialchars_decode ( get_site_option ( 'site_name' ), ENT_QUOTES ), $content );
$content = str_replace ( '###SITEURL###' , network_home_url (), $content );
2017-09-27 10:17:45 -04:00
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
wp_mail (
$value ,
sprintf (
2019-09-02 20:41:05 -04:00
/* translators: Email change notification email subject. %s: Network title. */
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 13:13:59 -04:00
__ ( '[%s] Network Admin Email Change Request' ),
wp_specialchars_decode ( get_site_option ( 'site_name' ), ENT_QUOTES )
),
$content
);
2017-09-27 10:17:45 -04:00
if ( $switched_locale ) {
restore_previous_locale ();
}
}
2017-07-26 22:24:42 -04:00
/**
* Send an email to the old network admin email address when the network admin email address changes .
*
* @ since 4.9 . 0
*
* @ param string $option_name The relevant database option name .
* @ param string $new_email The new network admin email address .
* @ param string $old_email The old network admin email address .
* @ param int $network_id ID of the network .
*/
function wp_network_admin_email_change_notification ( $option_name , $new_email , $old_email , $network_id ) {
2018-01-23 08:45:32 -05:00
$send = true ;
// Don't send the notification to the default 'admin_email' value.
if ( 'you@example.com' === $old_email ) {
$send = false ;
}
2017-07-26 22:24:42 -04:00
/**
* Filters whether to send the network admin email change notification email .
*
* @ since 4.9 . 0
*
* @ param bool $send Whether to send the email notification .
* @ param string $old_email The old network admin email address .
* @ param string $new_email The new network admin email address .
* @ param int $network_id ID of the network .
*/
2018-01-23 08:45:32 -05:00
$send = apply_filters ( 'send_network_admin_email_change_email' , $send , $old_email , $new_email , $network_id );
2017-07-26 22:24:42 -04:00
if ( ! $send ) {
return ;
}
/* translators: Do not translate OLD_EMAIL, NEW_EMAIL, SITENAME, SITEURL: those are placeholders. */
2017-11-30 18:11:00 -05:00
$email_change_text = __ (
' Hi ,
2017-07-26 22:24:42 -04:00
This notice confirms that the network admin email address was changed on ###SITENAME###.
The new network admin email address is ###NEW_EMAIL###.
This email has been sent to ###OLD_EMAIL###
Regards ,
All at ###SITENAME###
2017-11-30 18:11:00 -05:00
###SITEURL###'
);
2017-07-26 22:24:42 -04:00
$email_change_email = array (
'to' => $old_email ,
2019-09-02 20:41:05 -04:00
/* translators: Network admin email change notification email subject. %s: Network title. */
2019-04-08 02:17:51 -04:00
'subject' => __ ( '[%s] Network Admin Email Changed' ),
2017-07-26 22:24:42 -04:00
'message' => $email_change_text ,
'headers' => '' ,
);
// get network name
$network_name = wp_specialchars_decode ( get_site_option ( 'site_name' ), ENT_QUOTES );
/**
* Filters the contents of the email notification sent when the network admin email address is changed .
*
* @ since 4.9 . 0
*
* @ param array $email_change_email {
* Used to build wp_mail () .
*
* @ type string $to The intended recipient .
* @ type string $subject The subject of the email .
* @ type string $message The content of the email .
* The following strings have a special meaning and will get replaced dynamically :
* - ###OLD_EMAIL### The old network admin email address.
* - ###NEW_EMAIL### The new network admin email address.
* - ###SITENAME### The name of the network.
* - ###SITEURL### The URL to the site.
* @ type string $headers Headers .
* }
* @ param string $old_email The old network admin email address .
* @ param string $new_email The new network admin email address .
* @ param int $network_id ID of the network .
*/
$email_change_email = apply_filters ( 'network_admin_email_change_email' , $email_change_email , $old_email , $new_email , $network_id );
2017-11-30 18:11:00 -05:00
$email_change_email [ 'message' ] = str_replace ( '###OLD_EMAIL###' , $old_email , $email_change_email [ 'message' ] );
$email_change_email [ 'message' ] = str_replace ( '###NEW_EMAIL###' , $new_email , $email_change_email [ 'message' ] );
$email_change_email [ 'message' ] = str_replace ( '###SITENAME###' , $network_name , $email_change_email [ 'message' ] );
$email_change_email [ 'message' ] = str_replace ( '###SITEURL###' , home_url (), $email_change_email [ 'message' ] );
2017-07-26 22:24:42 -04:00
2017-11-30 18:11:00 -05:00
wp_mail (
2018-08-16 21:51:36 -04:00
$email_change_email [ 'to' ],
sprintf (
2017-11-30 18:11:00 -05:00
$email_change_email [ 'subject' ],
$network_name
2018-08-16 21:51:36 -04:00
),
$email_change_email [ 'message' ],
$email_change_email [ 'headers' ]
2017-11-30 18:11:00 -05:00
);
2017-07-26 22:24:42 -04:00
}