switch_to_blog( $blog_id );
$home_url = home_url( '/' );
$login_url = wp_login_url();
$home_url = 'http://' . $domain . $path;
$login_url = 'http://' . $domain . $path . 'wp-login.php';
'<a href="%1$s">%2$s</a>',
/* translators: %s: Site title. */
printf( __( 'The site %s is yours.' ), $site );
/* translators: 1: Link to new site, 2: Login URL, 3: Username. */
__( '%1$s is your new site. <a href="%2$s">Log in</a> as “%3$s” using your existing password.' ),
untrailingslashit( $domain . $path )
* Fires when the site or user sign-up process is complete.
do_action( 'signup_finished' );
* Shows a form for a visitor to sign up for a new user account.
* @param string $user_name The username.
* @param string $user_email The user's email.
* @param WP_Error|string $errors A WP_Error object containing existing errors. Defaults to empty string.
function signup_user( $user_name = '', $user_email = '', $errors = '' ) {
if ( ! is_wp_error( $errors ) ) {
$errors = new WP_Error();
$signup_for = isset( $_POST['signup_for'] ) ? esc_html( $_POST['signup_for'] ) : 'blog';
$signup_user_defaults = array(
'user_name' => $user_name,
'user_email' => $user_email,
* Filters the default user variables used on the user sign-up form.
* @param array $signup_user_defaults {
* An array of default user variables.
* @type string $user_name The user username.
* @type string $user_email The user email address.
* @type WP_Error $errors A WP_Error object with possible errors relevant to the sign-up user.
$filtered_results = apply_filters( 'signup_user_init', $signup_user_defaults );
$user_name = $filtered_results['user_name'];
$user_email = $filtered_results['user_email'];
$errors = $filtered_results['errors'];
/* translators: %s: Name of the network. */
printf( __( 'Get your own %s account in seconds' ), get_network()->site_name );
<form id="setupform" method="post" action="wp-signup.php" novalidate="novalidate">
<input type="hidden" name="stage" value="validate-user-signup" />
/** This action is documented in wp-signup.php */
do_action( 'signup_hidden_fields', 'validate-user' );
<?php show_user_form( $user_name, $user_email, $errors ); ?>
<?php if ( 'blog' === $active_signup ) { ?>
<input id="signupblog" type="hidden" name="signup_for" value="blog" />
<?php } elseif ( 'user' === $active_signup ) { ?>
<input id="signupblog" type="hidden" name="signup_for" value="user" />
<input id="signupblog" type="radio" name="signup_for" value="blog" <?php checked( $signup_for, 'blog' ); ?> />
<label class="checkbox" for="signupblog"><?php _e( 'Gimme a site!' ); ?></label>
<input id="signupuser" type="radio" name="signup_for" value="user" <?php checked( $signup_for, 'user' ); ?> />
<label class="checkbox" for="signupuser"><?php _e( 'Just a username, please.' ); ?></label>
<p class="submit"><input type="submit" name="submit" class="submit" value="<?php esc_attr_e( 'Next' ); ?>" /></p>
* Validate the new user signup
* @return bool True if new user signup was validated, false if error
function validate_user_signup() {
$result = validate_user_form();
$user_name = $result['user_name'];
$user_email = $result['user_email'];
$errors = $result['errors'];
if ( $errors->has_errors() ) {
signup_user( $user_name, $user_email, $errors );
if ( 'blog' === $_POST['signup_for'] ) {
signup_blog( $user_name, $user_email );
/** This filter is documented in wp-signup.php */
wpmu_signup_user( $user_name, $user_email, apply_filters( 'add_signup_meta', array() ) );
confirm_user_signup( $user_name, $user_email );
* New user signup confirmation
* @param string $user_name The username
* @param string $user_email The user's email address
function confirm_user_signup( $user_name, $user_email ) {
/* translators: %s: Username. */
printf( __( '%s is your new username' ), $user_name )
<p><?php _e( 'But, before you can start using your new username, <strong>you must activate it</strong>.' ); ?></p>
/* translators: %s: Email address. */
printf( __( 'Check your inbox at %s and click the link given.' ), '<strong>' . $user_email . '</strong>' );
<p><?php _e( 'If you do not activate your username within two days, you will have to sign up again.' ); ?></p>
/** This action is documented in wp-signup.php */
do_action( 'signup_finished' );
* Shows a form for a user or visitor to sign up for a new site.
* @param string $user_name The username.
* @param string $user_email The user's email address.
* @param string $blogname The site name.
* @param string $blog_title The site title.
* @param WP_Error|string $errors A WP_Error object containing existing errors. Defaults to empty string.
function signup_blog( $user_name = '', $user_email = '', $blogname = '', $blog_title = '', $errors = '' ) {
if ( ! is_wp_error( $errors ) ) {
$errors = new WP_Error();
$signup_blog_defaults = array(
'user_name' => $user_name,
'user_email' => $user_email,
'blog_title' => $blog_title,
* Filters the default site creation variables for the site sign-up form.
* @param array $signup_blog_defaults {
* An array of default site creation variables.
* @type string $user_name The user username.
* @type string $user_email The user email address.
* @type string $blogname The blogname.
* @type string $blog_title The title of the site.
* @type WP_Error $errors A WP_Error object with possible errors relevant to new site creation variables.
$filtered_results = apply_filters( 'signup_blog_init', $signup_blog_defaults );
$user_name = $filtered_results['user_name'];
$user_email = $filtered_results['user_email'];
$blogname = $filtered_results['blogname'];
$blog_title = $filtered_results['blog_title'];
$errors = $filtered_results['errors'];
if ( empty( $blogname ) ) {
<form id="setupform" method="post" action="wp-signup.php">
<input type="hidden" name="stage" value="validate-blog-signup" />
<input type="hidden" name="user_name" value="<?php echo esc_attr( $user_name ); ?>" />
<input type="hidden" name="user_email" value="<?php echo esc_attr( $user_email ); ?>" />
/** This action is documented in wp-signup.php */
do_action( 'signup_hidden_fields', 'validate-site' );
<?php show_blog_form( $blogname, $blog_title, $errors ); ?>
<p class="submit"><input type="submit" name="submit" class="submit" value="<?php esc_attr_e( 'Signup' ); ?>" /></p>
* Validate new site signup
* @return bool True if the site signup was validated, false if error
function validate_blog_signup() {
// Re-validate user info.
$user_result = wpmu_validate_user_signup( $_POST['user_name'], $_POST['user_email'] );
$user_name = $user_result['user_name'];
$user_email = $user_result['user_email'];
$user_errors = $user_result['errors'];
if ( $user_errors->has_errors() ) {
signup_user( $user_name, $user_email, $user_errors );
$result = wpmu_validate_blog_signup( $_POST['blogname'], $_POST['blog_title'] );
$domain = $result['domain'];
$blogname = $result['blogname'];
$blog_title = $result['blog_title'];
$errors = $result['errors'];
if ( $errors->has_errors() ) {
signup_blog( $user_name, $user_email, $blogname, $blog_title, $errors );
$public = (int) $_POST['blog_public'];
// Handle the language setting for the new site.
if ( ! empty( $_POST['WPLANG'] ) ) {
$languages = signup_get_available_languages();
if ( in_array( $_POST['WPLANG'], $languages, true ) ) {
$language = wp_unslash( sanitize_text_field( $_POST['WPLANG'] ) );
$signup_meta['WPLANG'] = $language;
/** This filter is documented in wp-signup.php */
$meta = apply_filters( 'add_signup_meta', $signup_meta );
wpmu_signup_blog( $domain, $path, $blog_title, $user_name, $user_email, $meta );
confirm_blog_signup( $domain, $path, $blog_title, $user_name, $user_email, $meta );
* Shows a message confirming that the new site has been registered and is awaiting activation.
* @param string $domain The domain or subdomain of the site.
* @param string $path The path of the site.
* @param string $blog_title The title of the new site.
* @param string $user_name The user's username.
* @param string $user_email The user's email address.
* @param array $meta Any additional meta from the {@see 'add_signup_meta'} filter in validate_blog_signup().
function confirm_blog_signup( $domain, $path, $blog_title, $user_name = '', $user_email = '', $meta = array() ) {
/* translators: %s: Site address. */
printf( __( 'Congratulations! Your new site, %s, is almost ready.' ), "<a href='http://{$domain}{$path}'>{$blog_title}</a>" )
<p><?php _e( 'But, before you can start using your site, <strong>you must activate it</strong>.' ); ?></p>
/* translators: %s: Email address. */
printf( __( 'Check your inbox at %s and click the link given.' ), '<strong>' . $user_email . '</strong>' );
<p><?php _e( 'If you do not activate your site within two days, you will have to sign up again.' ); ?></p>
<h2><?php _e( 'Still waiting for your email?' ); ?></h2>
<?php _e( 'If you haven’t received your email yet, there are a number of things you can do:' ); ?>
<li><p><strong><?php _e( 'Wait a little longer. Sometimes delivery of email can be delayed by processes outside of our control.' ); ?></strong></p></li>
<li><p><?php _e( 'Check the junk or spam folder of your email client. Sometime emails wind up there by mistake.' ); ?></p></li>
/* translators: %s: Email address. */
printf( __( 'Have you entered your email correctly? You have entered %s, if it’s incorrect, you will not receive your email.' ), $user_email );
/** This action is documented in wp-signup.php */
do_action( 'signup_finished' );
* Retrieves languages available during the site/user signup process.
* @see get_available_languages()
* @return array List of available languages.
function signup_get_available_languages() {
* Filters the list of available languages for front-end site signups.
* Passing an empty array to this hook will disable output of the setting on the
* signup form, and the default language will be used when creating the site.
* Languages not already installed will be stripped.
* @param array $available_languages Available languages.
$languages = (array) apply_filters( 'signup_get_available_languages', get_available_languages() );
* Strip any non-installed languages and return.
* Re-call get_available_languages() here in case a language pack was installed
* in a callback hooked to the 'signup_get_available_languages' filter before this point.
return array_intersect_assoc( $languages, get_available_languages() );
$active_signup = get_site_option( 'registration', 'none' );
* Filters the type of site sign-up.
* @param string $active_signup String that returns registration type. The value can be
* 'all', 'none', 'blog', or 'user'.
$active_signup = apply_filters( 'wpmu_active_signup', $active_signup );
if ( current_user_can( 'manage_network' ) ) {
echo '<div class="mu_alert">';
_e( 'Greetings Network Administrator!' );
switch ( $active_signup ) {
_e( 'The network currently disallows registrations.' );
_e( 'The network currently allows site registrations.' );
_e( 'The network currently allows user registrations.' );
_e( 'The network currently allows both site and user registrations.' );
/* translators: %s: URL to Network Settings screen. */
printf( __( 'To change or disable registration go to your <a href="%s">Options page</a>.' ), esc_url( network_admin_url( 'settings.php' ) ) );
$newblogname = isset( $_GET['new'] ) ? strtolower( preg_replace( '/^-|-$|[^-a-zA-Z0-9]/', '', $_GET['new'] ) ) : null;
$current_user = wp_get_current_user();
if ( 'none' === $active_signup ) {
_e( 'Registration has been disabled.' );
} elseif ( 'blog' === $active_signup && ! is_user_logged_in() ) {
$login_url = wp_login_url( network_site_url( 'wp-signup.php' ) );
/* translators: %s: Login URL. */
printf( __( 'You must first <a href="%s">log in</a>, and then you can create a new site.' ), $login_url );
$stage = isset( $_POST['stage'] ) ? $_POST['stage'] : 'default';
case 'validate-user-signup':
if ( 'all' === $active_signup
|| ( 'blog' === $_POST['signup_for'] && 'blog' === $active_signup )
|| ( 'user' === $_POST['signup_for'] && 'user' === $active_signup )
_e( 'User registration has been disabled.' );
case 'validate-blog-signup':
if ( 'all' === $active_signup || 'blog' === $active_signup ) {
_e( 'Site registration has been disabled.' );
validate_another_blog_signup();
$user_email = isset( $_POST['user_email'] ) ? $_POST['user_email'] : '';
* Fires when the site sign-up form is sent.
do_action( 'preprocess_signup_form' );
if ( is_user_logged_in() && ( 'all' === $active_signup || 'blog' === $active_signup ) ) {
signup_another_blog( $newblogname );
} elseif ( ! is_user_logged_in() && ( 'all' === $active_signup || 'user' === $active_signup ) ) {
signup_user( $newblogname, $user_email );
} elseif ( ! is_user_logged_in() && ( 'blog' === $active_signup ) ) {
_e( 'Sorry, new registrations are not allowed at this time.' );
_e( 'You are logged in already. No need to register again!' );
$newblog = get_blogaddress_by_name( $newblogname );
if ( 'blog' === $active_signup || 'all' === $active_signup ) {
/* translators: %s: Site address. */
'<p>' . __( 'The site you were looking for, %s, does not exist, but you can create it now!' ) . '</p>',
'<strong>' . $newblog . '</strong>'
/* translators: %s: Site address. */
'<p>' . __( 'The site you were looking for, %s, does not exist.' ) . '</p>',
'<strong>' . $newblog . '</strong>'