Index: src/wp-admin/includes/schema.php
===================================================================
--- src/wp-admin/includes/schema.php	(revision 43628)
+++ src/wp-admin/includes/schema.php	(working copy)
@@ -1292,3 +1292,42 @@
 	}
 	$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' );
+}
Index: tests/phpunit/tests/admin/includesSchema.php
===================================================================
--- tests/phpunit/tests/admin/includesSchema.php	(revision 43628)
+++ tests/phpunit/tests/admin/includesSchema.php	(working copy)
@@ -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 @@
 		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' );
@@ -40,6 +43,19 @@
 		);
 		$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} (
 				meta_id bigint(20) unsigned NOT NULL auto_increment,
 				site_id bigint(20) unsigned NOT NULL default '0',
@@ -60,9 +76,11 @@
 		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}" );
 	}
 
@@ -157,7 +175,53 @@
 	}
 
 	/**
+	 * @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 ) {
