2010-01-06 08:50:12 +01:00
< ? php
/** Sets up the WordPress Environment. */
require ( dirname ( __FILE__ ) . '/wp-load.php' );
2011-11-15 21:44:48 +01:00
add_action ( 'wp_head' , 'wp_no_robots' );
2010-01-06 08:50:12 +01:00
2013-09-25 02:17:40 +02:00
require ( dirname ( __FILE__ ) . '/wp-blog-header.php' );
2010-01-06 08:50:12 +01:00
2015-10-07 19:11:01 +02:00
if ( is_array ( get_site_option ( 'illegal_names' )) && isset ( $_GET [ 'new' ] ) && in_array ( $_GET [ 'new' ], get_site_option ( 'illegal_names' ) ) ) {
2010-05-12 02:45:01 +02:00
wp_redirect ( network_home_url () );
2010-01-06 08:50:12 +01:00
die ();
}
2013-01-31 04:13:22 +01:00
/**
* Prints signup_header via wp_head
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2013-01-31 04:13:22 +01:00
*/
2010-01-06 08:50:12 +01:00
function do_signup_header () {
2013-09-29 01:41:07 +02:00
/**
2014-11-24 07:30:19 +01:00
* Fires within the head section of the site sign - up screen .
2013-09-29 01:41:07 +02:00
*
* @ since 3.0 . 0
*/
2011-05-23 00:30:05 +02:00
do_action ( 'signup_header' );
2010-01-06 08:50:12 +01:00
}
add_action ( 'wp_head' , 'do_signup_header' );
2010-01-26 22:22:44 +01:00
if ( ! is_multisite () ) {
2015-09-15 19:10:24 +02:00
wp_redirect ( wp_registration_url () );
2010-01-26 22:22:44 +01:00
die ();
}
if ( ! is_main_site () ) {
2012-09-11 14:27:25 +02:00
wp_redirect ( network_site_url ( 'wp-signup.php' ) );
2010-01-06 08:50:12 +01:00
die ();
}
2010-05-12 02:45:01 +02:00
// Fix for page title
$wp_query -> is_404 = false ;
2015-10-14 19:31:54 +02:00
/**
* Fires before the Site Signup page is loaded .
*
* @ since 4.4 . 0
*/
do_action ( 'before_signup_header' );
2013-01-31 04:13:22 +01:00
/**
* Prints styles for front - end Multisite signup pages
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2013-01-31 04:13:22 +01:00
*/
2010-01-06 08:50:12 +01:00
function wpmu_signup_stylesheet () {
?>
2010-01-15 23:11:12 +01:00
< style type = " text/css " >
2010-01-06 08:50:12 +01:00
. mu_register { width : 90 % ; margin : 0 auto ; }
. mu_register form { margin - top : 2 em ; }
. mu_register . error { font - weight : 700 ; padding : 10 px ; color : #333333; background:#FFEBE8; border:1px solid #CC0000; }
. mu_register input [ type = " submit " ],
. mu_register #blog_title,
2010-01-15 23:11:12 +01:00
. mu_register #user_email,
2010-01-06 08:50:12 +01:00
. mu_register #blogname,
2010-01-15 23:11:12 +01:00
. mu_register #user_name { width:100%; font-size: 24px; margin:5px 0; }
2015-10-14 01:45:14 +02:00
. mu_register #site-language { display: block; }
2010-01-06 08:50:12 +01:00
. mu_register . prefix_address ,
2010-01-15 23:11:12 +01:00
. mu_register . suffix_address { font - size : 18 px ; display : inline ; }
2010-01-06 08:50:12 +01:00
. mu_register label { font - weight : 700 ; font - size : 15 px ; display : block ; margin : 10 px 0 ; }
. mu_register label . checkbox { display : inline ; }
. mu_register . mu_alert { font - weight : 700 ; padding : 10 px ; color : #333333; background:#ffffe0; border:1px solid #e6db55; }
</ style >
< ? php
}
add_action ( 'wp_head' , 'wpmu_signup_stylesheet' );
2015-10-06 00:35:20 +02:00
get_header ( 'wp-signup' );
2010-03-09 17:27:02 +01:00
2013-09-29 01:41:07 +02:00
/**
* Fires before the site sign - up form .
*
* @ since 3.0 . 0
*/
2010-03-09 17:27:02 +01:00
do_action ( 'before_signup_form' );
2010-01-06 08:50:12 +01:00
?>
2015-09-15 04:08:07 +02:00
< div id = " signup-content " class = " widecolumn " >
2015-10-03 23:50:24 +02:00
< div class = " mu_register wp-signup-container " >
2010-01-06 08:50:12 +01:00
< ? php
2013-01-31 04:13:22 +01:00
/**
* Generates and displays the Signup and Create Site forms
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2013-01-31 04:13:22 +01:00
*
2016-05-24 06:15:57 +02:00
* @ param string $blogname The new site name .
* @ param string $blog_title The new site title .
* @ param WP_Error | string $errors A WP_Error object containing existing errors . Defaults to empty string .
2013-01-31 04:13:22 +01:00
*/
2013-11-13 04:22:48 +01:00
function show_blog_form ( $blogname = '' , $blog_title = '' , $errors = '' ) {
2016-05-24 06:15:57 +02:00
if ( ! is_wp_error ( $errors ) ) {
$errors = new WP_Error ();
}
2016-10-19 06:46:14 +02:00
$current_network = get_network ();
2010-01-06 08:50:12 +01:00
// Blog name
2010-01-16 00:40:29 +01:00
if ( ! is_subdomain_install () )
2010-02-24 21:45:02 +01:00
echo '<label for="blogname">' . __ ( 'Site Name:' ) . '</label>' ;
2010-01-06 08:50:12 +01:00
else
2010-02-24 21:45:02 +01:00
echo '<label for="blogname">' . __ ( 'Site Domain:' ) . '</label>' ;
2010-01-06 08:50:12 +01:00
if ( $errmsg = $errors -> get_error_message ( 'blogname' ) ) { ?>
< p class = " error " >< ? php echo $errmsg ?> </p>
< ? php }
2010-01-16 00:40:29 +01:00
if ( ! is_subdomain_install () )
2016-10-19 06:46:14 +02:00
echo '<span class="prefix_address">' . $current_network -> domain . $current_network -> path . '</span><input name="blogname" type="text" id="blogname" value="' . esc_attr ( $blogname ) . '" maxlength="60" /><br />' ;
2010-01-16 00:40:29 +01:00
else
2016-10-19 06:46:14 +02:00
echo '<input name="blogname" type="text" id="blogname" value="' . esc_attr ( $blogname ) . '" maxlength="60" /><span class="suffix_address">.' . ( $site_domain = preg_replace ( '|^www\.|' , '' , $current_network -> domain ) ) . '</span><br />' ;
2010-01-16 00:40:29 +01:00
2016-05-24 22:43:23 +02:00
if ( ! is_user_logged_in () ) {
if ( ! is_subdomain_install () ) {
2016-10-19 06:46:14 +02:00
$site = $current_network -> domain . $current_network -> path . __ ( 'sitename' );
2016-05-24 22:43:23 +02:00
} else {
2016-10-19 06:46:14 +02:00
$site = __ ( 'domain' ) . '.' . $site_domain . $current_network -> path ;
2016-05-24 22:43:23 +02:00
}
/* translators: %s: site address */
echo '<p>(<strong>' . sprintf ( __ ( 'Your address will be %s.' ), $site ) . '</strong>) ' . __ ( 'Must be at least 4 characters, letters and numbers only. It cannot be changed, so choose carefully!' ) . '</p>' ;
2010-01-06 08:50:12 +01:00
}
// Blog Title
?>
2010-02-24 21:45:02 +01:00
< label for = " blog_title " >< ? php _e ( 'Site Title:' ) ?> </label>
2010-01-06 08:50:12 +01:00
< ? php if ( $errmsg = $errors -> get_error_message ( 'blog_title' ) ) { ?>
< p class = " error " >< ? php echo $errmsg ?> </p>
< ? php }
2010-06-10 22:44:54 +02:00
echo '<input name="blog_title" type="text" id="blog_title" value="' . esc_attr ( $blog_title ) . '" />' ;
2010-01-06 08:50:12 +01:00
?>
2015-10-14 01:45:14 +02:00
< ? php
// Site Language.
$languages = signup_get_available_languages ();
if ( ! empty ( $languages ) ) :
?>
< p >
< label for = " site-language " >< ? php _e ( 'Site Language:' ); ?> </label>
< ? php
// Network default.
$lang = get_site_option ( 'WPLANG' );
if ( isset ( $_POST [ 'WPLANG' ] ) ) {
$lang = $_POST [ 'WPLANG' ];
}
// Use US English if the default isn't available.
if ( ! in_array ( $lang , $languages ) ) {
$lang = '' ;
}
wp_dropdown_languages ( array (
'name' => 'WPLANG' ,
'id' => 'site-language' ,
'selected' => $lang ,
'languages' => $languages ,
'show_available_translations' => false ,
) );
?>
</ p >
< ? php endif ; // Languages. ?>
2010-01-06 08:50:12 +01:00
< div id = " privacy " >
< p class = " privacy-intro " >
< label for = " blog_public_on " >< ? php _e ( 'Privacy:' ) ?> </label>
2012-01-30 21:51:00 +01:00
< ? php _e ( 'Allow search engines to index this site.' ); ?>
2010-06-10 22:44:54 +02:00
< br style = " clear:both " />
2010-01-06 08:50:12 +01:00
< label class = " checkbox " for = " blog_public_on " >
2010-01-16 00:40:29 +01:00
< input type = " radio " id = " blog_public_on " name = " blog_public " value = " 1 " < ? php if ( ! isset ( $_POST [ 'blog_public' ] ) || $_POST [ 'blog_public' ] == '1' ) { ?> checked="checked"<?php } ?> />
2010-01-06 08:50:12 +01:00
< strong >< ? php _e ( 'Yes' ); ?> </strong>
</ label >
< label class = " checkbox " for = " blog_public_off " >
2010-01-16 00:40:29 +01:00
< input type = " radio " id = " blog_public_off " name = " blog_public " value = " 0 " < ? php if ( isset ( $_POST [ 'blog_public' ] ) && $_POST [ 'blog_public' ] == '0' ) { ?> checked="checked"<?php } ?> />
2010-01-06 08:50:12 +01:00
< strong >< ? php _e ( 'No' ); ?> </strong>
</ label >
</ p >
</ div >
2010-01-15 23:11:12 +01:00
2010-01-06 08:50:12 +01:00
< ? php
2013-09-29 01:41:07 +02:00
/**
* Fires after the site sign - up form .
*
* @ since 3.0 . 0
*
2016-05-24 06:15:57 +02:00
* @ param WP_Error $errors A WP_Error object possibly containing 'blogname' or 'blog_title' errors .
2013-09-29 01:41:07 +02:00
*/
do_action ( 'signup_blogform' , $errors );
2010-01-06 08:50:12 +01:00
}
2013-01-31 04:13:22 +01:00
/**
* Validate the new site signup
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2013-01-31 04:13:22 +01:00
*
* @ return array Contains the new site data and error messages .
*/
2010-01-06 08:50:12 +01:00
function validate_blog_form () {
$user = '' ;
if ( is_user_logged_in () )
$user = wp_get_current_user ();
return wpmu_validate_blog_signup ( $_POST [ 'blogname' ], $_POST [ 'blog_title' ], $user );
}
2013-01-31 04:13:22 +01:00
/**
* Display user registration form
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2013-01-31 04:13:22 +01:00
*
2016-05-24 06:15:57 +02:00
* @ param string $user_name The entered username .
* @ param string $user_email The entered email address .
* @ param WP_Error | string $errors A WP_Error object containing existing errors . Defaults to empty string .
2013-01-31 04:13:22 +01:00
*/
2010-01-06 08:50:12 +01:00
function show_user_form ( $user_name = '' , $user_email = '' , $errors = '' ) {
2016-05-24 06:15:57 +02:00
if ( ! is_wp_error ( $errors ) ) {
$errors = new WP_Error ();
}
2010-01-06 08:50:12 +01:00
// User name
echo '<label for="user_name">' . __ ( 'Username:' ) . '</label>' ;
if ( $errmsg = $errors -> get_error_message ( 'user_name' ) ) {
echo '<p class="error">' . $errmsg . '</p>' ;
}
2016-05-24 05:42:36 +02:00
echo '<input name="user_name" type="text" id="user_name" value="' . esc_attr ( $user_name ) . '" autocapitalize="none" autocorrect="off" maxlength="60" /><br />' ;
2010-04-11 12:41:54 +02:00
_e ( '(Must be at least 4 characters, letters and numbers only.)' );
2010-01-06 08:50:12 +01:00
?>
2010-04-11 12:41:54 +02:00
< label for = " user_email " >< ? php _e ( 'Email Address:' ) ?> </label>
2010-01-06 08:50:12 +01:00
< ? php if ( $errmsg = $errors -> get_error_message ( 'user_email' ) ) { ?>
< p class = " error " >< ? php echo $errmsg ?> </p>
2010-01-15 23:11:12 +01:00
< ? php } ?>
2014-07-08 19:51:58 +02:00
< input name = " user_email " type = " email " id = " user_email " value = " <?php echo esc_attr( $user_email ) ?> " maxlength = " 200 " />< br />< ? php _e ( 'We send your registration email to this address. (Double-check your email address before continuing.)' ) ?>
2010-01-06 08:50:12 +01:00
< ? php
if ( $errmsg = $errors -> get_error_message ( 'generic' ) ) {
2010-04-11 12:41:54 +02:00
echo '<p class="error">' . $errmsg . '</p>' ;
2010-01-06 08:50:12 +01:00
}
2013-09-29 01:41:07 +02:00
/**
* Fires at the end of the user registration form on the site sign - up form .
*
* @ since 3.0 . 0
*
2016-05-24 06:15:57 +02:00
* @ param WP_Error $errors A WP_Error object containing containing 'user_name' or 'user_email' errors .
2013-09-29 01:41:07 +02:00
*/
2010-01-06 08:50:12 +01:00
do_action ( 'signup_extra_fields' , $errors );
}
2013-01-31 04:13:22 +01:00
/**
* Validate user signup name and email
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2013-01-31 04:13:22 +01:00
*
* @ return array Contains username , email , and error messages .
*/
2010-01-06 08:50:12 +01:00
function validate_user_form () {
return wpmu_validate_user_signup ( $_POST [ 'user_name' ], $_POST [ 'user_email' ]);
}
2013-01-31 04:13:22 +01:00
/**
* Allow returning users to sign up for another site
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2013-01-31 04:13:22 +01:00
*
2016-05-24 06:15:57 +02:00
* @ param string $blogname The new site name
* @ param string $blog_title The new site title .
* @ param WP_Error | string $errors A WP_Error object containing existing errors . Defaults to empty string .
2013-01-31 04:13:22 +01:00
*/
2013-11-13 04:22:48 +01:00
function signup_another_blog ( $blogname = '' , $blog_title = '' , $errors = '' ) {
2010-06-24 17:01:29 +02:00
$current_user = wp_get_current_user ();
2010-01-15 23:11:12 +01:00
2010-01-06 08:50:12 +01:00
if ( ! is_wp_error ( $errors ) ) {
$errors = new WP_Error ();
}
2013-09-29 01:41:07 +02:00
$signup_defaults = array (
'blogname' => $blogname ,
'blog_title' => $blog_title ,
'errors' => $errors
);
/**
2016-05-23 18:43:20 +02:00
* Filters the default site sign - up variables .
2013-09-29 01:41:07 +02:00
*
* @ since 3.0 . 0
*
* @ param array $signup_defaults {
* An array of default site sign - up variables .
*
2016-05-24 06:15:57 +02:00
* @ type string $blogname The site blogname .
* @ type string $blog_title The site title .
* @ type WP_Error $errors A WP_Error object possibly containing 'blogname' or 'blog_title' errors .
2013-09-29 01:41:07 +02:00
* }
*/
$filtered_results = apply_filters ( 'signup_another_blog_init' , $signup_defaults );
2010-01-06 08:50:12 +01:00
$blogname = $filtered_results [ 'blogname' ];
$blog_title = $filtered_results [ 'blog_title' ];
$errors = $filtered_results [ 'errors' ];
2016-10-19 06:46:14 +02:00
echo '<h2>' . sprintf ( __ ( 'Get <em>another</em> %s site in seconds' ), get_network () -> site_name ) . '</h2>' ;
2010-01-06 08:50:12 +01:00
if ( $errors -> get_error_code () ) {
2010-04-11 12:41:54 +02:00
echo '<p>' . __ ( 'There was a problem, please correct the form below and try again.' ) . '</p>' ;
2010-01-06 08:50:12 +01:00
}
?>
2010-04-11 12:41:54 +02:00
< p >< ? php printf ( __ ( 'Welcome back, %s. By filling out the form below, you can <strong>add another site to your account</strong>. There is no limit to the number of sites you can have, so create to your heart’s content, but write responsibly!' ), $current_user -> display_name ) ?> </p>
2010-01-15 23:11:12 +01:00
2010-01-06 08:50:12 +01:00
< ? php
2010-01-15 23:11:12 +01:00
$blogs = get_blogs_of_user ( $current_user -> ID );
2010-01-06 08:50:12 +01:00
if ( ! empty ( $blogs ) ) { ?>
2010-06-11 22:19:35 +02:00
2010-06-10 22:44:54 +02:00
< p >< ? php _e ( 'Sites you are already a member of:' ) ?> </p>
2010-01-06 08:50:12 +01:00
< ul >
< ? php foreach ( $blogs as $blog ) {
2010-05-12 02:45:01 +02:00
$home_url = get_home_url ( $blog -> userblog_id );
echo '<li><a href="' . esc_url ( $home_url ) . '">' . $home_url . '</a></li>' ;
2010-01-06 08:50:12 +01:00
} ?>
</ ul >
< ? php } ?>
2010-01-15 23:11:12 +01:00
2010-04-11 12:41:54 +02:00
< p >< ? php _e ( 'If you’re not going to use a great site domain, leave it for a new user. Now have at it!' ) ?> </p>
2010-01-06 08:50:12 +01:00
< form id = " setupform " method = " post " action = " wp-signup.php " >
< input type = " hidden " name = " stage " value = " gimmeanotherblog " />
2013-09-24 17:50:06 +02:00
< ? php
/**
2013-09-29 01:41:07 +02:00
* Hidden sign - up form fields output when creating another site or user .
2013-09-24 17:50:06 +02:00
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2013-09-24 17:50:06 +02:00
*
2013-09-29 01:41:07 +02:00
* @ param string $context A string describing the steps of the sign - up process . The value can be
2013-09-24 17:50:06 +02:00
* 'create-another-site' , 'validate-user' , or 'validate-site' .
*/
do_action ( 'signup_hidden_fields' , 'create-another-site' );
?>
2010-01-06 08:50:12 +01:00
< ? php show_blog_form ( $blogname , $blog_title , $errors ); ?>
2010-10-29 02:31:27 +02:00
< p class = " submit " >< input type = " submit " name = " submit " class = " submit " value = " <?php esc_attr_e( 'Create Site' ) ?> " /></ p >
2010-01-06 08:50:12 +01:00
</ form >
< ? php
}
2013-01-31 04:13:22 +01:00
/**
2016-01-28 04:50:26 +01:00
* Validate a new site signup .
2013-01-31 04:13:22 +01:00
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2013-01-31 04:13:22 +01:00
*
2016-01-28 04:50:26 +01:00
* @ return null | bool True if site signup was validated , false if error .
2015-06-27 03:02:12 +02:00
* The function halts all execution if the user is not logged in .
2013-01-31 04:13:22 +01:00
*/
2010-01-06 08:50:12 +01:00
function validate_another_blog_signup () {
2017-08-12 15:10:24 +02:00
global $blogname , $blog_title , $errors , $domain , $path ;
2010-01-06 08:50:12 +01:00
$current_user = wp_get_current_user ();
2014-11-30 22:22:07 +01:00
if ( ! is_user_logged_in () ) {
2010-01-06 08:50:12 +01:00
die ();
2014-11-30 22:22:07 +01:00
}
2010-01-06 08:50:12 +01:00
$result = validate_blog_form ();
2014-05-16 16:42:25 +02:00
2014-07-17 11:11:46 +02:00
// Extracted values set/overwrite globals.
2014-05-16 16:42:25 +02:00
$domain = $result [ 'domain' ];
$path = $result [ 'path' ];
$blogname = $result [ 'blogname' ];
$blog_title = $result [ 'blog_title' ];
$errors = $result [ 'errors' ];
2010-01-06 08:50:12 +01:00
if ( $errors -> get_error_code () ) {
signup_another_blog ( $blogname , $blog_title , $errors );
return false ;
}
$public = ( int ) $_POST [ 'blog_public' ];
2013-09-29 01:41:07 +02:00
$blog_meta_defaults = array (
'lang_id' => 1 ,
'public' => $public
);
2015-10-14 01:45:14 +02:00
// Handle the language setting for the new site.
if ( ! empty ( $_POST [ 'WPLANG' ] ) ) {
$languages = signup_get_available_languages ();
if ( in_array ( $_POST [ 'WPLANG' ], $languages ) ) {
$language = wp_unslash ( sanitize_text_field ( $_POST [ 'WPLANG' ] ) );
if ( $language ) {
$blog_meta_defaults [ 'WPLANG' ] = $language ;
}
}
}
2013-09-29 01:41:07 +02:00
/**
2016-05-23 18:43:20 +02:00
* Filters the new site meta variables .
2013-09-29 01:41:07 +02:00
*
2016-05-23 19:06:40 +02:00
* Use the { @ see 'add_signup_meta' } filter instead .
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2016-05-23 19:06:40 +02:00
* @ deprecated 3.0 . 0 Use the { @ see 'add_signup_meta' } filter instead .
2013-09-29 01:41:07 +02:00
*
* @ param array $blog_meta_defaults An array of default blog meta variables .
*/
2014-05-16 16:42:25 +02:00
$meta_defaults = apply_filters ( 'signup_create_blog_meta' , $blog_meta_defaults );
2015-10-14 01:45:14 +02:00
2013-09-29 01:41:07 +02:00
/**
2016-05-23 18:43:20 +02:00
* Filters the new default site meta variables .
2013-09-29 01:41:07 +02:00
*
* @ since 3.0 . 0
*
* @ param array $meta {
* An array of default site meta variables .
*
* @ type int $lang_id The language ID .
* @ type int $blog_public Whether search engines should be discouraged from indexing the site . 1 for true , 0 for false .
* }
*/
2014-05-16 16:42:25 +02:00
$meta = apply_filters ( 'add_signup_meta' , $meta_defaults );
2010-01-06 08:50:12 +01:00
2017-08-12 15:10:24 +02:00
$blog_id = wpmu_create_blog ( $domain , $path , $blog_title , $current_user -> ID , $meta , get_current_network_id () );
2015-10-03 02:33:47 +02:00
if ( is_wp_error ( $blog_id ) ) {
return false ;
}
confirm_another_blog_signup ( $domain , $path , $blog_title , $current_user -> user_login , $current_user -> user_email , $meta , $blog_id );
2010-01-06 08:50:12 +01:00
return true ;
}
2013-01-31 04:13:22 +01:00
/**
2016-01-28 04:50:26 +01:00
* Confirm a new site signup .
2013-01-31 04:13:22 +01:00
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2015-10-03 02:33:47 +02:00
* @ since 4.4 . 0 Added the `$blog_id` parameter .
2013-01-31 04:13:22 +01:00
*
2016-01-28 04:50:26 +01:00
* @ param string $domain The domain URL .
* @ param string $path The site root path .
* @ param string $blog_title The site title .
* @ param string $user_name The username .
* @ param string $user_email The user ' s email address .
2016-05-23 19:06:40 +02:00
* @ param array $meta Any additional meta from the { @ see 'add_signup_meta' } filter in validate_blog_signup () .
2016-01-28 04:50:26 +01:00
* @ param int $blog_id The site ID .
2013-01-31 04:13:22 +01:00
*/
2015-10-03 02:33:47 +02:00
function confirm_another_blog_signup ( $domain , $path , $blog_title , $user_name , $user_email = '' , $meta = array (), $blog_id = 0 ) {
if ( $blog_id ) {
switch_to_blog ( $blog_id );
$home_url = home_url ( '/' );
$login_url = wp_login_url ();
restore_current_blog ();
} else {
$home_url = 'http://' . $domain . $path ;
$login_url = 'http://' . $domain . $path . 'wp-login.php' ;
}
$site = sprintf ( '<a href="%1$s">%2$s</a>' ,
esc_url ( $home_url ),
$blog_title
);
2010-01-06 08:50:12 +01:00
?>
2016-05-24 22:43:23 +02:00
< h2 >< ? php
/* translators: %s: site name */
printf ( __ ( 'The site %s is yours.' ), $site );
?> </h2>
2010-01-06 08:50:12 +01:00
< p >
2015-10-03 02:33:47 +02:00
< ? php printf (
2016-05-24 22:43:23 +02:00
/* translators: 1: home URL, 2: site address, 3: login URL, 4: username */
2015-10-03 02:33:47 +02:00
__ ( '<a href="%1$s">%2$s</a> is your new site. <a href="%3$s">Log in</a> as “%4$s” using your existing password.' ),
esc_url ( $home_url ),
untrailingslashit ( $domain . $path ),
esc_url ( $login_url ),
$user_name
); ?>
2010-01-06 08:50:12 +01:00
</ p >
< ? php
2013-09-29 01:41:07 +02:00
/**
* Fires when the site or user sign - up process is complete .
*
* @ since 3.0 . 0
*/
2010-04-11 12:41:54 +02:00
do_action ( 'signup_finished' );
2010-01-06 08:50:12 +01:00
}
2013-01-31 04:13:22 +01:00
/**
* Setup the new user signup process
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2013-01-31 04:13:22 +01:00
*
2016-05-24 06:15:57 +02:00
* @ 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 .
2013-01-31 04:13:22 +01:00
*/
2013-11-13 04:22:48 +01:00
function signup_user ( $user_name = '' , $user_email = '' , $errors = '' ) {
global $active_signup ;
2010-01-06 08:50:12 +01:00
if ( ! is_wp_error ( $errors ) )
$errors = new WP_Error ();
2010-03-17 17:27:25 +01:00
2012-02-07 18:12:46 +01:00
$signup_for = isset ( $_POST [ 'signup_for' ] ) ? esc_html ( $_POST [ 'signup_for' ] ) : 'blog' ;
2010-01-06 08:50:12 +01:00
2013-09-29 01:41:07 +02:00
$signup_user_defaults = array (
'user_name' => $user_name ,
'user_email' => $user_email ,
'errors' => $errors ,
);
/**
2016-05-23 18:43:20 +02:00
* Filters the default user variables used on the user sign - up form .
2013-09-29 01:41:07 +02:00
*
* @ since 3.0 . 0
*
* @ param array $signup_user_defaults {
* An array of default user variables .
*
2016-05-24 06:15:57 +02:00
* @ 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 .
2013-09-29 01:41:07 +02:00
* }
*/
$filtered_results = apply_filters ( 'signup_user_init' , $signup_user_defaults );
2010-01-06 08:50:12 +01:00
$user_name = $filtered_results [ 'user_name' ];
$user_email = $filtered_results [ 'user_email' ];
$errors = $filtered_results [ 'errors' ];
?>
2010-01-15 23:11:12 +01:00
2016-05-24 22:43:23 +02:00
< h2 >< ? php
/* translators: %s: name of the network */
2016-10-19 06:46:14 +02:00
printf ( __ ( 'Get your own %s account in seconds' ), get_network () -> site_name );
2016-05-24 22:43:23 +02:00
?> </h2>
2014-07-08 19:51:58 +02:00
< form id = " setupform " method = " post " action = " wp-signup.php " novalidate = " novalidate " >
2010-01-06 08:50:12 +01:00
< input type = " hidden " name = " stage " value = " validate-user-signup " />
2013-09-24 17:50:06 +02:00
< ? php
2013-10-22 19:21:32 +02:00
/** This action is documented in wp-signup.php */
2013-09-24 17:50:06 +02:00
do_action ( 'signup_hidden_fields' , 'validate-user' );
?>
2010-01-06 08:50:12 +01:00
< ? php show_user_form ( $user_name , $user_email , $errors ); ?>
2010-01-15 23:11:12 +01:00
2010-01-06 08:50:12 +01:00
< p >
2010-01-16 00:40:29 +01:00
< ? php if ( $active_signup == 'blog' ) { ?>
2010-01-06 08:50:12 +01:00
< input id = " signupblog " type = " hidden " name = " signup_for " value = " blog " />
2010-01-16 00:40:29 +01:00
< ? php } elseif ( $active_signup == 'user' ) { ?>
2010-01-06 08:50:12 +01:00
< input id = " signupblog " type = " hidden " name = " signup_for " value = " user " />
< ? php } else { ?>
2012-02-07 18:12:46 +01:00
< input id = " signupblog " type = " radio " name = " signup_for " value = " blog " < ? php checked ( $signup_for , 'blog' ); ?> />
2010-02-24 21:45:02 +01:00
< label class = " checkbox " for = " signupblog " >< ? php _e ( 'Gimme a site!' ) ?> </label>
2010-01-15 23:11:12 +01:00
< br />
2012-02-07 18:12:46 +01:00
< input id = " signupuser " type = " radio " name = " signup_for " value = " user " < ? php checked ( $signup_for , 'user' ); ?> />
2010-01-06 08:50:12 +01:00
< label class = " checkbox " for = " signupuser " >< ? php _e ( 'Just a username, please.' ) ?> </label>
< ? php } ?>
</ p >
2010-01-15 23:11:12 +01:00
2010-10-29 02:31:27 +02:00
< p class = " submit " >< input type = " submit " name = " submit " class = " submit " value = " <?php esc_attr_e('Next') ?> " /></ p >
2010-01-06 08:50:12 +01:00
</ form >
< ? php
}
2013-01-31 04:13:22 +01:00
/**
* Validate the new user signup
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2013-01-31 04:13:22 +01:00
*
* @ return bool True if new user signup was validated , false if error
*/
2010-01-06 08:50:12 +01:00
function validate_user_signup () {
$result = validate_user_form ();
2014-05-16 16:46:25 +02:00
$user_name = $result [ 'user_name' ];
2014-05-16 16:52:04 +02:00
$user_email = $result [ 'user_email' ];
2014-05-16 16:46:25 +02:00
$errors = $result [ 'errors' ];
2010-01-06 08:50:12 +01:00
if ( $errors -> get_error_code () ) {
signup_user ( $user_name , $user_email , $errors );
return false ;
}
if ( 'blog' == $_POST [ 'signup_for' ] ) {
signup_blog ( $user_name , $user_email );
return false ;
}
2013-10-22 19:21:32 +02:00
/** This filter is documented in wp-signup.php */
2013-09-29 01:41:07 +02:00
wpmu_signup_user ( $user_name , $user_email , apply_filters ( 'add_signup_meta' , array () ) );
2010-01-06 08:50:12 +01:00
confirm_user_signup ( $user_name , $user_email );
return true ;
}
2013-01-31 04:13:22 +01:00
/**
* New user signup confirmation
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2013-01-31 04:13:22 +01:00
*
* @ param string $user_name The username
* @ param string $user_email The user ' s email address
*/
2010-01-06 08:50:12 +01:00
function confirm_user_signup ( $user_name , $user_email ) {
?>
2015-10-30 09:51:24 +01:00
< h2 >< ? php /* translators: %s: username */
printf ( __ ( '%s is your new username' ), $user_name ) ?> </h2>
2010-04-11 12:41:54 +02:00
< p >< ? php _e ( 'But, before you can start using your new username, <strong>you must activate it</strong>.' ) ?> </p>
2015-10-30 09:51:24 +01:00
< p >< ? php /* translators: %s: email address */
printf ( __ ( 'Check your inbox at %s and click the link given.' ), '<strong>' . $user_email . '</strong>' ); ?> </p>
2010-04-11 12:41:54 +02:00
< p >< ? php _e ( 'If you do not activate your username within two days, you will have to sign up again.' ); ?> </p>
2010-01-06 08:50:12 +01:00
< ? php
2013-10-22 19:21:32 +02:00
/** This action is documented in wp-signup.php */
2010-04-11 12:41:54 +02:00
do_action ( 'signup_finished' );
2010-01-06 08:50:12 +01:00
}
2013-01-31 04:13:22 +01:00
/**
* Setup the new site signup
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2013-01-31 04:13:22 +01:00
*
2016-05-24 06:15:57 +02:00
* @ 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 .
2013-01-31 04:13:22 +01:00
*/
2010-01-06 08:50:12 +01:00
function signup_blog ( $user_name = '' , $user_email = '' , $blogname = '' , $blog_title = '' , $errors = '' ) {
if ( ! is_wp_error ( $errors ) )
$errors = new WP_Error ();
2013-09-29 01:41:07 +02:00
$signup_blog_defaults = array (
'user_name' => $user_name ,
'user_email' => $user_email ,
'blogname' => $blogname ,
'blog_title' => $blog_title ,
'errors' => $errors
);
/**
2016-05-23 18:43:20 +02:00
* Filters the default site creation variables for the site sign - up form .
2013-09-29 01:41:07 +02:00
*
* @ since 3.0 . 0
*
* @ param array $signup_blog_defaults {
* An array of default site creation variables .
*
2016-05-24 06:15:57 +02:00
* @ 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 .
2013-09-29 01:41:07 +02:00
* }
*/
$filtered_results = apply_filters ( 'signup_blog_init' , $signup_blog_defaults );
2010-01-06 08:50:12 +01:00
$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 ) )
$blogname = $user_name ;
?>
< form id = " setupform " method = " post " action = " wp-signup.php " >
< input type = " hidden " name = " stage " value = " validate-blog-signup " />
2010-01-07 04:40:03 +01:00
< 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 ) ?> " />
2013-09-24 17:50:06 +02:00
< ? php
2013-10-22 19:21:32 +02:00
/** This action is documented in wp-signup.php */
2013-09-24 17:50:06 +02:00
do_action ( 'signup_hidden_fields' , 'validate-site' );
?>
2010-01-06 08:50:12 +01:00
< ? php show_blog_form ( $blogname , $blog_title , $errors ); ?>
2010-10-29 02:31:27 +02:00
< p class = " submit " >< input type = " submit " name = " submit " class = " submit " value = " <?php esc_attr_e('Signup') ?> " /></ p >
2010-01-06 08:50:12 +01:00
</ form >
< ? php
}
2013-01-31 04:13:22 +01:00
/**
* Validate new site signup
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2013-01-31 04:13:22 +01:00
*
* @ return bool True if the site signup was validated , false if error
*/
2010-01-06 08:50:12 +01:00
function validate_blog_signup () {
// Re-validate user info.
2014-05-16 16:52:04 +02:00
$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' ];
2010-01-06 08:50:12 +01:00
2014-05-16 16:52:04 +02:00
if ( $user_errors -> get_error_code () ) {
signup_user ( $user_name , $user_email , $user_errors );
2010-01-06 08:50:12 +01:00
return false ;
}
2014-05-16 16:52:04 +02:00
$result = wpmu_validate_blog_signup ( $_POST [ 'blogname' ], $_POST [ 'blog_title' ] );
$domain = $result [ 'domain' ];
$path = $result [ 'path' ];
$blogname = $result [ 'blogname' ];
$blog_title = $result [ 'blog_title' ];
$errors = $result [ 'errors' ];
2010-01-06 08:50:12 +01:00
if ( $errors -> get_error_code () ) {
signup_blog ( $user_name , $user_email , $blogname , $blog_title , $errors );
return false ;
}
$public = ( int ) $_POST [ 'blog_public' ];
2014-05-16 16:52:04 +02:00
$signup_meta = array ( 'lang_id' => 1 , 'public' => $public );
2013-09-29 01:41:07 +02:00
2015-10-14 01:45:14 +02:00
// Handle the language setting for the new site.
if ( ! empty ( $_POST [ 'WPLANG' ] ) ) {
$languages = signup_get_available_languages ();
if ( in_array ( $_POST [ 'WPLANG' ], $languages ) ) {
$language = wp_unslash ( sanitize_text_field ( $_POST [ 'WPLANG' ] ) );
if ( $language ) {
$signup_meta [ 'WPLANG' ] = $language ;
}
}
}
2013-10-22 19:21:32 +02:00
/** This filter is documented in wp-signup.php */
2014-05-16 16:52:04 +02:00
$meta = apply_filters ( 'add_signup_meta' , $signup_meta );
2010-01-06 08:50:12 +01:00
wpmu_signup_blog ( $domain , $path , $blog_title , $user_name , $user_email , $meta );
confirm_blog_signup ( $domain , $path , $blog_title , $user_name , $user_email , $meta );
return true ;
}
2013-01-31 04:13:22 +01:00
/**
* New site signup confirmation
*
2017-08-01 22:43:25 +02:00
* @ since MU ( 3.0 . 0 )
2013-01-31 04:13:22 +01:00
*
* @ param string $domain The domain URL
* @ param string $path The site root path
* @ param string $blog_title The new site title
* @ param string $user_name The user ' s username
* @ param string $user_email The user ' s email address
2016-05-23 19:06:40 +02:00
* @ param array $meta Any additional meta from the { @ see 'add_signup_meta' } filter in validate_blog_signup ()
2013-01-31 04:13:22 +01:00
*/
2013-04-29 15:26:31 +02:00
function confirm_blog_signup ( $domain , $path , $blog_title , $user_name = '' , $user_email = '' , $meta = array () ) {
2010-01-06 08:50:12 +01:00
?>
2015-10-30 09:51:24 +01:00
< h2 >< ? php /* translators: %s: site address */
printf ( __ ( 'Congratulations! Your new site, %s, is almost ready.' ), " <a href='http:// { $domain } { $path } '> { $blog_title } </a> " ) ?> </h2>
2010-01-15 23:11:12 +01:00
2010-04-11 12:41:54 +02:00
< p >< ? php _e ( 'But, before you can start using your site, <strong>you must activate it</strong>.' ) ?> </p>
2015-10-30 09:51:24 +01:00
< p >< ? php /* translators: %s: email address */
printf ( __ ( 'Check your inbox at %s and click the link given.' ), '<strong>' . $user_email . '</strong>' ); ?> </p>
2010-04-11 12:41:54 +02:00
< 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>
2010-01-06 08:50:12 +01:00
< p >
2010-04-11 12:41:54 +02:00
< ? php _e ( 'If you haven’t received your email yet, there are a number of things you can do:' ) ?>
2010-01-06 08:50:12 +01:00
< ul id = " noemail-tips " >
2010-05-12 02:45:01 +02:00
< 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>
2016-05-24 22:43:23 +02:00
< li >< ? php
/* 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 );
?> </li>
2010-01-06 08:50:12 +01:00
</ ul >
</ p >
< ? php
2013-10-22 19:21:32 +02:00
/** This action is documented in wp-signup.php */
2010-04-11 12:41:54 +02:00
do_action ( 'signup_finished' );
2010-01-06 08:50:12 +01:00
}
2015-10-14 01:45:14 +02:00
/**
* Retrieves languages available during the site / user signup process .
*
* @ since 4.4 . 0
*
* @ see get_available_languages ()
*
* @ return array List of available languages .
*/
function signup_get_available_languages () {
/**
2016-05-23 18:43:20 +02:00
* Filters the list of available languages for front - end site signups .
2015-10-14 01:45:14 +02:00
*
* 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 .
*
* @ since 4.4 . 0
*
* @ 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 () );
}
2010-01-06 08:50:12 +01:00
// Main
2015-10-07 19:11:01 +02:00
$active_signup = get_site_option ( 'registration' , 'none' );
2016-05-23 18:43:20 +02:00
2013-09-29 01:41:07 +02:00
/**
2016-05-23 18:43:20 +02:00
* Filters the type of site sign - up .
2013-09-29 01:41:07 +02:00
*
* @ since 3.0 . 0
*
* @ 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 );
2010-01-06 08:50:12 +01:00
2017-01-24 12:07:15 +01:00
if ( current_user_can ( 'manage_network' ) ) {
2017-01-20 17:51:59 +01:00
echo '<div class="mu_alert">' ;
_e ( 'Greetings Network Administrator!' );
echo ' ' ;
switch ( $active_signup ) {
case 'none' :
_e ( 'The network currently disallows registrations.' );
break ;
case 'blog' :
_e ( 'The network currently allows site registrations.' );
break ;
case 'user' :
_e ( 'The network currently allows user registrations.' );
break ;
default :
_e ( 'The network currently allows both site and user registrations.' );
break ;
}
echo ' ' ;
/* translators: %s: network settings URL */
printf ( __ ( 'To change or disable registration go to your <a href="%s">Options page</a>.' ), esc_url ( network_admin_url ( 'settings.php' ) ) );
echo '</div>' ;
2016-05-24 22:43:23 +02:00
}
2010-01-06 08:50:12 +01:00
$newblogname = isset ( $_GET [ 'new' ]) ? strtolower ( preg_replace ( '/^-|-$|[^-a-zA-Z0-9]/' , '' , $_GET [ 'new' ])) : null ;
$current_user = wp_get_current_user ();
2011-05-23 00:30:05 +02:00
if ( $active_signup == 'none' ) {
2010-04-11 12:41:54 +02:00
_e ( 'Registration has been disabled.' );
2010-01-16 00:40:29 +01:00
} elseif ( $active_signup == 'blog' && ! is_user_logged_in () ) {
2015-09-15 19:10:24 +02:00
$login_url = wp_login_url ( network_site_url ( 'wp-signup.php' ) );
2016-05-24 22:43:23 +02:00
/* translators: %s: login URL */
printf ( __ ( 'You must first <a href="%s">log in</a>, and then you can create a new site.' ), $login_url );
2010-01-06 08:50:12 +01:00
} else {
2010-03-04 19:38:39 +01:00
$stage = isset ( $_POST [ 'stage' ] ) ? $_POST [ 'stage' ] : 'default' ;
switch ( $stage ) {
2010-01-06 08:50:12 +01:00
case 'validate-user-signup' :
2010-01-18 21:34:48 +01:00
if ( $active_signup == 'all' || $_POST [ 'signup_for' ] == 'blog' && $active_signup == 'blog' || $_POST [ 'signup_for' ] == 'user' && $active_signup == 'user' )
2010-01-06 08:50:12 +01:00
validate_user_signup ();
else
2010-04-11 12:41:54 +02:00
_e ( 'User registration has been disabled.' );
2010-01-06 08:50:12 +01:00
break ;
case 'validate-blog-signup' :
2010-01-16 00:40:29 +01:00
if ( $active_signup == 'all' || $active_signup == 'blog' )
2010-01-06 08:50:12 +01:00
validate_blog_signup ();
else
2010-04-11 12:41:54 +02:00
_e ( 'Site registration has been disabled.' );
2010-01-06 08:50:12 +01:00
break ;
case 'gimmeanotherblog' :
validate_another_blog_signup ();
break ;
2010-03-04 19:38:39 +01:00
case 'default' :
2010-01-06 08:50:12 +01:00
default :
2010-03-04 19:38:39 +01:00
$user_email = isset ( $_POST [ 'user_email' ] ) ? $_POST [ 'user_email' ] : '' ;
2013-09-29 01:41:07 +02:00
/**
* Fires when the site sign - up form is sent .
*
* @ since 3.0 . 0
*/
do_action ( 'preprocess_signup_form' );
2010-01-16 00:40:29 +01:00
if ( is_user_logged_in () && ( $active_signup == 'all' || $active_signup == 'blog' ) )
2010-01-06 08:50:12 +01:00
signup_another_blog ( $newblogname );
2015-06-12 19:47:16 +02:00
elseif ( ! is_user_logged_in () && ( $active_signup == 'all' || $active_signup == 'user' ) )
2010-01-06 08:50:12 +01:00
signup_user ( $newblogname , $user_email );
2015-06-12 19:47:16 +02:00
elseif ( ! is_user_logged_in () && ( $active_signup == 'blog' ) )
2010-05-12 02:45:01 +02:00
_e ( 'Sorry, new registrations are not allowed at this time.' );
2010-01-16 00:40:29 +01:00
else
2010-04-11 12:41:54 +02:00
_e ( 'You are logged in already. No need to register again!' );
2010-01-16 00:40:29 +01:00
2010-05-17 00:36:58 +02:00
if ( $newblogname ) {
$newblog = get_blogaddress_by_name ( $newblogname );
2010-01-16 00:40:29 +01:00
if ( $active_signup == 'blog' || $active_signup == 'all' )
2015-10-30 03:08:03 +01:00
/* translators: %s: site address */
printf ( '<p><em>' . __ ( 'The site you were looking for, %s, does not exist, but you can create it now!' ) . '</em></p>' ,
'<strong>' . $newblog . '</strong>'
);
2010-01-06 08:50:12 +01:00
else
2015-10-30 03:08:03 +01:00
/* translators: %s: site address */
printf ( '<p><em>' . __ ( 'The site you were looking for, %s, does not exist.' ) . '</em></p>' ,
'<strong>' . $newblog . '</strong>'
);
2010-01-06 08:50:12 +01:00
}
break ;
}
}
?>
</ div >
</ div >
2013-09-29 01:41:07 +02:00
< ? php
/**
* Fires after the sign - up forms , before wp_footer .
*
* @ since 3.0 . 0
*/
do_action ( 'after_signup_form' ); ?>
2010-01-06 08:50:12 +01:00
2015-10-06 00:35:20 +02:00
< ? php get_footer ( 'wp-signup' );