diff --git a/src/wp-includes/ms-site.php b/src/wp-includes/ms-site.php index ddc71380b3..b7a14c47f8 100644 --- a/src/wp-includes/ms-site.php +++ b/src/wp-includes/ms-site.php @@ -52,18 +52,12 @@ function wp_insert_site( array $data ) { 'lang_id' => 0, ); - // Extract the passed arguments that may be relevant for site initialization. - $args = array_diff_key( $data, $defaults ); - if ( isset( $args['site_id'] ) ) { - unset( $args['site_id'] ); + $prepared_data = wp_prepare_site_data( $data, $defaults ); + if ( is_wp_error( $prepared_data ) ) { + return $prepared_data; } - $data = wp_prepare_site_data( $data, $defaults ); - if ( is_wp_error( $data ) ) { - return $data; - } - - if ( false === $wpdb->insert( $wpdb->blogs, $data ) ) { + if ( false === $wpdb->insert( $wpdb->blogs, $prepared_data ) ) { return new WP_Error( 'db_insert_error', __( 'Could not insert site into the database.' ), $wpdb->last_error ); } @@ -84,6 +78,12 @@ function wp_insert_site( array $data ) { */ do_action( 'wp_insert_site', $new_site ); + // Extract the passed arguments that may be relevant for site initialization. + $args = array_diff_key( $data, $defaults ); + if ( isset( $args['site_id'] ) ) { + unset( $args['site_id'] ); + } + /** * Fires when a site's initialization routine should be executed. * @@ -99,6 +99,16 @@ function wp_insert_site( array $data ) { $user_id = ! empty( $args['user_id'] ) ? $args['user_id'] : 0; $meta = ! empty( $args['options'] ) ? $args['options'] : array(); + // WPLANG was passed with `$meta` to the `wpmu_new_blog` hook prior to 5.1.0. + if ( ! array_key_exists( 'WPLANG', $meta ) ) { + $meta['WPLANG'] = get_network_option( $new_site->network_id, 'WPLANG' ); + } + + // Rebuild the data expected by the `wpmu_new_blog` hook prior to 5.1.0 using whitelisted keys. + // The `$site_data_whitelist` matches the one used in `wpmu_create_blog()`. + $site_data_whitelist = array( 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id' ); + $meta = array_merge( array_intersect_key( $data, array_flip( $site_data_whitelist ) ), $meta ); + /** * Fires immediately after a new site is created. * diff --git a/tests/phpunit/tests/multisite/site.php b/tests/phpunit/tests/multisite/site.php index 5397e85dcf..ff785c0a0a 100644 --- a/tests/phpunit/tests/multisite/site.php +++ b/tests/phpunit/tests/multisite/site.php @@ -12,6 +12,7 @@ if ( is_multisite() ) : protected $suppress = false; protected $site_status_hooks = array(); protected $wp_initialize_site_args = array(); + protected $wp_initialize_site_meta = array(); protected static $network_ids; protected static $site_ids; protected static $uninitialized_site_id; @@ -2348,6 +2349,84 @@ if ( is_multisite() ) : // Set siteurl update_option( 'siteurl', 'http://testsite1.example.org/test' ); } + + /** + * Tests whether all expected meta are provided in deprecated `wpmu_new_blog` action. + * + * @dataProvider data_wpmu_new_blog_action_backward_commpatible + * + * @ticket 46351 + */ + public function test_wpmu_new_blog_action_backward_compatible( $meta, $expected_meta ) { + // We are testing deprecated hook. Register it to expected deprecated notices. + $this->setExpectedDeprecated( 'wpmu_new_blog' ); + add_action( 'wpmu_new_blog', array( $this, 'wpmu_new_blog_callback' ), 10, 6 ); + + wpmu_create_blog( 'testsite1.example.org', '/new-blog/', 'New Blog', get_current_user_id(), $meta, 1 ); + + $this->assertEquals( $expected_meta, $this->wp_initialize_site_meta ); + + $this->wp_initialize_site_meta = array(); + } + + /** + * Capture the $meta value passed to the wpmu_new_blog action and compare it. + */ + public function wpmu_new_blog_callback( $blog_id, $user_id, $domain, $path, $network_id, $meta ) { + $this->wp_initialize_site_meta = $meta; + } + + public function data_wpmu_new_blog_action_backward_commpatible() { + return array( + 'default values' => array( + array( + ), + array( + 'public' => 0, // `public` is one of the defaults metas in `wpmu_create_blog' function prior WordPress 5.1.0 + 'WPLANG' => 'en_US', // WPLANG is another default meta in `wpmu_create_blog` function prior WordPress 5.1.0. + ), + ), + 'public site' => array( + array( + 'public' => 1, + ), + array( + 'public' => 1, + 'WPLANG' => 'en_US' + ), + ), + 'all whitelisted' => array( + array( + 'public' => -1, + 'archived' => 0, + 'mature' => 0, + 'spam' => 0, + 'deleted' => 0, + 'lang_id' => 11, + + ), + array( + 'public' => -1, + 'WPLANG' => 'en_US', + 'archived' => 0, + 'mature' => 0, + 'spam' => 0, + 'deleted' => 0, + 'lang_id' => 11, + ), + ), + 'extra meta key' => array( + array( + 'foo' => 'bar', + ), + array( + 'public' => 0, + 'WPLANG' => 'en_US', + 'foo' => 'bar', + ), + ), + ); + } } endif;