wp_initialize_site()WP 5.1.0

Запускает подготовку нового сайта в WordPress Multisite: создает таблицы базы данных, заполняет стандартные опции, роли, метаданные и начальное содержимое сайта.

Функция используется для инициализации сайта, который уже добавлен в сеть, но еще не подготовлен к работе. Обычно она вызывается не напрямую, а через процесс создания сайта из wp_insert_site().

Во время работы функция переключается на нужный сайт через switch_to_blog(), создает таблицы, задает базовые опции home, siteurl, blogname, blog_public, добавляет стандартные роли, создает начальные записи/страницы и назначает указанного пользователя администратором сайта.

Функция предназначена для Multisite. Если сайт уже был инициализирован, повторный запуск вернет ошибку WP_Error, чтобы не перезаписать уже созданную структуру сайта.

Аргументы инициализации можно изменить через фильтр wp_initialize_site_args. Удобно, когда нужно задать свои опции или метаданные для всех новых сайтов сети.

Хуки из функции

Возвращает

true|WP_Error.

  • true — сайт успешно инициализирован.
  • WP_Error — произошла ошибка: не передан ID сайта, сайт не найден или сайт уже инициализирован.

Использование

wp_initialize_site( $site_id, $args );
$site_id(int|WP_Site) (обязательный)
ID сайта или объект WP_Site{}, который нужно инициализировать.
$args(array)
Аргументы, которые изменяют поведение инициализации.
По умолчанию: []
user_id (int)
ID пользователя, который станет администратором нового сайта.
title (string)
Название сайта. Если не указано, используется строка вида Site %d, где %d — ID сайта.
options (array)
Массив дополнительных опций сайта в формате ключ => значение. Передаются в populate_options() и могут переопределить стандартные опции.
meta (array)
Массив метаданных сайта в формате ключ => значение. Передаются в populate_site_meta().

Примеры

0

#1 Инициализация нового сайта

Пример получает ID уже созданного сайта и запускает для него стандартную инициализацию.

$result = wp_initialize_site( 123, [
	'user_id' => 1,
	'title'   => 'Новый сайт',
] );

if ( is_wp_error( $result ) ) {
	wp_die( $result->get_error_message() );
}
0

#2 Передача своих опций при инициализации

Пример задает название сайта, email администратора и закрывает сайт от индексации через опцию blog_public.

$result = wp_initialize_site( 123, [
	'user_id' => 1,
	'title'   => 'Закрытый сайт',
	'options' => [
		'admin_email' => 'admin@example.com',
		'blog_public' => 0,
	],
] );

if ( is_wp_error( $result ) ) {
	error_log( $result->get_error_message() );
}
0

#3 Добавление своих метаданных сайта

Пример добавляет метаданные, которые будут сохранены для нового сайта во время инициализации.

$result = wp_initialize_site( 123, [
	'user_id' => 1,
	'title'   => 'Сайт клиента',
	'meta'    => [
		'client_id'   => 456,
		'client_type' => 'premium',
	],
] );

if ( true === $result ) {
	// Сайт успешно инициализирован.
}
0

#4 Изменение аргументов через фильтр

Пример автоматически добавляет свои опции для каждого нового сайта перед его инициализацией.

add_filter( 'wp_initialize_site_args', 'my_change_site_initialization_args', 10, 3 );

function my_change_site_initialization_args( $args, $site, $network ) {
	$args['options']['blog_public'] = 0;
	$args['options']['timezone_string'] = 'Europe/Moscow';

	$args['meta']['created_by_custom_flow'] = 1;

	return $args;
}

Заметки

  • Global. wpdb. $wpdb WordPress database abstraction object.
  • Global. WP_Roles. $wp_roles WordPress role management object.

Список изменений

С версии 5.1.0 Введена.

Код wp_initialize_site() WP 7.0.3

function wp_initialize_site( $site_id, array $args = array() ) {
	global $wpdb, $wp_roles;

	if ( empty( $site_id ) ) {
		return new WP_Error( 'site_empty_id', __( 'Site ID must not be empty.' ) );
	}

	$site = get_site( $site_id );
	if ( ! $site ) {
		return new WP_Error( 'site_invalid_id', __( 'Site with the ID does not exist.' ) );
	}

	if ( wp_is_site_initialized( $site ) ) {
		return new WP_Error( 'site_already_initialized', __( 'The site appears to be already initialized.' ) );
	}

	$network = get_network( $site->network_id );
	if ( ! $network ) {
		$network = get_network();
	}

	$args = wp_parse_args(
		$args,
		array(
			'user_id' => 0,
			/* translators: %d: Site ID. */
			'title'   => sprintf( __( 'Site %d' ), $site->id ),
			'options' => array(),
			'meta'    => array(),
		)
	);

	/**
	 * Filters the arguments for initializing a site.
	 *
	 * @since 5.1.0
	 *
	 * @param array      $args    Arguments to modify the initialization behavior.
	 * @param WP_Site    $site    Site that is being initialized.
	 * @param WP_Network $network Network that the site belongs to.
	 */
	$args = apply_filters( 'wp_initialize_site_args', $args, $site, $network );

	$orig_installing = wp_installing();
	if ( ! $orig_installing ) {
		wp_installing( true );
	}

	$switch = false;
	if ( get_current_blog_id() !== $site->id ) {
		$switch = true;
		switch_to_blog( $site->id );
	}

	require_once ABSPATH . 'wp-admin/includes/upgrade.php';

	// Set up the database tables.
	make_db_current_silent( 'blog' );

	$home_scheme    = 'http';
	$siteurl_scheme = 'http';
	if ( ! is_subdomain_install() ) {
		if ( 'https' === parse_url( get_home_url( $network->site_id ), PHP_URL_SCHEME ) ) {
			$home_scheme = 'https';
		}
		if ( 'https' === parse_url( get_network_option( $network->id, 'siteurl' ), PHP_URL_SCHEME ) ) {
			$siteurl_scheme = 'https';
		}
	}

	// Populate the site's options.
	populate_options(
		array_merge(
			array(
				'home'        => untrailingslashit( $home_scheme . '://' . $site->domain . $site->path ),
				'siteurl'     => untrailingslashit( $siteurl_scheme . '://' . $site->domain . $site->path ),
				'blogname'    => wp_unslash( $args['title'] ),
				'admin_email' => '',
				'upload_path' => get_network_option( $network->id, 'ms_files_rewriting' ) ? UPLOADBLOGSDIR . "/{$site->id}/files" : get_blog_option( $network->site_id, 'upload_path' ),
				'blog_public' => (int) $site->public,
				'WPLANG'      => get_network_option( $network->id, 'WPLANG' ),
			),
			$args['options']
		)
	);

	// Clean blog cache after populating options.
	clean_blog_cache( $site );

	// Populate the site's roles.
	populate_roles();
	$wp_roles = new WP_Roles();

	// Populate metadata for the site.
	populate_site_meta( $site->id, $args['meta'] );

	// Remove all permissions that may exist for the site.
	$table_prefix = $wpdb->get_blog_prefix();
	delete_metadata( 'user', 0, $table_prefix . 'user_level', null, true );   // Delete all.
	delete_metadata( 'user', 0, $table_prefix . 'capabilities', null, true ); // Delete all.

	// Install default site content.
	wp_install_defaults( $args['user_id'] );

	// Set the site administrator.
	add_user_to_blog( $site->id, $args['user_id'], 'administrator' );
	if ( ! user_can( $args['user_id'], 'manage_network' ) && ! get_user_meta( $args['user_id'], 'primary_blog', true ) ) {
		update_user_meta( $args['user_id'], 'primary_blog', $site->id );
	}

	if ( $switch ) {
		restore_current_blog();
	}

	wp_installing( $orig_installing );

	return true;
}