wpmu_create_blog( string $domain, string $path, string $title, int $user_id, array $meta = array(), int $network_id = 1 )

Create a site.


This function runs when a user self-registers a new site as well as when a Super Admin creates a new site. Hook to ‘wpmu_new_blog’ for events that should affect all new sites.

On subdirectory installations, $domain is the same as the main site’s domain, and the path is the subdirectory name (eg ‘example.com’ and ‘/blog1/’). On subdomain installations, $domain is the new subdomain + root domain (eg ‘blog1.example.com’), and $path is ‘/’.



(string) (Required) The new site's domain.


(string) (Required) The new site's path.


(string) (Required) The new site's title.


(int) (Required) The user ID of the new site's admin.


(array) (Optional) Array of key=>value pairs used to set initial site options. If valid status keys are included ('public', 'archived', 'mature', 'spam', 'deleted', or 'lang_id') the given site status(es) will be updated. Otherwise, keys and values will be used to set options for the new site.

Default value: array()


(int) (Optional) Network ID. Only relevant on multi-network installations.

Default value: 1


(int|WP_Error) Returns WP_Error object on failure, the new site ID on success.


File: wp-includes/ms-functions.php

function wpmu_create_blog( $domain, $path, $title, $user_id, $meta = array(), $network_id = 1 ) {
	$defaults = array(
		'public' => 0,
		'WPLANG' => get_network_option( $network_id, 'WPLANG' ),
	$meta = wp_parse_args( $meta, $defaults );

	$domain = preg_replace( '/\s+/', '', sanitize_user( $domain, true ) );

	if ( is_subdomain_install() )
		$domain = str_replace( '@', '', $domain );

	$title = strip_tags( $title );
	$user_id = (int) $user_id;

	if ( empty($path) )
		$path = '/';

	// Check if the domain has been used already. We should return an error message.
	if ( domain_exists($domain, $path, $network_id) )
		return new WP_Error( 'blog_taken', __( 'Sorry, that site already exists!' ) );

	if ( ! wp_installing() ) {
		wp_installing( true );

	if ( ! $blog_id = insert_blog($domain, $path, $network_id) )
		return new WP_Error('insert_blog', __('Could not create site.'));

	install_blog($blog_id, $title);

	add_user_to_blog($blog_id, $user_id, 'administrator');

	foreach ( $meta as $key => $value ) {
		if ( in_array( $key, array( 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id' ) ) )
			update_blog_status( $blog_id, $key, $value );
			update_option( $key, $value );

	update_option( 'blog_public', (int) $meta['public'] );

	if ( ! is_super_admin( $user_id ) && ! get_user_meta( $user_id, 'primary_blog', true ) )
		update_user_meta( $user_id, 'primary_blog', $blog_id );

	 * Fires immediately after a new site is created.
	 * @since WP-MU (3.0.0)
	 * @param int    $blog_id    Site ID.
	 * @param int    $user_id    User ID.
	 * @param string $domain     Site domain.
	 * @param string $path       Site path.
	 * @param int    $network_id Network ID. Only relevant on multi-network installations.
	 * @param array  $meta       Meta data. Used to set initial site options.
	do_action( 'wpmu_new_blog', $blog_id, $user_id, $domain, $path, $network_id, $meta );

	wp_cache_set( 'last_changed', microtime(), 'sites' );

	return $blog_id;


Version Description
WP-MU Introduced. (3.0.0)