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 */
2013-09-24 20:18:11 -04:00
require_once ( dirname ( __FILE__ ) . '/admin.php' );
2010-10-21 09:49:49 -04:00
2017-08-22 07:52:48 -04:00
/** WordPress Translation Installation API */
2015-09-05 16:47:24 -04:00
require_once ( ABSPATH . 'wp-admin/includes/translation-install.php' );
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
);
2017-11-30 18:11:00 -05: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' ] ) ) {
2010-11-11 11:57:22 -05:00
wp_die ( __ ( 'Can’t 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
2017-08-22 07:52:48 -04: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 ();
if ( in_array ( $domain , $subdirectory_reserved_names ) ) {
2016-02-28 21:44:26 -05:00
wp_die (
2017-11-30 18:11:00 -05:00
sprintf (
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
/* translators: %s: reserved names list */
2017-11-30 18:11:00 -05:00
__ ( 'The following words are reserved for use by WordPress functions and cannot be used as blog 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
2017-08-18 14:31:44 -04:00
} elseif ( in_array ( $_POST [ 'WPLANG' ], get_available_languages () ) ) {
$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 );
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 ();
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
}
2016-02-23 21:04:28 -05:00
wp_mail (
get_site_option ( 'admin_email' ),
sprintf (
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
/* translators: New site notification email subject. %s: Network name */
2016-02-23 21:04:28 -05:00
__ ( '[%s] New Site Created' ),
2016-10-19 00:47:30 -04:00
get_network () -> site_name
2016-02-23 21:04:28 -05:00
),
sprintf (
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
/* translators: New site notification email. 1: User login, 2: Site URL, 3: Site title */
2017-11-30 18:11:00 -05:00
__ (
' New site created by % 1 $s
2012-11-19 01:11:42 -05:00
Address : % 2 $s
2017-11-30 18:11:00 -05:00
Name : % 3 $s '
),
2016-02-23 21:04:28 -05:00
$current_user -> user_login ,
get_site_url ( $id ),
wp_unslash ( $title )
),
sprintf (
'From: "%1$s" <%2$s>' ,
_x ( 'Site Admin' , 'email "From" field' ),
get_site_option ( 'admin_email' )
)
2015-04-01 09:26:28 -04:00
);
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 ();
2017-11-30 18:11:00 -05:00
if ( 'added' == $_GET [ 'update' ] ) {
2015-04-01 09:26:28 -04:00
$messages [] = sprintf (
/* translators: 1: dashboard url, 2: network admin edit url */
__ ( '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
}
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' );
2013-09-24 20:18:11 -04:00
require ( 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
}
}
?>
2018-08-16 21:51:36 -04:00
< p >
< ? php
2018-03-07 14:41:33 -05:00
printf (
/* translators: %s: asterisk to mark required form fields. */
__ ( 'Required fields are marked %s' ),
'<span class="required">*</span>'
);
2018-08-16 21:51:36 -04:00
?>
</ p >
2014-07-08 13:52:14 -04:00
< form method = " post " action = " <?php echo 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 " >
2018-03-07 14:41:33 -05:00
< th scope = " row " >< label for = " site-address " >< ? php _e ( 'Site Address (URL)' ); ?> <span class="required">*</span></label></th>
2010-10-21 09:49:49 -04:00
< td >
< ? php if ( is_subdomain_install () ) { ?>
2018-03-07 14:41:33 -05:00
< input name = " blog[domain] " type = " text " class = " regular-text " 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
?>
2018-03-07 14:41:33 -05:00
< input name = " blog[domain] " type = " text " class = " regular-text " 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 " >
2018-03-07 14:41:33 -05:00
< th scope = " row " >< label for = " site-title " >< ? php _e ( 'Site Title' ); ?> <span class="required">*</span></label></th>
< 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.
if ( ! in_array ( $lang , $languages ) ) {
$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 " >
2018-03-07 14:41:33 -05:00
< th scope = " row " >< label for = " admin-email " >< ? php _e ( 'Admin Email' ); ?> <span class="required">*</span></label></th>
< 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
2013-09-24 20:18:11 -04:00
require ( ABSPATH . 'wp-admin/admin-footer.php' );