2010-10-21 09:49:49 -04:00
< ? php
/**
* Add Site Administration Screen
*
* @ package WordPress
2010-11-10 09:27:15 -05:00
* @ subpackage Multisite
2010-10-21 11:38:50 -04:00
* @ since 3.1 . 0
2010-10-21 09:49:49 -04:00
*/
/** Load WordPress Administration Bootstrap */
2020-02-06 01:33:11 -05:00
require_once __DIR__ . '/admin.php' ;
2010-10-21 09:49:49 -04:00
2017-08-22 07:52:48 -04:00
/** WordPress Translation Installation API */
2020-02-06 01:33:11 -05:00
require_once ABSPATH . 'wp-admin/includes/translation-install.php' ;
2015-09-05 16:47:24 -04:00
2017-04-15 13:30:48 -04:00
if ( ! current_user_can ( 'create_sites' ) ) {
2016-06-29 11:16:29 -04:00
wp_die ( __ ( 'Sorry, you are not allowed to add sites to this network.' ) );
2017-04-15 13:30:48 -04:00
}
2010-10-21 09:49:49 -04:00
2017-11-30 18:11:00 -05:00
get_current_screen () -> add_help_tab (
array (
'id' => 'overview' ,
'title' => __ ( 'Overview' ),
'content' =>
'<p>' . __ ( 'This screen is for Super Admins to add new sites to the network. This is not affected by the registration settings.' ) . '</p>' .
'<p>' . __ ( 'If the admin email for the new site does not exist in the database, a new user will also be created.' ) . '</p>' ,
)
);
2011-11-02 01:33:53 -04:00
2011-11-02 17:32:16 -04:00
get_current_screen () -> set_help_sidebar (
2017-11-30 18:11:00 -05:00
'<p><strong>' . __ ( 'For more information:' ) . '</strong></p>' .
2019-07-25 18:45:57 -04:00
'<p>' . __ ( '<a href="https://wordpress.org/support/article/network-admin-sites-screen/">Documentation on Site Management</a>' ) . '</p>' .
2017-11-30 18:11:00 -05:00
'<p>' . __ ( '<a href="https://wordpress.org/support/forum/multisite/">Support Forums</a>' ) . '</p>'
2010-12-16 01:52:47 -05:00
);
2020-05-24 05:17:09 -04:00
if ( isset ( $_REQUEST [ 'action' ] ) && 'add-site' === $_REQUEST [ 'action' ] ) {
2010-10-21 09:49:49 -04:00
check_admin_referer ( 'add-blog' , '_wpnonce_add-blog' );
2017-11-30 18:11:00 -05:00
if ( ! is_array ( $_POST [ 'blog' ] ) ) {
Administration: Replace contracted verb forms for better consistency.
This changeset replaces contracted verb forms like `doesn't`, `can't`, or `isn't` with non-contracted forms like `does not`, `cannot`, or `is not`, for better consistency across the WordPress administration. It also updates some corresponding unit tests strings.
Props Presskopp, socalchristina, aandrewdixon, francina, SergeyBiryukov, JeffPaul, audrasjb, hellofromTonya.
Fixes #38913.
See #39176.
Built from https://develop.svn.wordpress.org/trunk@52978
git-svn-id: http://core.svn.wordpress.org/trunk@52567 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2022-03-22 12:25:03 -04:00
wp_die ( __ ( 'Cannot create an empty site.' ) );
2017-11-30 18:11:00 -05:00
}
2013-11-16 12:38:11 -05:00
2017-11-30 18:11:00 -05:00
$blog = $_POST [ 'blog' ];
2010-10-21 09:49:49 -04:00
$domain = '' ;
2019-08-14 21:21:55 -04:00
$blog [ 'domain' ] = trim ( $blog [ 'domain' ] );
2017-11-30 18:11:00 -05:00
if ( preg_match ( '|^([a-zA-Z0-9-])+$|' , $blog [ 'domain' ] ) ) {
2010-10-21 09:49:49 -04:00
$domain = strtolower ( $blog [ 'domain' ] );
2017-11-30 18:11:00 -05:00
}
2010-10-21 09:49:49 -04:00
2020-01-28 19:45:18 -05:00
// If not a subdomain installation, make sure the domain isn't a reserved word.
2010-10-21 09:49:49 -04:00
if ( ! is_subdomain_install () ) {
2015-10-06 00:35:25 -04:00
$subdirectory_reserved_names = get_subdirectory_reserved_names ();
2020-04-04 23:02:11 -04:00
if ( in_array ( $domain , $subdirectory_reserved_names , true ) ) {
2016-02-28 21:44:26 -05:00
wp_die (
2017-11-30 18:11:00 -05:00
sprintf (
2019-09-02 20:41:05 -04:00
/* translators: %s: Reserved names list. */
2021-07-28 06:02:00 -04:00
__ ( 'The following words are reserved for use by WordPress functions and cannot be used as site names: %s' ),
2016-02-28 21:44:26 -05:00
'<code>' . implode ( '</code>, <code>' , $subdirectory_reserved_names ) . '</code>'
)
);
2015-10-06 00:35:25 -04:00
}
2010-10-21 09:49:49 -04:00
}
$title = $blog [ 'title' ];
2015-09-05 16:47:24 -04:00
$meta = array (
2017-11-30 18:11:00 -05:00
'public' => 1 ,
2015-09-05 16:47:24 -04:00
);
2017-08-22 07:52:48 -04:00
// Handle translation installation for the new site.
2016-09-26 14:39:32 -04:00
if ( isset ( $_POST [ 'WPLANG' ] ) ) {
if ( '' === $_POST [ 'WPLANG' ] ) {
$meta [ 'WPLANG' ] = '' ; // en_US
2020-04-04 23:02:11 -04:00
} elseif ( in_array ( $_POST [ 'WPLANG' ], get_available_languages (), true ) ) {
2017-08-18 14:31:44 -04:00
$meta [ 'WPLANG' ] = $_POST [ 'WPLANG' ];
2018-01-24 17:42:30 -05:00
} elseif ( current_user_can ( 'install_languages' ) && wp_can_install_language_pack () ) {
2016-09-26 14:39:32 -04:00
$language = wp_download_language_pack ( wp_unslash ( $_POST [ 'WPLANG' ] ) );
if ( $language ) {
$meta [ 'WPLANG' ] = $language ;
}
2015-09-05 16:47:24 -04:00
}
}
2017-11-30 18:11:00 -05:00
if ( empty ( $domain ) ) {
2010-10-21 09:49:49 -04:00
wp_die ( __ ( 'Missing or invalid site address.' ) );
2017-11-30 18:11:00 -05:00
}
2014-10-11 20:22:18 -04:00
if ( isset ( $blog [ 'email' ] ) && '' === trim ( $blog [ 'email' ] ) ) {
2010-10-21 09:49:49 -04:00
wp_die ( __ ( 'Missing email address.' ) );
2014-10-11 20:22:18 -04:00
}
$email = sanitize_email ( $blog [ 'email' ] );
if ( ! is_email ( $email ) ) {
2010-10-21 09:49:49 -04:00
wp_die ( __ ( 'Invalid email address.' ) );
2014-10-11 20:22:18 -04:00
}
2010-10-21 09:49:49 -04:00
if ( is_subdomain_install () ) {
2016-10-19 00:47:30 -04:00
$newdomain = $domain . '.' . preg_replace ( '|^www\.|' , '' , get_network () -> domain );
$path = get_network () -> path ;
2010-10-21 09:49:49 -04:00
} else {
2016-10-19 00:47:30 -04:00
$newdomain = get_network () -> domain ;
$path = get_network () -> path . $domain . '/' ;
2010-10-21 09:49:49 -04:00
}
$password = 'N/A' ;
2017-11-30 18:11:00 -05:00
$user_id = email_exists ( $email );
2020-01-28 19:45:18 -05:00
if ( ! $user_id ) { // Create a new user with a random password.
2015-12-06 15:10:26 -05:00
/**
2016-03-03 04:03:25 -05:00
* Fires immediately before a new user is created via the network site - new . php page .
2015-12-06 15:10:26 -05:00
*
* @ since 4.5 . 0
*
* @ param string $email Email of the non - existent user .
*/
2015-12-06 15:32:24 -05:00
do_action ( 'pre_network_site_new_created_user' , $email );
2015-12-06 15:10:26 -05:00
2015-10-09 21:42:26 -04:00
$user_id = username_exists ( $domain );
if ( $user_id ) {
wp_die ( __ ( 'The domain or path entered conflicts with an existing username.' ) );
}
2010-11-10 18:31:54 -05:00
$password = wp_generate_password ( 12 , false );
2017-11-30 18:11:00 -05:00
$user_id = wpmu_create_user ( $domain , $password , $email );
2015-09-16 18:19:24 -04:00
if ( false === $user_id ) {
2010-10-21 09:49:49 -04:00
wp_die ( __ ( 'There was an error creating the user.' ) );
2015-09-16 18:19:24 -04:00
}
/**
2017-11-26 18:57:55 -05:00
* Fires after a new user has been created via the network site - new . php page .
*
* @ since 4.4 . 0
*
* @ param int $user_id ID of the newly created user .
*/
2015-09-16 18:19:24 -04:00
do_action ( 'network_site_new_created_user' , $user_id );
2010-10-21 09:49:49 -04:00
}
$wpdb -> hide_errors ();
2016-10-19 00:47:30 -04:00
$id = wpmu_create_blog ( $newdomain , $path , $title , $user_id , $meta , get_current_network_id () );
2010-10-21 09:49:49 -04:00
$wpdb -> show_errors ();
2020-05-24 05:17:09 -04:00
2015-04-01 09:26:28 -04:00
if ( ! is_wp_error ( $id ) ) {
2017-11-30 18:11:00 -05:00
if ( ! is_super_admin ( $user_id ) && ! get_user_option ( 'primary_blog' , $user_id ) ) {
2010-10-21 09:49:49 -04:00
update_user_option ( $user_id , 'primary_blog' , $id , true );
2015-04-01 09:26:28 -04:00
}
2020-10-11 15:29:08 -04:00
wpmu_new_site_admin_notification ( $id , $user_id );
2010-10-21 09:49:49 -04:00
wpmu_welcome_notification ( $id , $user_id , $password , $title , array ( 'public' => 1 ) );
2017-11-30 18:11:00 -05:00
wp_redirect (
add_query_arg (
array (
'update' => 'added' ,
'id' => $id ,
2018-08-16 21:51:36 -04:00
),
'site-new.php'
2017-11-30 18:11:00 -05:00
)
);
2010-10-21 09:49:49 -04:00
exit ;
} else {
wp_die ( $id -> get_error_message () );
}
}
2017-11-30 18:11:00 -05:00
if ( isset ( $_GET [ 'update' ] ) ) {
2010-10-21 09:49:49 -04:00
$messages = array ();
2020-05-24 05:17:09 -04:00
if ( 'added' === $_GET [ 'update' ] ) {
2015-04-01 09:26:28 -04:00
$messages [] = sprintf (
2019-09-02 20:41:05 -04:00
/* translators: 1: Dashboard URL, 2: Network admin edit URL. */
2015-04-01 09:26:28 -04:00
__ ( 'Site added. <a href="%1$s">Visit Dashboard</a> or <a href="%2$s">Edit Site</a>' ),
esc_url ( get_admin_url ( absint ( $_GET [ 'id' ] ) ) ),
network_admin_url ( 'site-info.php?id=' . absint ( $_GET [ 'id' ] ) )
);
2017-11-30 18:11:00 -05:00
}
2010-10-21 09:49:49 -04:00
}
2021-07-22 09:53:00 -04:00
// Used in the HTML title tag.
2017-11-30 18:11:00 -05:00
$title = __ ( 'Add New Site' );
2010-10-21 09:49:49 -04:00
$parent_file = 'sites.php' ;
2014-01-27 18:10:12 -05:00
wp_enqueue_script ( 'user-suggest' );
2020-02-06 01:33:11 -05:00
require_once ABSPATH . 'wp-admin/admin-header.php' ;
2010-10-21 09:49:49 -04:00
?>
< div class = " wrap " >
2015-06-27 11:41:25 -04:00
< h1 id = " add-new-site " >< ? php _e ( 'Add New Site' ); ?> </h1>
2010-10-21 09:49:49 -04:00
< ? php
if ( ! empty ( $messages ) ) {
2017-11-30 18:11:00 -05:00
foreach ( $messages as $msg ) {
2015-04-01 18:06:28 -04:00
echo '<div id="message" class="updated notice is-dismissible"><p>' . $msg . '</p></div>' ;
2017-11-30 18:11:00 -05:00
}
}
?>
2022-08-12 08:11:09 -04:00
< p >< ? php echo wp_required_field_message (); ?> </p>
2021-06-21 00:30:56 -04:00
< form method = " post " action = " <?php echo esc_url( network_admin_url( 'site-new.php?action=add-site' ) ); ?> " novalidate = " novalidate " >
2017-11-30 18:11:00 -05:00
< ? php wp_nonce_field ( 'add-blog' , '_wpnonce_add-blog' ); ?>
2019-05-24 17:56:54 -04:00
< table class = " form-table " role = " presentation " >
2010-10-21 09:49:49 -04:00
< tr class = " form-field form-required " >
2022-08-12 08:11:09 -04:00
< th scope = " row " >
< label for = " site-address " >
< ? php
_e ( 'Site Address (URL)' );
echo ' ' . wp_required_field_indicator ();
?>
</ label >
</ th >
2010-10-21 09:49:49 -04:00
< td >
< ? php if ( is_subdomain_install () ) { ?>
2020-04-21 07:26:07 -04:00
< input name = " blog[domain] " type = " text " class = " regular-text ltr " id = " site-address " aria - describedby = " site-address-desc " autocapitalize = " none " autocorrect = " off " required />< span class = " no-break " >.< ? php echo preg_replace ( '|^www\.|' , '' , get_network () -> domain ); ?> </span>
2018-08-16 21:51:36 -04:00
< ? php
2019-01-12 01:41:52 -05:00
} else {
echo get_network () -> domain . get_network () -> path
?>
2020-04-21 07:26:07 -04:00
< input name = " blog[domain] " type = " text " class = " regular-text ltr " id = " site-address " aria - describedby = " site-address-desc " autocapitalize = " none " autocorrect = " off " required />
2019-01-12 01:41:52 -05:00
< ? php
}
2015-12-12 22:13:27 -05:00
echo '<p class="description" id="site-address-desc">' . __ ( 'Only lowercase letters (a-z), numbers, and hyphens are allowed.' ) . '</p>' ;
2019-01-12 01:41:52 -05:00
?>
2010-10-21 09:49:49 -04:00
</ td >
</ tr >
< tr class = " form-field form-required " >
2022-08-12 08:11:09 -04:00
< th scope = " row " >
< label for = " site-title " >
< ? php
_e ( 'Site Title' );
echo ' ' . wp_required_field_indicator ();
?>
</ label >
</ th >
2018-03-07 14:41:33 -05:00
< td >< input name = " blog[title] " type = " text " class = " regular-text " id = " site-title " required /></ td >
2010-10-21 09:49:49 -04:00
</ tr >
2015-09-05 16:47:24 -04:00
< ? php
$languages = get_available_languages ();
$translations = wp_get_available_translations ();
if ( ! empty ( $languages ) || ! empty ( $translations ) ) :
?>
< tr class = " form-field form-required " >
< th scope = " row " >< label for = " site-language " >< ? php _e ( 'Site Language' ); ?> </label></th>
< td >
< ? php
// Network default.
2015-10-07 13:11:25 -04:00
$lang = get_site_option ( 'WPLANG' );
2015-09-05 16:47:24 -04:00
// Use English if the default isn't available.
2020-04-04 23:02:11 -04:00
if ( ! in_array ( $lang , $languages , true ) ) {
2015-09-05 16:47:24 -04:00
$lang = '' ;
}
2017-11-30 18:11:00 -05:00
wp_dropdown_languages (
array (
'name' => 'WPLANG' ,
'id' => 'site-language' ,
'selected' => $lang ,
'languages' => $languages ,
'translations' => $translations ,
2018-01-24 17:42:30 -05:00
'show_available_translations' => current_user_can ( 'install_languages' ) && wp_can_install_language_pack (),
2017-11-30 18:11:00 -05:00
)
);
2015-09-05 16:47:24 -04:00
?>
</ td >
</ tr >
< ? php endif ; // Languages. ?>
2010-10-21 09:49:49 -04:00
< tr class = " form-field form-required " >
2022-08-12 08:11:09 -04:00
< th scope = " row " >
< label for = " admin-email " >
< ? php
_e ( 'Admin Email' );
echo ' ' . wp_required_field_indicator ();
?>
</ label >
</ th >
2018-03-07 14:41:33 -05:00
< td >< input name = " blog[email] " type = " email " class = " regular-text wp-suggest-user " id = " admin-email " data - autocomplete - type = " search " data - autocomplete - field = " user_email " aria - describedby = " site-admin-email " required /></ td >
2010-10-21 09:49:49 -04:00
</ tr >
< tr class = " form-field " >
2019-05-25 11:19:53 -04:00
< td colspan = " 2 " class = " td-full " >< p id = " site-admin-email " >< ? php _e ( 'A new user will be created if the above email address is not in the database.' ); ?> <br /><?php _e( 'The username and a link to set the password will be mailed to this email address.' ); ?></p></td>
2010-10-21 09:49:49 -04:00
</ tr >
</ table >
2016-02-17 14:03:25 -05:00
< ? php
/**
* Fires at the end of the new site form in network admin .
*
* @ since 4.5 . 0
*/
do_action ( 'network_site_new_form' );
submit_button ( __ ( 'Add Site' ), 'primary' , 'add-site' );
?>
2010-10-21 09:49:49 -04:00
</ form >
</ div >
< ? php
2020-02-06 01:33:11 -05:00
require_once ABSPATH . 'wp-admin/admin-footer.php' ;