Ticket #41333: 41333.diff
File 41333.diff, 20.6 KB (added by , 6 years ago) |
---|
-
src/wp-admin/includes/ms.php
119 119 } 120 120 121 121 if ( $drop ) { 122 $uploads = wp_get_upload_dir();123 124 $tables = $wpdb->tables( 'blog' );125 /**126 * Filters the tables to drop when the site is deleted.127 *128 * @since MU (3.0.0)129 *130 * @param string[] $tables Array of names of the site tables to be dropped.131 * @param int $blog_id The ID of the site to drop tables for.132 */133 $drop_tables = apply_filters( 'wpmu_drop_tables', $tables, $blog_id );134 135 foreach ( (array) $drop_tables as $table ) {136 $wpdb->query( "DROP TABLE IF EXISTS `$table`" );137 }138 139 if ( is_site_meta_supported() ) {140 $blog_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->blogmeta WHERE blog_id = %d ", $blog_id ) );141 foreach ( $blog_meta_ids as $mid ) {142 delete_metadata_by_mid( 'blog', $mid );143 }144 }145 146 122 wp_delete_site( $blog_id ); 147 148 /**149 * Filters the upload base directory to delete when the site is deleted.150 *151 * @since MU (3.0.0)152 *153 * @param string $uploads['basedir'] Uploads path without subdirectory. @see wp_upload_dir()154 * @param int $blog_id The site ID.155 */156 $dir = apply_filters( 'wpmu_delete_blog_upload_dir', $uploads['basedir'], $blog_id );157 $dir = rtrim( $dir, DIRECTORY_SEPARATOR );158 $top_dir = $dir;159 $stack = array( $dir );160 $index = 0;161 162 while ( $index < count( $stack ) ) {163 // Get indexed directory from stack164 $dir = $stack[ $index ];165 166 $dh = @opendir( $dir );167 if ( $dh ) {168 while ( ( $file = @readdir( $dh ) ) !== false ) {169 if ( $file == '.' || $file == '..' ) {170 continue;171 }172 173 if ( @is_dir( $dir . DIRECTORY_SEPARATOR . $file ) ) {174 $stack[] = $dir . DIRECTORY_SEPARATOR . $file;175 } elseif ( @is_file( $dir . DIRECTORY_SEPARATOR . $file ) ) {176 @unlink( $dir . DIRECTORY_SEPARATOR . $file );177 }178 }179 @closedir( $dh );180 }181 $index++;182 }183 184 $stack = array_reverse( $stack ); // Last added dirs are deepest185 foreach ( (array) $stack as $dir ) {186 if ( $dir != $top_dir ) {187 @rmdir( $dir );188 }189 }190 191 clean_blog_cache( $blog );192 123 } 193 124 194 125 /** -
src/wp-admin/includes/schema.php
356 356 * Create WordPress options and set the default values. 357 357 * 358 358 * @since 1.5.0 359 * @since 5.0.0 The $options parameter has been added. 359 360 * 360 361 * @global wpdb $wpdb WordPress database abstraction object. 361 362 * @global int $wp_db_version 362 363 * @global int $wp_current_db_version 364 * 365 * @param array $options Optional. Custom option $key => $value pairs to use. Default empty array. 363 366 */ 364 function populate_options( ) {367 function populate_options( array $options = array() ) { 365 368 global $wpdb, $wp_db_version, $wp_current_db_version; 366 369 367 370 $guessurl = wp_guess_url(); … … 406 409 $timezone_string = $offset_or_tz; 407 410 } 408 411 409 $options = array(412 $options = wp_parse_args( $options, array( 410 413 'siteurl' => $guessurl, 411 414 'home' => $guessurl, 412 415 'blogname' => __( 'My Site' ), … … 538 541 539 542 // 4.9.8 540 543 'show_comments_cookies_opt_in' => 0, 541 ) ;544 ) ); 542 545 543 546 // 3.3 544 547 if ( ! is_multisite() ) { -
src/wp-includes/ms-blogs.php
442 442 'lang_id' => 0, 443 443 ); 444 444 445 // Extract the passed arguments that may be relevant for site installation. 446 $args = array_diff_key( $data, $defaults ); 447 if ( isset( $args['site_id'] ) ) { 448 unset( $args['site_id'] ); 449 } 450 445 451 $data = wp_prepare_site_data( $data, $defaults ); 446 452 if ( is_wp_error( $data ) ) { 447 453 return $data; … … 455 461 456 462 clean_blog_cache( $new_site ); 457 463 464 remove_action( 'update_blog_public', 'wp_update_blog_public_option_on_site_update', 1 ); 465 458 466 /** 459 467 * Fires once a site has been inserted into the database. 460 468 * … … 464 472 */ 465 473 do_action( 'wp_insert_site', $new_site ); 466 474 475 add_action( 'update_blog_public', 'wp_update_blog_public_option_on_site_update', 1, 2 ); 476 477 /** 478 * Fires when a site's installation routine should be executed. 479 * 480 * @since 5.0.0 481 * 482 * @param WP_Site $new_site New site object. 483 * @param array $args Arguments for the installation. 484 */ 485 do_action( 'wp_install_site', $new_site, $args ); 486 467 487 return (int) $new_site->id; 468 488 } 469 489 … … 543 563 return new WP_Error( 'site_not_exist', __( 'Site does not exist.' ) ); 544 564 } 545 565 566 /** 567 * Fires when a site's uninstallation routine should be executed. 568 * 569 * @since 5.0.0 570 * 571 * @param WP_Site $old_site Deleted site object. 572 */ 573 do_action( 'wp_uninstall_site', $old_site ); 574 575 if ( is_site_meta_supported() ) { 576 $blog_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->blogmeta WHERE blog_id = %d ", $old_site->id ) ); 577 foreach ( $blog_meta_ids as $mid ) { 578 delete_metadata_by_mid( 'blog', $mid ); 579 } 580 } 581 546 582 if ( false === $wpdb->delete( $wpdb->blogs, array( 'blog_id' => $old_site->id ) ) ) { 547 583 return new WP_Error( 'db_delete_error', __( 'Could not delete site from the database.' ), $wpdb->last_error ); 548 584 } … … 913 949 } 914 950 915 951 /** 952 * Runs the installation routine for a given site. 953 * 954 * This process includes creating the site's database tables and 955 * populating them with defaults. 956 * 957 * @since 5.0.0 958 * 959 * @global wpdb $wpdb WordPress database abstraction object. 960 * @global WP_Roles $wp_roles WordPress role management object. 961 * 962 * @param int|WP_Site $site_id Site ID or object. 963 * @param array $args { 964 * Optional. Arguments to modify the installation behavior. 965 * 966 * @type int $user_id Required. User ID for the site administrator. 967 * @type string $title Site title. Default is 'Site %d' where %d is the 968 * site ID. 969 * @type array $options Custom option $key => $value pairs to use. Default 970 * empty array. 971 * } 972 * @return bool|WP_Error True on success, or error object on failure. 973 */ 974 function wp_install_site( $site_id, array $args = array() ) { 975 global $wpdb, $wp_roles; 976 977 if ( empty( $site_id ) ) { 978 return new WP_Error( 'site_empty_id', __( 'Site ID must not be empty.' ) ); 979 } 980 981 $site = get_site( $site_id ); 982 if ( ! $site ) { 983 return new WP_Error( 'site_invalid_id', __( 'Site with the ID does not exist.' ) ); 984 } 985 986 $network = get_network( $site->network_id ); 987 if ( ! $network ) { 988 $network = get_network(); 989 } 990 991 $args = wp_parse_args( $args, array( 992 'user_id' => 0, 993 /* translators: %d: site ID */ 994 'title' => sprintf( __( 'Site %d' ), $site->id ), 995 'options' => array(), 996 ) ); 997 998 if ( empty( $args['user_id'] ) ) { 999 return new WP_Error( 'site_empty_user_id', __( 'A user ID must be specified for the site administrator.' ) ); 1000 } 1001 1002 if ( ! wp_installing() ) { 1003 wp_installing( true ); 1004 } 1005 1006 switch_to_blog( $site->id ); 1007 1008 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); 1009 1010 $suppress = $wpdb->suppress_errors(); 1011 if ( $wpdb->get_results( "DESCRIBE {$wpdb->posts}" ) ) { 1012 $wpdb->suppress_errors( $suppress ); 1013 restore_current_blog(); 1014 return new WP_Error( 'site_already_installed', __( 'Database tables for the site appear to be already installed.' ) ); 1015 } 1016 $wpdb->suppress_errors( $suppress ); 1017 1018 // Set up the database tables. 1019 make_db_current_silent( 'blog' ); 1020 1021 $home_scheme = 'http'; 1022 $siteurl_scheme = 'http'; 1023 if ( ! is_subdomain_install() ) { 1024 if ( 'https' === parse_url( get_home_url( $network->site_id ), PHP_URL_SCHEME ) ) { 1025 $home_scheme = 'https'; 1026 } 1027 if ( 'https' === parse_url( get_network_option( $network->id, 'siteurl' ), PHP_URL_SCHEME ) ) { 1028 $siteurl_scheme = 'https'; 1029 } 1030 } 1031 1032 // Populate the site's options. 1033 populate_options( array( 1034 'home' => untrailingslashit( $home_scheme . '://' . $site->domain . $site->path ), 1035 'siteurl' => untrailingslashit( $siteurl_scheme . '://' . $site->domain . $site->path ), 1036 'blogname' => wp_unslash( $args['title'] ), 1037 'admin_email' => '', 1038 'upload_path' => get_network_option( $network->id, 'ms_files_rewriting' ) ? UPLOADBLOGSDIR . "/{$site->id}/files" : get_blog_option( $network->site_id, 'upload_path' ), 1039 'blog_public' => (int) $site->public, 1040 'WPLANG' => get_network_option( $network->id, 'WPLANG' ), 1041 ) ); 1042 1043 // Populate the site's roles. 1044 populate_roles(); 1045 $wp_roles = new WP_Roles(); 1046 1047 // Remove all permissions that may exist for the site. 1048 $table_prefix = $wpdb->get_blog_prefix(); 1049 delete_metadata( 'user', 0, $table_prefix . 'user_level', null, true ); // delete all 1050 delete_metadata( 'user', 0, $table_prefix . 'capabilities', null, true ); // delete all 1051 1052 // Install default site content. 1053 wp_install_defaults( $args['user_id'] ); 1054 1055 // Set the site administrator. 1056 add_user_to_blog( $site->id, $args['user_id'], 'administrator' ); 1057 if ( ! user_can( $args['user_id'], 'manage_network' ) && ! get_user_meta( $args['user_id'], 'primary_blog', true ) ) { 1058 update_user_meta( $args['user_id'], 'primary_blog', $site->id ); 1059 } 1060 1061 // Override any specified options with custom values. 1062 foreach ( $args['options'] as $key => $value ) { 1063 update_option( $key, $value ); 1064 } 1065 1066 restore_current_blog(); 1067 1068 return true; 1069 } 1070 1071 /** 1072 * Runs the uninstallation routine for a given site. 1073 * 1074 * This process includes dropping the site's database tables. 1075 * 1076 * @since 5.0.0 1077 * 1078 * @global wpdb $wpdb WordPress database abstraction object. 1079 * 1080 * @param int|WP_Site $site_id Site ID or object. 1081 * @return bool|WP_Error True on success, or error object on failure. 1082 */ 1083 function wp_uninstall_site( $site_id ) { 1084 global $wpdb; 1085 1086 if ( empty( $site_id ) ) { 1087 return new WP_Error( 'site_empty_id', __( 'Site ID must not be empty.' ) ); 1088 } 1089 1090 $site = get_site( $site_id ); 1091 if ( ! $site ) { 1092 return new WP_Error( 'site_invalid_id', __( 'Site with the ID does not exist.' ) ); 1093 } 1094 1095 $users = get_users( array( 1096 'blog_id' => $site->id, 1097 'fields' => 'ids', 1098 ) ); 1099 1100 // Remove users from the site. 1101 if ( ! empty( $users ) ) { 1102 foreach ( $users as $user_id ) { 1103 remove_user_from_blog( $user_id, $site->id ); 1104 } 1105 } 1106 1107 switch_to_blog( $site->id ); 1108 1109 $uploads = wp_get_upload_dir(); 1110 1111 $tables = $wpdb->tables( 'blog' ); 1112 1113 /** 1114 * Filters the tables to drop when the site is deleted. 1115 * 1116 * @since MU (3.0.0) 1117 * 1118 * @param string[] $tables Array of names of the site tables to be dropped. 1119 * @param int $site_id The ID of the site to drop tables for. 1120 */ 1121 $drop_tables = apply_filters( 'wpmu_drop_tables', $tables, $site->id ); 1122 1123 foreach ( (array) $drop_tables as $table ) { 1124 $wpdb->query( "DROP TABLE IF EXISTS `$table`" ); 1125 } 1126 1127 /** 1128 * Filters the upload base directory to delete when the site is deleted. 1129 * 1130 * @since MU (3.0.0) 1131 * 1132 * @param string $uploads['basedir'] Uploads path without subdirectory. @see wp_upload_dir() 1133 * @param int $site_id The site ID. 1134 */ 1135 $dir = apply_filters( 'wpmu_delete_blog_upload_dir', $uploads['basedir'], $site->id ); 1136 $dir = rtrim( $dir, DIRECTORY_SEPARATOR ); 1137 $top_dir = $dir; 1138 $stack = array( $dir ); 1139 $index = 0; 1140 1141 while ( $index < count( $stack ) ) { 1142 // Get indexed directory from stack 1143 $dir = $stack[ $index ]; 1144 1145 $dh = @opendir( $dir ); 1146 if ( $dh ) { 1147 while ( ( $file = @readdir( $dh ) ) !== false ) { 1148 if ( $file == '.' || $file == '..' ) { 1149 continue; 1150 } 1151 1152 if ( @is_dir( $dir . DIRECTORY_SEPARATOR . $file ) ) { 1153 $stack[] = $dir . DIRECTORY_SEPARATOR . $file; 1154 } elseif ( @is_file( $dir . DIRECTORY_SEPARATOR . $file ) ) { 1155 @unlink( $dir . DIRECTORY_SEPARATOR . $file ); 1156 } 1157 } 1158 @closedir( $dh ); 1159 } 1160 $index++; 1161 } 1162 1163 $stack = array_reverse( $stack ); // Last added dirs are deepest 1164 foreach ( (array) $stack as $dir ) { 1165 if ( $dir != $top_dir ) { 1166 @rmdir( $dir ); 1167 } 1168 } 1169 1170 restore_current_blog(); 1171 1172 return true; 1173 } 1174 1175 /** 916 1176 * Retrieve option value for a given blog id based on name of option. 917 1177 * 918 1178 * If the option does not exist or does not have a value, then the return value -
src/wp-includes/ms-default-filters.php
49 49 add_action( 'wp_insert_site', 'wp_maybe_transition_site_statuses_on_update', 10, 1 ); 50 50 add_action( 'wp_update_site', 'wp_maybe_transition_site_statuses_on_update', 10, 2 ); 51 51 add_action( 'wp_update_site', 'wp_maybe_clean_new_site_cache_on_update', 10, 2 ); 52 add_action( 'wp_install_site', 'wp_install_site', 10, 2 ); 53 add_action( 'wp_uninstall_site', 'wp_uninstall_site', 10, 1 ); 52 54 add_action( 'update_blog_public', 'wp_update_blog_public_option_on_site_update', 1, 2 ); 53 55 54 56 // Register Nonce -
src/wp-includes/ms-deprecated.php
580 580 581 581 return $site_id; 582 582 } 583 584 /** 585 * Install an empty blog. 586 * 587 * Creates the new blog tables and options. If calling this function 588 * directly, be sure to use switch_to_blog() first, so that $wpdb 589 * points to the new blog. 590 * 591 * @since MU (3.0.0) 592 * @deprecated 5.0.0 593 * 594 * @global wpdb $wpdb 595 * @global WP_Roles $wp_roles 596 * 597 * @param int $blog_id The value returned by wp_insert_site(). 598 * @param string $blog_title The title of the new site. 599 */ 600 function install_blog( $blog_id, $blog_title = '' ) { 601 global $wpdb, $wp_roles; 602 603 _deprecated_function( __FUNCTION__, '5.0.0' ); 604 605 // Cast for security 606 $blog_id = (int) $blog_id; 607 608 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); 609 610 $suppress = $wpdb->suppress_errors(); 611 if ( $wpdb->get_results( "DESCRIBE {$wpdb->posts}" ) ) { 612 die( '<h1>' . __( 'Already Installed' ) . '</h1><p>' . __( 'You appear to have already installed WordPress. To reinstall please clear your old database tables first.' ) . '</p></body></html>' ); 613 } 614 $wpdb->suppress_errors( $suppress ); 615 616 $url = get_blogaddress_by_id( $blog_id ); 617 618 // Set everything up 619 make_db_current_silent( 'blog' ); 620 populate_options(); 621 populate_roles(); 622 623 // populate_roles() clears previous role definitions so we start over. 624 $wp_roles = new WP_Roles(); 625 626 $siteurl = $home = untrailingslashit( $url ); 627 628 if ( ! is_subdomain_install() ) { 629 630 if ( 'https' === parse_url( get_site_option( 'siteurl' ), PHP_URL_SCHEME ) ) { 631 $siteurl = set_url_scheme( $siteurl, 'https' ); 632 } 633 if ( 'https' === parse_url( get_home_url( get_network()->site_id ), PHP_URL_SCHEME ) ) { 634 $home = set_url_scheme( $home, 'https' ); 635 } 636 } 637 638 update_option( 'siteurl', $siteurl ); 639 update_option( 'home', $home ); 640 641 if ( get_site_option( 'ms_files_rewriting' ) ) { 642 update_option( 'upload_path', UPLOADBLOGSDIR . "/$blog_id/files" ); 643 } else { 644 update_option( 'upload_path', get_blog_option( get_network()->site_id, 'upload_path' ) ); 645 } 646 647 update_option( 'blogname', wp_unslash( $blog_title ) ); 648 update_option( 'admin_email', '' ); 649 650 // remove all perms 651 $table_prefix = $wpdb->get_blog_prefix(); 652 delete_metadata( 'user', 0, $table_prefix . 'user_level', null, true ); // delete all 653 delete_metadata( 'user', 0, $table_prefix . 'capabilities', null, true ); // delete all 654 } 655 656 /** 657 * Set blog defaults. 658 * 659 * This function creates a row in the wp_blogs table. 660 * 661 * @since MU (3.0.0) 662 * @deprecated MU 663 * @deprecated Use wp_install_defaults() 664 * 665 * @global wpdb $wpdb WordPress database abstraction object. 666 * 667 * @param int $blog_id Ignored in this function. 668 * @param int $user_id 669 */ 670 function install_blog_defaults( $blog_id, $user_id ) { 671 global $wpdb; 672 673 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); 674 675 $suppress = $wpdb->suppress_errors(); 676 677 wp_install_defaults( $user_id ); 678 679 $wpdb->suppress_errors( $suppress ); 680 } -
src/wp-includes/ms-functions.php
1269 1269 function wpmu_create_blog( $domain, $path, $title, $user_id, $meta = array(), $network_id = 1 ) { 1270 1270 $defaults = array( 1271 1271 'public' => 0, 1272 'WPLANG' => get_network_option( $network_id, 'WPLANG' ),1273 1272 ); 1274 1273 $meta = wp_parse_args( $meta, $defaults ); 1275 1274 … … 1299 1298 ) 1300 1299 ); 1301 1300 1302 $ meta = array_diff_key( $meta, array_flip( $site_data_whitelist ) );1303 1304 remove_action( 'update_blog_public', 'wp_update_blog_public_option_on_site_update', 1 );1305 $blog_id = wp_insert_site( $site_data );1306 add_action( 'update_blog_public', 'wp_update_blog_public_option_on_site_update', 1, 2);1301 $blog_id = wp_insert_site( array_merge( $site_data, array( 1302 'title' => $title, 1303 'user_id' => $user_id, 1304 'options' => array_diff_key( $meta, array_flip( $site_data_whitelist ) ), 1305 ) ) ); 1307 1306 1308 1307 if ( is_wp_error( $blog_id ) ) { 1309 1308 return $blog_id; 1310 1309 } 1311 1310 1312 switch_to_blog( $blog_id );1313 install_blog( $blog_id, $title );1314 wp_install_defaults( $user_id );1315 1316 add_user_to_blog( $blog_id, $user_id, 'administrator' );1317 1318 foreach ( $meta as $key => $value ) {1319 update_option( $key, $value );1320 }1321 1322 update_option( 'blog_public', (int) $site_data['public'] );1323 1324 if ( ! is_super_admin( $user_id ) && ! get_user_meta( $user_id, 'primary_blog', true ) ) {1325 update_user_meta( $user_id, 'primary_blog', $blog_id );1326 }1327 1328 restore_current_blog();1329 1330 1311 $site = get_site( $blog_id ); 1331 1312 1332 1313 /** … … 1495 1476 } 1496 1477 1497 1478 /** 1498 * Install an empty blog.1499 *1500 * Creates the new blog tables and options. If calling this function1501 * directly, be sure to use switch_to_blog() first, so that $wpdb1502 * points to the new blog.1503 *1504 * @since MU (3.0.0)1505 *1506 * @global wpdb $wpdb1507 * @global WP_Roles $wp_roles1508 *1509 * @param int $blog_id The value returned by wp_insert_site().1510 * @param string $blog_title The title of the new site.1511 */1512 function install_blog( $blog_id, $blog_title = '' ) {1513 global $wpdb, $wp_roles;1514 1515 // Cast for security1516 $blog_id = (int) $blog_id;1517 1518 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );1519 1520 $suppress = $wpdb->suppress_errors();1521 if ( $wpdb->get_results( "DESCRIBE {$wpdb->posts}" ) ) {1522 die( '<h1>' . __( 'Already Installed' ) . '</h1><p>' . __( 'You appear to have already installed WordPress. To reinstall please clear your old database tables first.' ) . '</p></body></html>' );1523 }1524 $wpdb->suppress_errors( $suppress );1525 1526 $url = get_blogaddress_by_id( $blog_id );1527 1528 // Set everything up1529 make_db_current_silent( 'blog' );1530 populate_options();1531 populate_roles();1532 1533 // populate_roles() clears previous role definitions so we start over.1534 $wp_roles = new WP_Roles();1535 1536 $siteurl = $home = untrailingslashit( $url );1537 1538 if ( ! is_subdomain_install() ) {1539 1540 if ( 'https' === parse_url( get_site_option( 'siteurl' ), PHP_URL_SCHEME ) ) {1541 $siteurl = set_url_scheme( $siteurl, 'https' );1542 }1543 if ( 'https' === parse_url( get_home_url( get_network()->site_id ), PHP_URL_SCHEME ) ) {1544 $home = set_url_scheme( $home, 'https' );1545 }1546 }1547 1548 update_option( 'siteurl', $siteurl );1549 update_option( 'home', $home );1550 1551 if ( get_site_option( 'ms_files_rewriting' ) ) {1552 update_option( 'upload_path', UPLOADBLOGSDIR . "/$blog_id/files" );1553 } else {1554 update_option( 'upload_path', get_blog_option( get_network()->site_id, 'upload_path' ) );1555 }1556 1557 update_option( 'blogname', wp_unslash( $blog_title ) );1558 update_option( 'admin_email', '' );1559 1560 // remove all perms1561 $table_prefix = $wpdb->get_blog_prefix();1562 delete_metadata( 'user', 0, $table_prefix . 'user_level', null, true ); // delete all1563 delete_metadata( 'user', 0, $table_prefix . 'capabilities', null, true ); // delete all1564 }1565 1566 /**1567 * Set blog defaults.1568 *1569 * This function creates a row in the wp_blogs table.1570 *1571 * @since MU (3.0.0)1572 * @deprecated MU1573 * @deprecated Use wp_install_defaults()1574 *1575 * @global wpdb $wpdb WordPress database abstraction object.1576 *1577 * @param int $blog_id Ignored in this function.1578 * @param int $user_id1579 */1580 function install_blog_defaults( $blog_id, $user_id ) {1581 global $wpdb;1582 1583 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );1584 1585 $suppress = $wpdb->suppress_errors();1586 1587 wp_install_defaults( $user_id );1588 1589 $wpdb->suppress_errors( $suppress );1590 }1591 1592 /**1593 1479 * Notify a user that their blog activation has been successful. 1594 1480 * 1595 1481 * Filter {@see 'wpmu_welcome_notification'} to disable or bypass.