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

Create a site.

Description Description

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 installs, $domain is the same as the main site’s domain, and the path is the subdirectory name (eg ‘example.com’ and ‘/blog1/’). On subdomain installs, $domain is the new subdomain + root domain (eg ‘blog1.example.com’), and $path is ‘/’.

Parameters Parameters


(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) Used to set initial site options.

Default value: array()


(int) (Optional) Only relevant on multi-network installs.

Default value: 1

Top ↑

Return Return

(int|WP_Error) Returns WP_Error object on failure, int $blog_id on success

Top ↑

Source Source

File: wp-includes/ms-functions.php

function wpmu_create_blog( $domain, $path, $title, $user_id, $meta = array(), $site_id = 1 ) {
	$defaults = array(
		'public' => 0,
		'WPLANG' => get_site_option( '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, $site_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, $site_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 MU
	 * @param int    $blog_id Blog ID.
	 * @param int    $user_id User ID.
	 * @param string $domain  Site domain.
	 * @param string $path    Site path.
	 * @param int    $site_id Site ID. Only relevant on multi-network installs.
	 * @param array  $meta    Meta data. Used to set initial site options.
	do_action( 'wpmu_new_blog', $blog_id, $user_id, $domain, $path, $site_id, $meta );

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

	return $blog_id;

Top ↑

Changelog Changelog

Version Description
MU Introduced.

Top ↑

User Contributed Notes User Contributed Notes

You must log in before being able to contribute a note or feedback.