From 46e5c6c91b3d75896427eb8781e18d715ec051bf Mon Sep 17 00:00:00 2001 From: Felix Arntz Date: Wed, 5 Sep 2018 11:01:36 +0000 Subject: [PATCH] Upgrade/Install: Introduce `populate_site_meta()`. Fixes #44896. See #41333. git-svn-id: https://develop.svn.wordpress.org/trunk@43629 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/schema.php | 39 ++++++++++++ tests/phpunit/tests/admin/includesSchema.php | 64 ++++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/src/wp-admin/includes/schema.php b/src/wp-admin/includes/schema.php index f3434054f3..ade21db4a9 100644 --- a/src/wp-admin/includes/schema.php +++ b/src/wp-admin/includes/schema.php @@ -1292,3 +1292,42 @@ We hope you enjoy your new site. Thanks! } $wpdb->query( "INSERT INTO $wpdb->sitemeta ( site_id, meta_key, meta_value ) VALUES " . $insert ); // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared } + +/** + * Creates WordPress site meta and sets the default values. + * + * @since 5.0.0 + * + * @global wpdb $wpdb WordPress database abstraction object. + * + * @param int $site_id Site ID to populate meta for. + * @param array $meta Optional. Custom meta $key => $value pairs to use. Default empty array. + */ +function populate_site_meta( $site_id, array $meta = array() ) { + global $wpdb; + + $site_id = (int) $site_id; + + if ( ! is_site_meta_supported() ) { + return; + } + + if ( empty( $meta ) ) { + return; + } + + $insert = ''; + foreach ( $meta as $meta_key => $meta_value ) { + if ( is_array( $meta_value ) ) { + $meta_value = serialize( $meta_value ); + } + if ( ! empty( $insert ) ) { + $insert .= ', '; + } + $insert .= $wpdb->prepare( '( %d, %s, %s)', $site_id, $meta_key, $meta_value ); + } + + $wpdb->query( "INSERT INTO $wpdb->blogmeta ( blog_id, meta_key, meta_value ) VALUES " . $insert ); // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared + + wp_cache_set( 'last_changed', microtime(), 'sites' ); +} diff --git a/tests/phpunit/tests/admin/includesSchema.php b/tests/phpunit/tests/admin/includesSchema.php index 1541bf7431..35bed60c83 100644 --- a/tests/phpunit/tests/admin/includesSchema.php +++ b/tests/phpunit/tests/admin/includesSchema.php @@ -7,6 +7,7 @@ class Tests_Admin_Includes_Schema extends WP_UnitTestCase { private static $options; + private static $blogmeta; private static $sitemeta; /** @@ -16,9 +17,11 @@ class Tests_Admin_Includes_Schema extends WP_UnitTestCase { global $wpdb; self::$options = 'testprefix_options'; + self::$blogmeta = 'testprefix_blogmeta'; self::$sitemeta = 'testprefix_sitemeta'; $options = self::$options; + $blogmeta = self::$blogmeta; $sitemeta = self::$sitemeta; require_once( ABSPATH . 'wp-admin/includes/schema.php' ); @@ -38,6 +41,19 @@ class Tests_Admin_Includes_Schema extends WP_UnitTestCase { ) {$charset_collate} " ); + $wpdb->query( + " + CREATE TABLE {$blogmeta} ( + meta_id bigint(20) unsigned NOT NULL auto_increment, + blog_id bigint(20) unsigned NOT NULL default '0', + meta_key varchar(255) default NULL, + meta_value longtext, + PRIMARY KEY (meta_id), + KEY meta_key (meta_key({$max_index_length})), + KEY blog_id (blog_id) + ) {$charset_collate} + " + ); $wpdb->query( " CREATE TABLE {$sitemeta} ( @@ -60,9 +76,11 @@ class Tests_Admin_Includes_Schema extends WP_UnitTestCase { global $wpdb; $options = self::$options; + $blogmeta = self::$blogmeta; $sitemeta = self::$sitemeta; $wpdb->query( "DROP TABLE IF EXISTS {$options}" ); + $wpdb->query( "DROP TABLE IF EXISTS {$blogmeta}" ); $wpdb->query( "DROP TABLE IF EXISTS {$sitemeta}" ); } @@ -156,8 +174,54 @@ class Tests_Admin_Includes_Schema extends WP_UnitTestCase { ); } + /** + * @ticket 44896 + * @group multisite + * @group ms-required + * @dataProvider data_populate_site_meta + */ + function test_populate_site_meta( $meta, $expected ) { + global $wpdb; + + $orig_blogmeta = $wpdb->blogmeta; + $wpdb->blogmeta = self::$blogmeta; + + populate_site_meta( 42, $meta ); + + $results = array(); + foreach ( $expected as $meta_key => $value ) { + $results[ $meta_key ] = get_site_meta( 42, $meta_key, true ); + } + + $wpdb->query( "TRUNCATE TABLE {$wpdb->blogmeta}" ); + + $wpdb->blogmeta = $orig_blogmeta; + + $this->assertEquals( $expected, $results ); + } + + public function data_populate_site_meta() { + return array( + array( + array(), + array( + 'unknown_value' => '', + ), + ), + array( + array( + 'custom_meta' => '1', + ), + array( + 'custom_meta' => '1', + ), + ), + ); + } + /** * @ticket 44895 + * @group multisite * @dataProvider data_populate_network_meta */ function test_populate_network_meta( $meta, $expected ) {